import abc
import builtins
import datetime
import enum
import typing

import jsii
import publication
import typing_extensions

from ._jsii import *

import cdktf
import constructs


class AdvancedThreatProtection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AdvancedThreatProtection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        enabled: builtins.bool,
        target_resource_id: builtins.str,
        timeouts: typing.Optional["AdvancedThreatProtectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param enabled: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AdvancedThreatProtectionConfig(
            enabled=enabled,
            target_resource_id=target_resource_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AdvancedThreatProtection, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> builtins.bool:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AdvancedThreatProtectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AdvancedThreatProtectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AdvancedThreatProtectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AdvancedThreatProtectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "enabled": "enabled",
        "target_resource_id": "targetResourceId",
        "timeouts": "timeouts",
    },
)
class AdvancedThreatProtectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        enabled: builtins.bool,
        target_resource_id: builtins.str,
        timeouts: typing.Optional["AdvancedThreatProtectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param enabled: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AdvancedThreatProtectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "target_resource_id": target_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def target_resource_id(self) -> builtins.str:
        result = self._values.get("target_resource_id")
        assert result is not None, "Required property 'target_resource_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AdvancedThreatProtectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AdvancedThreatProtectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AdvancedThreatProtectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AdvancedThreatProtectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AdvancedThreatProtectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AnalysisServicesServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AnalysisServicesServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        admin_users: typing.Optional[typing.List[builtins.str]] = None,
        backup_blob_container_uri: typing.Optional[builtins.str] = None,
        enable_power_bi_service: typing.Optional[builtins.bool] = None,
        ipv4_firewall_rule: typing.Optional[typing.List["AnalysisServicesServerIpv4FirewallRule"]] = None,
        querypool_connection_mode: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AnalysisServicesServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param admin_users: -
        :param backup_blob_container_uri: -
        :param enable_power_bi_service: -
        :param ipv4_firewall_rule: ipv4_firewall_rule block.
        :param querypool_connection_mode: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AnalysisServicesServerConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            admin_users=admin_users,
            backup_blob_container_uri=backup_blob_container_uri,
            enable_power_bi_service=enable_power_bi_service,
            ipv4_firewall_rule=ipv4_firewall_rule,
            querypool_connection_mode=querypool_connection_mode,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AnalysisServicesServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdminUsers")
    def reset_admin_users(self) -> None:
        return jsii.invoke(self, "resetAdminUsers", [])

    @jsii.member(jsii_name="resetBackupBlobContainerUri")
    def reset_backup_blob_container_uri(self) -> None:
        return jsii.invoke(self, "resetBackupBlobContainerUri", [])

    @jsii.member(jsii_name="resetEnablePowerBiService")
    def reset_enable_power_bi_service(self) -> None:
        return jsii.invoke(self, "resetEnablePowerBiService", [])

    @jsii.member(jsii_name="resetIpv4FirewallRule")
    def reset_ipv4_firewall_rule(self) -> None:
        return jsii.invoke(self, "resetIpv4FirewallRule", [])

    @jsii.member(jsii_name="resetQuerypoolConnectionMode")
    def reset_querypool_connection_mode(self) -> None:
        return jsii.invoke(self, "resetQuerypoolConnectionMode", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverFullName")
    def server_full_name(self) -> builtins.str:
        return jsii.get(self, "serverFullName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsersInput")
    def admin_users_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "adminUsersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupBlobContainerUriInput")
    def backup_blob_container_uri_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "backupBlobContainerUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePowerBiServiceInput")
    def enable_power_bi_service_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enablePowerBiServiceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipv4FirewallRuleInput")
    def ipv4_firewall_rule_input(
        self,
    ) -> typing.Optional[typing.List["AnalysisServicesServerIpv4FirewallRule"]]:
        return jsii.get(self, "ipv4FirewallRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="querypoolConnectionModeInput")
    def querypool_connection_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "querypoolConnectionModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AnalysisServicesServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsers")
    def admin_users(self) -> typing.List[builtins.str]:
        return jsii.get(self, "adminUsers")

    @admin_users.setter # type: ignore
    def admin_users(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "adminUsers", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupBlobContainerUri")
    def backup_blob_container_uri(self) -> builtins.str:
        return jsii.get(self, "backupBlobContainerUri")

    @backup_blob_container_uri.setter # type: ignore
    def backup_blob_container_uri(self, value: builtins.str) -> None:
        jsii.set(self, "backupBlobContainerUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePowerBiService")
    def enable_power_bi_service(self) -> builtins.bool:
        return jsii.get(self, "enablePowerBiService")

    @enable_power_bi_service.setter # type: ignore
    def enable_power_bi_service(self, value: builtins.bool) -> None:
        jsii.set(self, "enablePowerBiService", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipv4FirewallRule")
    def ipv4_firewall_rule(
        self,
    ) -> typing.List["AnalysisServicesServerIpv4FirewallRule"]:
        return jsii.get(self, "ipv4FirewallRule")

    @ipv4_firewall_rule.setter # type: ignore
    def ipv4_firewall_rule(
        self,
        value: typing.List["AnalysisServicesServerIpv4FirewallRule"],
    ) -> None:
        jsii.set(self, "ipv4FirewallRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="querypoolConnectionMode")
    def querypool_connection_mode(self) -> builtins.str:
        return jsii.get(self, "querypoolConnectionMode")

    @querypool_connection_mode.setter # type: ignore
    def querypool_connection_mode(self, value: builtins.str) -> None:
        jsii.set(self, "querypoolConnectionMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AnalysisServicesServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AnalysisServicesServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AnalysisServicesServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "admin_users": "adminUsers",
        "backup_blob_container_uri": "backupBlobContainerUri",
        "enable_power_bi_service": "enablePowerBiService",
        "ipv4_firewall_rule": "ipv4FirewallRule",
        "querypool_connection_mode": "querypoolConnectionMode",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AnalysisServicesServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        admin_users: typing.Optional[typing.List[builtins.str]] = None,
        backup_blob_container_uri: typing.Optional[builtins.str] = None,
        enable_power_bi_service: typing.Optional[builtins.bool] = None,
        ipv4_firewall_rule: typing.Optional[typing.List["AnalysisServicesServerIpv4FirewallRule"]] = None,
        querypool_connection_mode: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AnalysisServicesServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param admin_users: -
        :param backup_blob_container_uri: -
        :param enable_power_bi_service: -
        :param ipv4_firewall_rule: ipv4_firewall_rule block.
        :param querypool_connection_mode: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AnalysisServicesServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if admin_users is not None:
            self._values["admin_users"] = admin_users
        if backup_blob_container_uri is not None:
            self._values["backup_blob_container_uri"] = backup_blob_container_uri
        if enable_power_bi_service is not None:
            self._values["enable_power_bi_service"] = enable_power_bi_service
        if ipv4_firewall_rule is not None:
            self._values["ipv4_firewall_rule"] = ipv4_firewall_rule
        if querypool_connection_mode is not None:
            self._values["querypool_connection_mode"] = querypool_connection_mode
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def admin_users(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("admin_users")
        return result

    @builtins.property
    def backup_blob_container_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("backup_blob_container_uri")
        return result

    @builtins.property
    def enable_power_bi_service(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_power_bi_service")
        return result

    @builtins.property
    def ipv4_firewall_rule(
        self,
    ) -> typing.Optional[typing.List["AnalysisServicesServerIpv4FirewallRule"]]:
        """ipv4_firewall_rule block."""
        result = self._values.get("ipv4_firewall_rule")
        return result

    @builtins.property
    def querypool_connection_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("querypool_connection_mode")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AnalysisServicesServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AnalysisServicesServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AnalysisServicesServerIpv4FirewallRule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "range_end": "rangeEnd",
        "range_start": "rangeStart",
    },
)
class AnalysisServicesServerIpv4FirewallRule:
    def __init__(
        self,
        *,
        name: builtins.str,
        range_end: builtins.str,
        range_start: builtins.str,
    ) -> None:
        """
        :param name: -
        :param range_end: -
        :param range_start: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "range_end": range_end,
            "range_start": range_start,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def range_end(self) -> builtins.str:
        result = self._values.get("range_end")
        assert result is not None, "Required property 'range_end' is missing"
        return result

    @builtins.property
    def range_start(self) -> builtins.str:
        result = self._values.get("range_start")
        assert result is not None, "Required property 'range_start' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AnalysisServicesServerIpv4FirewallRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AnalysisServicesServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AnalysisServicesServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AnalysisServicesServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagement(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagement",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        publisher_email: builtins.str,
        publisher_name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        additional_location: typing.Optional[typing.List["ApiManagementAdditionalLocation"]] = None,
        certificate: typing.Optional[typing.List["ApiManagementCertificate"]] = None,
        hostname_configuration: typing.Optional[typing.List["ApiManagementHostnameConfiguration"]] = None,
        identity: typing.Optional[typing.List["ApiManagementIdentity"]] = None,
        notification_sender_email: typing.Optional[builtins.str] = None,
        policy: typing.Optional[typing.List["ApiManagementPolicy"]] = None,
        protocols: typing.Optional[typing.List["ApiManagementProtocols"]] = None,
        security: typing.Optional[typing.List["ApiManagementSecurity"]] = None,
        sign_in: typing.Optional[typing.List["ApiManagementSignIn"]] = None,
        sign_up: typing.Optional[typing.List["ApiManagementSignUp"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApiManagementTimeouts"] = None,
        virtual_network_configuration: typing.Optional[typing.List["ApiManagementVirtualNetworkConfiguration"]] = None,
        virtual_network_type: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param publisher_email: -
        :param publisher_name: -
        :param resource_group_name: -
        :param sku_name: -
        :param additional_location: additional_location block.
        :param certificate: certificate block.
        :param hostname_configuration: hostname_configuration block.
        :param identity: identity block.
        :param notification_sender_email: -
        :param policy: -
        :param protocols: protocols block.
        :param security: security block.
        :param sign_in: sign_in block.
        :param sign_up: sign_up block.
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_network_configuration: virtual_network_configuration block.
        :param virtual_network_type: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementConfig(
            location=location,
            name=name,
            publisher_email=publisher_email,
            publisher_name=publisher_name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            additional_location=additional_location,
            certificate=certificate,
            hostname_configuration=hostname_configuration,
            identity=identity,
            notification_sender_email=notification_sender_email,
            policy=policy,
            protocols=protocols,
            security=security,
            sign_in=sign_in,
            sign_up=sign_up,
            tags=tags,
            timeouts=timeouts,
            virtual_network_configuration=virtual_network_configuration,
            virtual_network_type=virtual_network_type,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagement, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalLocation")
    def reset_additional_location(self) -> None:
        return jsii.invoke(self, "resetAdditionalLocation", [])

    @jsii.member(jsii_name="resetCertificate")
    def reset_certificate(self) -> None:
        return jsii.invoke(self, "resetCertificate", [])

    @jsii.member(jsii_name="resetHostnameConfiguration")
    def reset_hostname_configuration(self) -> None:
        return jsii.invoke(self, "resetHostnameConfiguration", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetNotificationSenderEmail")
    def reset_notification_sender_email(self) -> None:
        return jsii.invoke(self, "resetNotificationSenderEmail", [])

    @jsii.member(jsii_name="resetPolicy")
    def reset_policy(self) -> None:
        return jsii.invoke(self, "resetPolicy", [])

    @jsii.member(jsii_name="resetProtocols")
    def reset_protocols(self) -> None:
        return jsii.invoke(self, "resetProtocols", [])

    @jsii.member(jsii_name="resetSecurity")
    def reset_security(self) -> None:
        return jsii.invoke(self, "resetSecurity", [])

    @jsii.member(jsii_name="resetSignIn")
    def reset_sign_in(self) -> None:
        return jsii.invoke(self, "resetSignIn", [])

    @jsii.member(jsii_name="resetSignUp")
    def reset_sign_up(self) -> None:
        return jsii.invoke(self, "resetSignUp", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVirtualNetworkConfiguration")
    def reset_virtual_network_configuration(self) -> None:
        return jsii.invoke(self, "resetVirtualNetworkConfiguration", [])

    @jsii.member(jsii_name="resetVirtualNetworkType")
    def reset_virtual_network_type(self) -> None:
        return jsii.invoke(self, "resetVirtualNetworkType", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerPortalUrl")
    def developer_portal_url(self) -> builtins.str:
        return jsii.get(self, "developerPortalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayRegionalUrl")
    def gateway_regional_url(self) -> builtins.str:
        return jsii.get(self, "gatewayRegionalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayUrl")
    def gateway_url(self) -> builtins.str:
        return jsii.get(self, "gatewayUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementApiUrl")
    def management_api_url(self) -> builtins.str:
        return jsii.get(self, "managementApiUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portalUrl")
    def portal_url(self) -> builtins.str:
        return jsii.get(self, "portalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddresses")
    def public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherEmailInput")
    def publisher_email_input(self) -> builtins.str:
        return jsii.get(self, "publisherEmailInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherNameInput")
    def publisher_name_input(self) -> builtins.str:
        return jsii.get(self, "publisherNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmUrl")
    def scm_url(self) -> builtins.str:
        return jsii.get(self, "scmUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalLocationInput")
    def additional_location_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementAdditionalLocation"]]:
        return jsii.get(self, "additionalLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateInput")
    def certificate_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementCertificate"]]:
        return jsii.get(self, "certificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostnameConfigurationInput")
    def hostname_configuration_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementHostnameConfiguration"]]:
        return jsii.get(self, "hostnameConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["ApiManagementIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationSenderEmailInput")
    def notification_sender_email_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "notificationSenderEmailInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyInput")
    def policy_input(self) -> typing.Optional[typing.List["ApiManagementPolicy"]]:
        return jsii.get(self, "policyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolsInput")
    def protocols_input(self) -> typing.Optional[typing.List["ApiManagementProtocols"]]:
        return jsii.get(self, "protocolsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="securityInput")
    def security_input(self) -> typing.Optional[typing.List["ApiManagementSecurity"]]:
        return jsii.get(self, "securityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signInInput")
    def sign_in_input(self) -> typing.Optional[typing.List["ApiManagementSignIn"]]:
        return jsii.get(self, "signInInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signUpInput")
    def sign_up_input(self) -> typing.Optional[typing.List["ApiManagementSignUp"]]:
        return jsii.get(self, "signUpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkConfigurationInput")
    def virtual_network_configuration_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementVirtualNetworkConfiguration"]]:
        return jsii.get(self, "virtualNetworkConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkTypeInput")
    def virtual_network_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "virtualNetworkTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalLocation")
    def additional_location(self) -> typing.List["ApiManagementAdditionalLocation"]:
        return jsii.get(self, "additionalLocation")

    @additional_location.setter # type: ignore
    def additional_location(
        self,
        value: typing.List["ApiManagementAdditionalLocation"],
    ) -> None:
        jsii.set(self, "additionalLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> typing.List["ApiManagementCertificate"]:
        return jsii.get(self, "certificate")

    @certificate.setter # type: ignore
    def certificate(self, value: typing.List["ApiManagementCertificate"]) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostnameConfiguration")
    def hostname_configuration(
        self,
    ) -> typing.List["ApiManagementHostnameConfiguration"]:
        return jsii.get(self, "hostnameConfiguration")

    @hostname_configuration.setter # type: ignore
    def hostname_configuration(
        self,
        value: typing.List["ApiManagementHostnameConfiguration"],
    ) -> None:
        jsii.set(self, "hostnameConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["ApiManagementIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["ApiManagementIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationSenderEmail")
    def notification_sender_email(self) -> builtins.str:
        return jsii.get(self, "notificationSenderEmail")

    @notification_sender_email.setter # type: ignore
    def notification_sender_email(self, value: builtins.str) -> None:
        jsii.set(self, "notificationSenderEmail", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policy")
    def policy(self) -> typing.List["ApiManagementPolicy"]:
        return jsii.get(self, "policy")

    @policy.setter # type: ignore
    def policy(self, value: typing.List["ApiManagementPolicy"]) -> None:
        jsii.set(self, "policy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocols")
    def protocols(self) -> typing.List["ApiManagementProtocols"]:
        return jsii.get(self, "protocols")

    @protocols.setter # type: ignore
    def protocols(self, value: typing.List["ApiManagementProtocols"]) -> None:
        jsii.set(self, "protocols", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherEmail")
    def publisher_email(self) -> builtins.str:
        return jsii.get(self, "publisherEmail")

    @publisher_email.setter # type: ignore
    def publisher_email(self, value: builtins.str) -> None:
        jsii.set(self, "publisherEmail", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherName")
    def publisher_name(self) -> builtins.str:
        return jsii.get(self, "publisherName")

    @publisher_name.setter # type: ignore
    def publisher_name(self, value: builtins.str) -> None:
        jsii.set(self, "publisherName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="security")
    def security(self) -> typing.List["ApiManagementSecurity"]:
        return jsii.get(self, "security")

    @security.setter # type: ignore
    def security(self, value: typing.List["ApiManagementSecurity"]) -> None:
        jsii.set(self, "security", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signIn")
    def sign_in(self) -> typing.List["ApiManagementSignIn"]:
        return jsii.get(self, "signIn")

    @sign_in.setter # type: ignore
    def sign_in(self, value: typing.List["ApiManagementSignIn"]) -> None:
        jsii.set(self, "signIn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signUp")
    def sign_up(self) -> typing.List["ApiManagementSignUp"]:
        return jsii.get(self, "signUp")

    @sign_up.setter # type: ignore
    def sign_up(self, value: typing.List["ApiManagementSignUp"]) -> None:
        jsii.set(self, "signUp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkConfiguration")
    def virtual_network_configuration(
        self,
    ) -> typing.List["ApiManagementVirtualNetworkConfiguration"]:
        return jsii.get(self, "virtualNetworkConfiguration")

    @virtual_network_configuration.setter # type: ignore
    def virtual_network_configuration(
        self,
        value: typing.List["ApiManagementVirtualNetworkConfiguration"],
    ) -> None:
        jsii.set(self, "virtualNetworkConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkType")
    def virtual_network_type(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkType")

    @virtual_network_type.setter # type: ignore
    def virtual_network_type(self, value: builtins.str) -> None:
        jsii.set(self, "virtualNetworkType", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementAdditionalLocation",
    jsii_struct_bases=[],
    name_mapping={
        "location": "location",
        "virtual_network_configuration": "virtualNetworkConfiguration",
    },
)
class ApiManagementAdditionalLocation:
    def __init__(
        self,
        *,
        location: builtins.str,
        virtual_network_configuration: typing.Optional[typing.List["ApiManagementAdditionalLocationVirtualNetworkConfiguration"]] = None,
    ) -> None:
        """
        :param location: -
        :param virtual_network_configuration: virtual_network_configuration block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
        }
        if virtual_network_configuration is not None:
            self._values["virtual_network_configuration"] = virtual_network_configuration

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def virtual_network_configuration(
        self,
    ) -> typing.Optional[typing.List["ApiManagementAdditionalLocationVirtualNetworkConfiguration"]]:
        """virtual_network_configuration block."""
        result = self._values.get("virtual_network_configuration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementAdditionalLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementAdditionalLocationVirtualNetworkConfiguration",
    jsii_struct_bases=[],
    name_mapping={"subnet_id": "subnetId"},
)
class ApiManagementAdditionalLocationVirtualNetworkConfiguration:
    def __init__(self, *, subnet_id: builtins.str) -> None:
        """
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "subnet_id": subnet_id,
        }

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementAdditionalLocationVirtualNetworkConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementApi(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementApi",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        path: builtins.str,
        protocols: typing.List[builtins.str],
        resource_group_name: builtins.str,
        revision: builtins.str,
        description: typing.Optional[builtins.str] = None,
        import_: typing.Optional[typing.List["ApiManagementApiImport"]] = None,
        oauth2_authorization: typing.Optional[typing.List["ApiManagementApiOauth2Authorization"]] = None,
        openid_authentication: typing.Optional[typing.List["ApiManagementApiOpenidAuthentication"]] = None,
        service_url: typing.Optional[builtins.str] = None,
        soap_pass_through: typing.Optional[builtins.bool] = None,
        subscription_key_parameter_names: typing.Optional[typing.List["ApiManagementApiSubscriptionKeyParameterNames"]] = None,
        subscription_required: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementApiTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
        version_set_id: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param path: -
        :param protocols: -
        :param resource_group_name: -
        :param revision: -
        :param description: -
        :param import_: import block.
        :param oauth2_authorization: oauth2_authorization block.
        :param openid_authentication: openid_authentication block.
        :param service_url: -
        :param soap_pass_through: -
        :param subscription_key_parameter_names: subscription_key_parameter_names block.
        :param subscription_required: -
        :param timeouts: timeouts block.
        :param version: -
        :param version_set_id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementApiConfig(
            api_management_name=api_management_name,
            display_name=display_name,
            name=name,
            path=path,
            protocols=protocols,
            resource_group_name=resource_group_name,
            revision=revision,
            description=description,
            import_=import_,
            oauth2_authorization=oauth2_authorization,
            openid_authentication=openid_authentication,
            service_url=service_url,
            soap_pass_through=soap_pass_through,
            subscription_key_parameter_names=subscription_key_parameter_names,
            subscription_required=subscription_required,
            timeouts=timeouts,
            version=version,
            version_set_id=version_set_id,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementApi, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetImport")
    def reset_import(self) -> None:
        return jsii.invoke(self, "resetImport", [])

    @jsii.member(jsii_name="resetOauth2Authorization")
    def reset_oauth2_authorization(self) -> None:
        return jsii.invoke(self, "resetOauth2Authorization", [])

    @jsii.member(jsii_name="resetOpenidAuthentication")
    def reset_openid_authentication(self) -> None:
        return jsii.invoke(self, "resetOpenidAuthentication", [])

    @jsii.member(jsii_name="resetServiceUrl")
    def reset_service_url(self) -> None:
        return jsii.invoke(self, "resetServiceUrl", [])

    @jsii.member(jsii_name="resetSoapPassThrough")
    def reset_soap_pass_through(self) -> None:
        return jsii.invoke(self, "resetSoapPassThrough", [])

    @jsii.member(jsii_name="resetSubscriptionKeyParameterNames")
    def reset_subscription_key_parameter_names(self) -> None:
        return jsii.invoke(self, "resetSubscriptionKeyParameterNames", [])

    @jsii.member(jsii_name="resetSubscriptionRequired")
    def reset_subscription_required(self) -> None:
        return jsii.invoke(self, "resetSubscriptionRequired", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVersion")
    def reset_version(self) -> None:
        return jsii.invoke(self, "resetVersion", [])

    @jsii.member(jsii_name="resetVersionSetId")
    def reset_version_set_id(self) -> None:
        return jsii.invoke(self, "resetVersionSetId", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isCurrent")
    def is_current(self) -> builtins.bool:
        return jsii.get(self, "isCurrent")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isOnline")
    def is_online(self) -> builtins.bool:
        return jsii.get(self, "isOnline")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathInput")
    def path_input(self) -> builtins.str:
        return jsii.get(self, "pathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolsInput")
    def protocols_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "protocolsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="revisionInput")
    def revision_input(self) -> builtins.str:
        return jsii.get(self, "revisionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="importInput")
    def import_input(self) -> typing.Optional[typing.List["ApiManagementApiImport"]]:
        return jsii.get(self, "importInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="oauth2AuthorizationInput")
    def oauth2_authorization_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOauth2Authorization"]]:
        return jsii.get(self, "oauth2AuthorizationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="openidAuthenticationInput")
    def openid_authentication_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOpenidAuthentication"]]:
        return jsii.get(self, "openidAuthenticationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceUrlInput")
    def service_url_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "serviceUrlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="soapPassThroughInput")
    def soap_pass_through_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "soapPassThroughInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionKeyParameterNamesInput")
    def subscription_key_parameter_names_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiSubscriptionKeyParameterNames"]]:
        return jsii.get(self, "subscriptionKeyParameterNamesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionRequiredInput")
    def subscription_required_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "subscriptionRequiredInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementApiTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionSetIdInput")
    def version_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionSetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="import")
    def import_(self) -> typing.List["ApiManagementApiImport"]:
        return jsii.get(self, "import")

    @import_.setter # type: ignore
    def import_(self, value: typing.List["ApiManagementApiImport"]) -> None:
        jsii.set(self, "import", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="oauth2Authorization")
    def oauth2_authorization(
        self,
    ) -> typing.List["ApiManagementApiOauth2Authorization"]:
        return jsii.get(self, "oauth2Authorization")

    @oauth2_authorization.setter # type: ignore
    def oauth2_authorization(
        self,
        value: typing.List["ApiManagementApiOauth2Authorization"],
    ) -> None:
        jsii.set(self, "oauth2Authorization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="openidAuthentication")
    def openid_authentication(
        self,
    ) -> typing.List["ApiManagementApiOpenidAuthentication"]:
        return jsii.get(self, "openidAuthentication")

    @openid_authentication.setter # type: ignore
    def openid_authentication(
        self,
        value: typing.List["ApiManagementApiOpenidAuthentication"],
    ) -> None:
        jsii.set(self, "openidAuthentication", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="path")
    def path(self) -> builtins.str:
        return jsii.get(self, "path")

    @path.setter # type: ignore
    def path(self, value: builtins.str) -> None:
        jsii.set(self, "path", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocols")
    def protocols(self) -> typing.List[builtins.str]:
        return jsii.get(self, "protocols")

    @protocols.setter # type: ignore
    def protocols(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "protocols", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="revision")
    def revision(self) -> builtins.str:
        return jsii.get(self, "revision")

    @revision.setter # type: ignore
    def revision(self, value: builtins.str) -> None:
        jsii.set(self, "revision", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceUrl")
    def service_url(self) -> builtins.str:
        return jsii.get(self, "serviceUrl")

    @service_url.setter # type: ignore
    def service_url(self, value: builtins.str) -> None:
        jsii.set(self, "serviceUrl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="soapPassThrough")
    def soap_pass_through(self) -> builtins.bool:
        return jsii.get(self, "soapPassThrough")

    @soap_pass_through.setter # type: ignore
    def soap_pass_through(self, value: builtins.bool) -> None:
        jsii.set(self, "soapPassThrough", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionKeyParameterNames")
    def subscription_key_parameter_names(
        self,
    ) -> typing.List["ApiManagementApiSubscriptionKeyParameterNames"]:
        return jsii.get(self, "subscriptionKeyParameterNames")

    @subscription_key_parameter_names.setter # type: ignore
    def subscription_key_parameter_names(
        self,
        value: typing.List["ApiManagementApiSubscriptionKeyParameterNames"],
    ) -> None:
        jsii.set(self, "subscriptionKeyParameterNames", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionRequired")
    def subscription_required(self) -> builtins.bool:
        return jsii.get(self, "subscriptionRequired")

    @subscription_required.setter # type: ignore
    def subscription_required(self, value: builtins.bool) -> None:
        jsii.set(self, "subscriptionRequired", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementApiTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementApiTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionSetId")
    def version_set_id(self) -> builtins.str:
        return jsii.get(self, "versionSetId")

    @version_set_id.setter # type: ignore
    def version_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "versionSetId", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "display_name": "displayName",
        "name": "name",
        "path": "path",
        "protocols": "protocols",
        "resource_group_name": "resourceGroupName",
        "revision": "revision",
        "description": "description",
        "import_": "import",
        "oauth2_authorization": "oauth2Authorization",
        "openid_authentication": "openidAuthentication",
        "service_url": "serviceUrl",
        "soap_pass_through": "soapPassThrough",
        "subscription_key_parameter_names": "subscriptionKeyParameterNames",
        "subscription_required": "subscriptionRequired",
        "timeouts": "timeouts",
        "version": "version",
        "version_set_id": "versionSetId",
    },
)
class ApiManagementApiConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        path: builtins.str,
        protocols: typing.List[builtins.str],
        resource_group_name: builtins.str,
        revision: builtins.str,
        description: typing.Optional[builtins.str] = None,
        import_: typing.Optional[typing.List["ApiManagementApiImport"]] = None,
        oauth2_authorization: typing.Optional[typing.List["ApiManagementApiOauth2Authorization"]] = None,
        openid_authentication: typing.Optional[typing.List["ApiManagementApiOpenidAuthentication"]] = None,
        service_url: typing.Optional[builtins.str] = None,
        soap_pass_through: typing.Optional[builtins.bool] = None,
        subscription_key_parameter_names: typing.Optional[typing.List["ApiManagementApiSubscriptionKeyParameterNames"]] = None,
        subscription_required: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementApiTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
        version_set_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param path: -
        :param protocols: -
        :param resource_group_name: -
        :param revision: -
        :param description: -
        :param import_: import block.
        :param oauth2_authorization: oauth2_authorization block.
        :param openid_authentication: openid_authentication block.
        :param service_url: -
        :param soap_pass_through: -
        :param subscription_key_parameter_names: subscription_key_parameter_names block.
        :param subscription_required: -
        :param timeouts: timeouts block.
        :param version: -
        :param version_set_id: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementApiTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "display_name": display_name,
            "name": name,
            "path": path,
            "protocols": protocols,
            "resource_group_name": resource_group_name,
            "revision": revision,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if import_ is not None:
            self._values["import_"] = import_
        if oauth2_authorization is not None:
            self._values["oauth2_authorization"] = oauth2_authorization
        if openid_authentication is not None:
            self._values["openid_authentication"] = openid_authentication
        if service_url is not None:
            self._values["service_url"] = service_url
        if soap_pass_through is not None:
            self._values["soap_pass_through"] = soap_pass_through
        if subscription_key_parameter_names is not None:
            self._values["subscription_key_parameter_names"] = subscription_key_parameter_names
        if subscription_required is not None:
            self._values["subscription_required"] = subscription_required
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if version is not None:
            self._values["version"] = version
        if version_set_id is not None:
            self._values["version_set_id"] = version_set_id

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    @builtins.property
    def protocols(self) -> typing.List[builtins.str]:
        result = self._values.get("protocols")
        assert result is not None, "Required property 'protocols' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def revision(self) -> builtins.str:
        result = self._values.get("revision")
        assert result is not None, "Required property 'revision' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def import_(self) -> typing.Optional[typing.List["ApiManagementApiImport"]]:
        """import block."""
        result = self._values.get("import_")
        return result

    @builtins.property
    def oauth2_authorization(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOauth2Authorization"]]:
        """oauth2_authorization block."""
        result = self._values.get("oauth2_authorization")
        return result

    @builtins.property
    def openid_authentication(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOpenidAuthentication"]]:
        """openid_authentication block."""
        result = self._values.get("openid_authentication")
        return result

    @builtins.property
    def service_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("service_url")
        return result

    @builtins.property
    def soap_pass_through(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("soap_pass_through")
        return result

    @builtins.property
    def subscription_key_parameter_names(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiSubscriptionKeyParameterNames"]]:
        """subscription_key_parameter_names block."""
        result = self._values.get("subscription_key_parameter_names")
        return result

    @builtins.property
    def subscription_required(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("subscription_required")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementApiTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    @builtins.property
    def version_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version_set_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementApiDiagnostic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementApiDiagnostic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_logger_id: builtins.str,
        api_management_name: builtins.str,
        api_name: builtins.str,
        identifier: builtins.str,
        resource_group_name: builtins.str,
        always_log_errors: typing.Optional[builtins.bool] = None,
        backend_request: typing.Optional[typing.List["ApiManagementApiDiagnosticBackendRequest"]] = None,
        backend_response: typing.Optional[typing.List["ApiManagementApiDiagnosticBackendResponse"]] = None,
        frontend_request: typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendRequest"]] = None,
        frontend_response: typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendResponse"]] = None,
        http_correlation_protocol: typing.Optional[builtins.str] = None,
        log_client_ip: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementApiDiagnosticTimeouts"] = None,
        verbosity: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_logger_id: -
        :param api_management_name: -
        :param api_name: -
        :param identifier: -
        :param resource_group_name: -
        :param always_log_errors: -
        :param backend_request: backend_request block.
        :param backend_response: backend_response block.
        :param frontend_request: frontend_request block.
        :param frontend_response: frontend_response block.
        :param http_correlation_protocol: -
        :param log_client_ip: -
        :param timeouts: timeouts block.
        :param verbosity: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementApiDiagnosticConfig(
            api_management_logger_id=api_management_logger_id,
            api_management_name=api_management_name,
            api_name=api_name,
            identifier=identifier,
            resource_group_name=resource_group_name,
            always_log_errors=always_log_errors,
            backend_request=backend_request,
            backend_response=backend_response,
            frontend_request=frontend_request,
            frontend_response=frontend_response,
            http_correlation_protocol=http_correlation_protocol,
            log_client_ip=log_client_ip,
            timeouts=timeouts,
            verbosity=verbosity,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementApiDiagnostic, self, [scope, id, config])

    @jsii.member(jsii_name="resetAlwaysLogErrors")
    def reset_always_log_errors(self) -> None:
        return jsii.invoke(self, "resetAlwaysLogErrors", [])

    @jsii.member(jsii_name="resetBackendRequest")
    def reset_backend_request(self) -> None:
        return jsii.invoke(self, "resetBackendRequest", [])

    @jsii.member(jsii_name="resetBackendResponse")
    def reset_backend_response(self) -> None:
        return jsii.invoke(self, "resetBackendResponse", [])

    @jsii.member(jsii_name="resetFrontendRequest")
    def reset_frontend_request(self) -> None:
        return jsii.invoke(self, "resetFrontendRequest", [])

    @jsii.member(jsii_name="resetFrontendResponse")
    def reset_frontend_response(self) -> None:
        return jsii.invoke(self, "resetFrontendResponse", [])

    @jsii.member(jsii_name="resetHttpCorrelationProtocol")
    def reset_http_correlation_protocol(self) -> None:
        return jsii.invoke(self, "resetHttpCorrelationProtocol", [])

    @jsii.member(jsii_name="resetLogClientIp")
    def reset_log_client_ip(self) -> None:
        return jsii.invoke(self, "resetLogClientIp", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVerbosity")
    def reset_verbosity(self) -> None:
        return jsii.invoke(self, "resetVerbosity", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementLoggerIdInput")
    def api_management_logger_id_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementLoggerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiNameInput")
    def api_name_input(self) -> builtins.str:
        return jsii.get(self, "apiNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identifierInput")
    def identifier_input(self) -> builtins.str:
        return jsii.get(self, "identifierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alwaysLogErrorsInput")
    def always_log_errors_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "alwaysLogErrorsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendRequestInput")
    def backend_request_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiDiagnosticBackendRequest"]]:
        return jsii.get(self, "backendRequestInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendResponseInput")
    def backend_response_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiDiagnosticBackendResponse"]]:
        return jsii.get(self, "backendResponseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendRequestInput")
    def frontend_request_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendRequest"]]:
        return jsii.get(self, "frontendRequestInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendResponseInput")
    def frontend_response_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendResponse"]]:
        return jsii.get(self, "frontendResponseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpCorrelationProtocolInput")
    def http_correlation_protocol_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "httpCorrelationProtocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logClientIpInput")
    def log_client_ip_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "logClientIpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementApiDiagnosticTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="verbosityInput")
    def verbosity_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "verbosityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alwaysLogErrors")
    def always_log_errors(self) -> builtins.bool:
        return jsii.get(self, "alwaysLogErrors")

    @always_log_errors.setter # type: ignore
    def always_log_errors(self, value: builtins.bool) -> None:
        jsii.set(self, "alwaysLogErrors", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementLoggerId")
    def api_management_logger_id(self) -> builtins.str:
        return jsii.get(self, "apiManagementLoggerId")

    @api_management_logger_id.setter # type: ignore
    def api_management_logger_id(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementLoggerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiName")
    def api_name(self) -> builtins.str:
        return jsii.get(self, "apiName")

    @api_name.setter # type: ignore
    def api_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendRequest")
    def backend_request(
        self,
    ) -> typing.List["ApiManagementApiDiagnosticBackendRequest"]:
        return jsii.get(self, "backendRequest")

    @backend_request.setter # type: ignore
    def backend_request(
        self,
        value: typing.List["ApiManagementApiDiagnosticBackendRequest"],
    ) -> None:
        jsii.set(self, "backendRequest", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendResponse")
    def backend_response(
        self,
    ) -> typing.List["ApiManagementApiDiagnosticBackendResponse"]:
        return jsii.get(self, "backendResponse")

    @backend_response.setter # type: ignore
    def backend_response(
        self,
        value: typing.List["ApiManagementApiDiagnosticBackendResponse"],
    ) -> None:
        jsii.set(self, "backendResponse", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendRequest")
    def frontend_request(
        self,
    ) -> typing.List["ApiManagementApiDiagnosticFrontendRequest"]:
        return jsii.get(self, "frontendRequest")

    @frontend_request.setter # type: ignore
    def frontend_request(
        self,
        value: typing.List["ApiManagementApiDiagnosticFrontendRequest"],
    ) -> None:
        jsii.set(self, "frontendRequest", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendResponse")
    def frontend_response(
        self,
    ) -> typing.List["ApiManagementApiDiagnosticFrontendResponse"]:
        return jsii.get(self, "frontendResponse")

    @frontend_response.setter # type: ignore
    def frontend_response(
        self,
        value: typing.List["ApiManagementApiDiagnosticFrontendResponse"],
    ) -> None:
        jsii.set(self, "frontendResponse", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpCorrelationProtocol")
    def http_correlation_protocol(self) -> builtins.str:
        return jsii.get(self, "httpCorrelationProtocol")

    @http_correlation_protocol.setter # type: ignore
    def http_correlation_protocol(self, value: builtins.str) -> None:
        jsii.set(self, "httpCorrelationProtocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identifier")
    def identifier(self) -> builtins.str:
        return jsii.get(self, "identifier")

    @identifier.setter # type: ignore
    def identifier(self, value: builtins.str) -> None:
        jsii.set(self, "identifier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logClientIp")
    def log_client_ip(self) -> builtins.bool:
        return jsii.get(self, "logClientIp")

    @log_client_ip.setter # type: ignore
    def log_client_ip(self, value: builtins.bool) -> None:
        jsii.set(self, "logClientIp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementApiDiagnosticTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementApiDiagnosticTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="verbosity")
    def verbosity(self) -> builtins.str:
        return jsii.get(self, "verbosity")

    @verbosity.setter # type: ignore
    def verbosity(self, value: builtins.str) -> None:
        jsii.set(self, "verbosity", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiDiagnosticBackendRequest",
    jsii_struct_bases=[],
    name_mapping={"body_bytes": "bodyBytes", "headers_to_log": "headersToLog"},
)
class ApiManagementApiDiagnosticBackendRequest:
    def __init__(
        self,
        *,
        body_bytes: typing.Optional[jsii.Number] = None,
        headers_to_log: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param body_bytes: -
        :param headers_to_log: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if body_bytes is not None:
            self._values["body_bytes"] = body_bytes
        if headers_to_log is not None:
            self._values["headers_to_log"] = headers_to_log

    @builtins.property
    def body_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("body_bytes")
        return result

    @builtins.property
    def headers_to_log(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("headers_to_log")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiDiagnosticBackendRequest(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiDiagnosticBackendResponse",
    jsii_struct_bases=[],
    name_mapping={"body_bytes": "bodyBytes", "headers_to_log": "headersToLog"},
)
class ApiManagementApiDiagnosticBackendResponse:
    def __init__(
        self,
        *,
        body_bytes: typing.Optional[jsii.Number] = None,
        headers_to_log: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param body_bytes: -
        :param headers_to_log: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if body_bytes is not None:
            self._values["body_bytes"] = body_bytes
        if headers_to_log is not None:
            self._values["headers_to_log"] = headers_to_log

    @builtins.property
    def body_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("body_bytes")
        return result

    @builtins.property
    def headers_to_log(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("headers_to_log")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiDiagnosticBackendResponse(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiDiagnosticConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_logger_id": "apiManagementLoggerId",
        "api_management_name": "apiManagementName",
        "api_name": "apiName",
        "identifier": "identifier",
        "resource_group_name": "resourceGroupName",
        "always_log_errors": "alwaysLogErrors",
        "backend_request": "backendRequest",
        "backend_response": "backendResponse",
        "frontend_request": "frontendRequest",
        "frontend_response": "frontendResponse",
        "http_correlation_protocol": "httpCorrelationProtocol",
        "log_client_ip": "logClientIp",
        "timeouts": "timeouts",
        "verbosity": "verbosity",
    },
)
class ApiManagementApiDiagnosticConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_logger_id: builtins.str,
        api_management_name: builtins.str,
        api_name: builtins.str,
        identifier: builtins.str,
        resource_group_name: builtins.str,
        always_log_errors: typing.Optional[builtins.bool] = None,
        backend_request: typing.Optional[typing.List[ApiManagementApiDiagnosticBackendRequest]] = None,
        backend_response: typing.Optional[typing.List[ApiManagementApiDiagnosticBackendResponse]] = None,
        frontend_request: typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendRequest"]] = None,
        frontend_response: typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendResponse"]] = None,
        http_correlation_protocol: typing.Optional[builtins.str] = None,
        log_client_ip: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementApiDiagnosticTimeouts"] = None,
        verbosity: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_logger_id: -
        :param api_management_name: -
        :param api_name: -
        :param identifier: -
        :param resource_group_name: -
        :param always_log_errors: -
        :param backend_request: backend_request block.
        :param backend_response: backend_response block.
        :param frontend_request: frontend_request block.
        :param frontend_response: frontend_response block.
        :param http_correlation_protocol: -
        :param log_client_ip: -
        :param timeouts: timeouts block.
        :param verbosity: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementApiDiagnosticTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_logger_id": api_management_logger_id,
            "api_management_name": api_management_name,
            "api_name": api_name,
            "identifier": identifier,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if always_log_errors is not None:
            self._values["always_log_errors"] = always_log_errors
        if backend_request is not None:
            self._values["backend_request"] = backend_request
        if backend_response is not None:
            self._values["backend_response"] = backend_response
        if frontend_request is not None:
            self._values["frontend_request"] = frontend_request
        if frontend_response is not None:
            self._values["frontend_response"] = frontend_response
        if http_correlation_protocol is not None:
            self._values["http_correlation_protocol"] = http_correlation_protocol
        if log_client_ip is not None:
            self._values["log_client_ip"] = log_client_ip
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if verbosity is not None:
            self._values["verbosity"] = verbosity

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_logger_id(self) -> builtins.str:
        result = self._values.get("api_management_logger_id")
        assert result is not None, "Required property 'api_management_logger_id' is missing"
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def api_name(self) -> builtins.str:
        result = self._values.get("api_name")
        assert result is not None, "Required property 'api_name' is missing"
        return result

    @builtins.property
    def identifier(self) -> builtins.str:
        result = self._values.get("identifier")
        assert result is not None, "Required property 'identifier' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def always_log_errors(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("always_log_errors")
        return result

    @builtins.property
    def backend_request(
        self,
    ) -> typing.Optional[typing.List[ApiManagementApiDiagnosticBackendRequest]]:
        """backend_request block."""
        result = self._values.get("backend_request")
        return result

    @builtins.property
    def backend_response(
        self,
    ) -> typing.Optional[typing.List[ApiManagementApiDiagnosticBackendResponse]]:
        """backend_response block."""
        result = self._values.get("backend_response")
        return result

    @builtins.property
    def frontend_request(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendRequest"]]:
        """frontend_request block."""
        result = self._values.get("frontend_request")
        return result

    @builtins.property
    def frontend_response(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiDiagnosticFrontendResponse"]]:
        """frontend_response block."""
        result = self._values.get("frontend_response")
        return result

    @builtins.property
    def http_correlation_protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("http_correlation_protocol")
        return result

    @builtins.property
    def log_client_ip(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("log_client_ip")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementApiDiagnosticTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def verbosity(self) -> typing.Optional[builtins.str]:
        result = self._values.get("verbosity")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiDiagnosticConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiDiagnosticFrontendRequest",
    jsii_struct_bases=[],
    name_mapping={"body_bytes": "bodyBytes", "headers_to_log": "headersToLog"},
)
class ApiManagementApiDiagnosticFrontendRequest:
    def __init__(
        self,
        *,
        body_bytes: typing.Optional[jsii.Number] = None,
        headers_to_log: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param body_bytes: -
        :param headers_to_log: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if body_bytes is not None:
            self._values["body_bytes"] = body_bytes
        if headers_to_log is not None:
            self._values["headers_to_log"] = headers_to_log

    @builtins.property
    def body_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("body_bytes")
        return result

    @builtins.property
    def headers_to_log(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("headers_to_log")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiDiagnosticFrontendRequest(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiDiagnosticFrontendResponse",
    jsii_struct_bases=[],
    name_mapping={"body_bytes": "bodyBytes", "headers_to_log": "headersToLog"},
)
class ApiManagementApiDiagnosticFrontendResponse:
    def __init__(
        self,
        *,
        body_bytes: typing.Optional[jsii.Number] = None,
        headers_to_log: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param body_bytes: -
        :param headers_to_log: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if body_bytes is not None:
            self._values["body_bytes"] = body_bytes
        if headers_to_log is not None:
            self._values["headers_to_log"] = headers_to_log

    @builtins.property
    def body_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("body_bytes")
        return result

    @builtins.property
    def headers_to_log(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("headers_to_log")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiDiagnosticFrontendResponse(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiDiagnosticTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementApiDiagnosticTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiDiagnosticTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiImport",
    jsii_struct_bases=[],
    name_mapping={
        "content_format": "contentFormat",
        "content_value": "contentValue",
        "wsdl_selector": "wsdlSelector",
    },
)
class ApiManagementApiImport:
    def __init__(
        self,
        *,
        content_format: builtins.str,
        content_value: builtins.str,
        wsdl_selector: typing.Optional[typing.List["ApiManagementApiImportWsdlSelector"]] = None,
    ) -> None:
        """
        :param content_format: -
        :param content_value: -
        :param wsdl_selector: wsdl_selector block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "content_format": content_format,
            "content_value": content_value,
        }
        if wsdl_selector is not None:
            self._values["wsdl_selector"] = wsdl_selector

    @builtins.property
    def content_format(self) -> builtins.str:
        result = self._values.get("content_format")
        assert result is not None, "Required property 'content_format' is missing"
        return result

    @builtins.property
    def content_value(self) -> builtins.str:
        result = self._values.get("content_value")
        assert result is not None, "Required property 'content_value' is missing"
        return result

    @builtins.property
    def wsdl_selector(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiImportWsdlSelector"]]:
        """wsdl_selector block."""
        result = self._values.get("wsdl_selector")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiImport(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiImportWsdlSelector",
    jsii_struct_bases=[],
    name_mapping={"endpoint_name": "endpointName", "service_name": "serviceName"},
)
class ApiManagementApiImportWsdlSelector:
    def __init__(
        self,
        *,
        endpoint_name: builtins.str,
        service_name: builtins.str,
    ) -> None:
        """
        :param endpoint_name: -
        :param service_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "endpoint_name": endpoint_name,
            "service_name": service_name,
        }

    @builtins.property
    def endpoint_name(self) -> builtins.str:
        result = self._values.get("endpoint_name")
        assert result is not None, "Required property 'endpoint_name' is missing"
        return result

    @builtins.property
    def service_name(self) -> builtins.str:
        result = self._values.get("service_name")
        assert result is not None, "Required property 'service_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiImportWsdlSelector(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOauth2Authorization",
    jsii_struct_bases=[],
    name_mapping={
        "authorization_server_name": "authorizationServerName",
        "scope": "scope",
    },
)
class ApiManagementApiOauth2Authorization:
    def __init__(
        self,
        *,
        authorization_server_name: builtins.str,
        scope: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param authorization_server_name: -
        :param scope: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "authorization_server_name": authorization_server_name,
        }
        if scope is not None:
            self._values["scope"] = scope

    @builtins.property
    def authorization_server_name(self) -> builtins.str:
        result = self._values.get("authorization_server_name")
        assert result is not None, "Required property 'authorization_server_name' is missing"
        return result

    @builtins.property
    def scope(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scope")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOauth2Authorization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOpenidAuthentication",
    jsii_struct_bases=[],
    name_mapping={
        "openid_provider_name": "openidProviderName",
        "bearer_token_sending_methods": "bearerTokenSendingMethods",
    },
)
class ApiManagementApiOpenidAuthentication:
    def __init__(
        self,
        *,
        openid_provider_name: builtins.str,
        bearer_token_sending_methods: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param openid_provider_name: -
        :param bearer_token_sending_methods: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "openid_provider_name": openid_provider_name,
        }
        if bearer_token_sending_methods is not None:
            self._values["bearer_token_sending_methods"] = bearer_token_sending_methods

    @builtins.property
    def openid_provider_name(self) -> builtins.str:
        result = self._values.get("openid_provider_name")
        assert result is not None, "Required property 'openid_provider_name' is missing"
        return result

    @builtins.property
    def bearer_token_sending_methods(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("bearer_token_sending_methods")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOpenidAuthentication(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementApiOperation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementApiOperation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        api_name: builtins.str,
        display_name: builtins.str,
        method: builtins.str,
        operation_id: builtins.str,
        resource_group_name: builtins.str,
        url_template: builtins.str,
        description: typing.Optional[builtins.str] = None,
        request: typing.Optional[typing.List["ApiManagementApiOperationRequest"]] = None,
        response: typing.Optional[typing.List["ApiManagementApiOperationResponse"]] = None,
        template_parameter: typing.Optional[typing.List["ApiManagementApiOperationTemplateParameter"]] = None,
        timeouts: typing.Optional["ApiManagementApiOperationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param api_name: -
        :param display_name: -
        :param method: -
        :param operation_id: -
        :param resource_group_name: -
        :param url_template: -
        :param description: -
        :param request: request block.
        :param response: response block.
        :param template_parameter: template_parameter block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementApiOperationConfig(
            api_management_name=api_management_name,
            api_name=api_name,
            display_name=display_name,
            method=method,
            operation_id=operation_id,
            resource_group_name=resource_group_name,
            url_template=url_template,
            description=description,
            request=request,
            response=response,
            template_parameter=template_parameter,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementApiOperation, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetRequest")
    def reset_request(self) -> None:
        return jsii.invoke(self, "resetRequest", [])

    @jsii.member(jsii_name="resetResponse")
    def reset_response(self) -> None:
        return jsii.invoke(self, "resetResponse", [])

    @jsii.member(jsii_name="resetTemplateParameter")
    def reset_template_parameter(self) -> None:
        return jsii.invoke(self, "resetTemplateParameter", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiNameInput")
    def api_name_input(self) -> builtins.str:
        return jsii.get(self, "apiNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="methodInput")
    def method_input(self) -> builtins.str:
        return jsii.get(self, "methodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="operationIdInput")
    def operation_id_input(self) -> builtins.str:
        return jsii.get(self, "operationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlTemplateInput")
    def url_template_input(self) -> builtins.str:
        return jsii.get(self, "urlTemplateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestInput")
    def request_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationRequest"]]:
        return jsii.get(self, "requestInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="responseInput")
    def response_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationResponse"]]:
        return jsii.get(self, "responseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateParameterInput")
    def template_parameter_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationTemplateParameter"]]:
        return jsii.get(self, "templateParameterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementApiOperationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiName")
    def api_name(self) -> builtins.str:
        return jsii.get(self, "apiName")

    @api_name.setter # type: ignore
    def api_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="method")
    def method(self) -> builtins.str:
        return jsii.get(self, "method")

    @method.setter # type: ignore
    def method(self, value: builtins.str) -> None:
        jsii.set(self, "method", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="operationId")
    def operation_id(self) -> builtins.str:
        return jsii.get(self, "operationId")

    @operation_id.setter # type: ignore
    def operation_id(self, value: builtins.str) -> None:
        jsii.set(self, "operationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="request")
    def request(self) -> typing.List["ApiManagementApiOperationRequest"]:
        return jsii.get(self, "request")

    @request.setter # type: ignore
    def request(self, value: typing.List["ApiManagementApiOperationRequest"]) -> None:
        jsii.set(self, "request", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="response")
    def response(self) -> typing.List["ApiManagementApiOperationResponse"]:
        return jsii.get(self, "response")

    @response.setter # type: ignore
    def response(self, value: typing.List["ApiManagementApiOperationResponse"]) -> None:
        jsii.set(self, "response", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateParameter")
    def template_parameter(
        self,
    ) -> typing.List["ApiManagementApiOperationTemplateParameter"]:
        return jsii.get(self, "templateParameter")

    @template_parameter.setter # type: ignore
    def template_parameter(
        self,
        value: typing.List["ApiManagementApiOperationTemplateParameter"],
    ) -> None:
        jsii.set(self, "templateParameter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementApiOperationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementApiOperationTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlTemplate")
    def url_template(self) -> builtins.str:
        return jsii.get(self, "urlTemplate")

    @url_template.setter # type: ignore
    def url_template(self, value: builtins.str) -> None:
        jsii.set(self, "urlTemplate", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "api_name": "apiName",
        "display_name": "displayName",
        "method": "method",
        "operation_id": "operationId",
        "resource_group_name": "resourceGroupName",
        "url_template": "urlTemplate",
        "description": "description",
        "request": "request",
        "response": "response",
        "template_parameter": "templateParameter",
        "timeouts": "timeouts",
    },
)
class ApiManagementApiOperationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        api_name: builtins.str,
        display_name: builtins.str,
        method: builtins.str,
        operation_id: builtins.str,
        resource_group_name: builtins.str,
        url_template: builtins.str,
        description: typing.Optional[builtins.str] = None,
        request: typing.Optional[typing.List["ApiManagementApiOperationRequest"]] = None,
        response: typing.Optional[typing.List["ApiManagementApiOperationResponse"]] = None,
        template_parameter: typing.Optional[typing.List["ApiManagementApiOperationTemplateParameter"]] = None,
        timeouts: typing.Optional["ApiManagementApiOperationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param api_name: -
        :param display_name: -
        :param method: -
        :param operation_id: -
        :param resource_group_name: -
        :param url_template: -
        :param description: -
        :param request: request block.
        :param response: response block.
        :param template_parameter: template_parameter block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementApiOperationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "api_name": api_name,
            "display_name": display_name,
            "method": method,
            "operation_id": operation_id,
            "resource_group_name": resource_group_name,
            "url_template": url_template,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if request is not None:
            self._values["request"] = request
        if response is not None:
            self._values["response"] = response
        if template_parameter is not None:
            self._values["template_parameter"] = template_parameter
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def api_name(self) -> builtins.str:
        result = self._values.get("api_name")
        assert result is not None, "Required property 'api_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def method(self) -> builtins.str:
        result = self._values.get("method")
        assert result is not None, "Required property 'method' is missing"
        return result

    @builtins.property
    def operation_id(self) -> builtins.str:
        result = self._values.get("operation_id")
        assert result is not None, "Required property 'operation_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def url_template(self) -> builtins.str:
        result = self._values.get("url_template")
        assert result is not None, "Required property 'url_template' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def request(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationRequest"]]:
        """request block."""
        result = self._values.get("request")
        return result

    @builtins.property
    def response(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationResponse"]]:
        """response block."""
        result = self._values.get("response")
        return result

    @builtins.property
    def template_parameter(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationTemplateParameter"]]:
        """template_parameter block."""
        result = self._values.get("template_parameter")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementApiOperationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementApiOperationPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementApiOperationPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        api_name: builtins.str,
        operation_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementApiOperationPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param api_name: -
        :param operation_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementApiOperationPolicyConfig(
            api_management_name=api_management_name,
            api_name=api_name,
            operation_id=operation_id,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            xml_content=xml_content,
            xml_link=xml_link,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementApiOperationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetXmlContent")
    def reset_xml_content(self) -> None:
        return jsii.invoke(self, "resetXmlContent", [])

    @jsii.member(jsii_name="resetXmlLink")
    def reset_xml_link(self) -> None:
        return jsii.invoke(self, "resetXmlLink", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiNameInput")
    def api_name_input(self) -> builtins.str:
        return jsii.get(self, "apiNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="operationIdInput")
    def operation_id_input(self) -> builtins.str:
        return jsii.get(self, "operationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementApiOperationPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContentInput")
    def xml_content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLinkInput")
    def xml_link_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlLinkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiName")
    def api_name(self) -> builtins.str:
        return jsii.get(self, "apiName")

    @api_name.setter # type: ignore
    def api_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="operationId")
    def operation_id(self) -> builtins.str:
        return jsii.get(self, "operationId")

    @operation_id.setter # type: ignore
    def operation_id(self, value: builtins.str) -> None:
        jsii.set(self, "operationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementApiOperationPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementApiOperationPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContent")
    def xml_content(self) -> builtins.str:
        return jsii.get(self, "xmlContent")

    @xml_content.setter # type: ignore
    def xml_content(self, value: builtins.str) -> None:
        jsii.set(self, "xmlContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLink")
    def xml_link(self) -> builtins.str:
        return jsii.get(self, "xmlLink")

    @xml_link.setter # type: ignore
    def xml_link(self, value: builtins.str) -> None:
        jsii.set(self, "xmlLink", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "api_name": "apiName",
        "operation_id": "operationId",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "xml_content": "xmlContent",
        "xml_link": "xmlLink",
    },
)
class ApiManagementApiOperationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        api_name: builtins.str,
        operation_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementApiOperationPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param api_name: -
        :param operation_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementApiOperationPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "api_name": api_name,
            "operation_id": operation_id,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if xml_content is not None:
            self._values["xml_content"] = xml_content
        if xml_link is not None:
            self._values["xml_link"] = xml_link

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def api_name(self) -> builtins.str:
        result = self._values.get("api_name")
        assert result is not None, "Required property 'api_name' is missing"
        return result

    @builtins.property
    def operation_id(self) -> builtins.str:
        result = self._values.get("operation_id")
        assert result is not None, "Required property 'operation_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementApiOperationPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def xml_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_content")
        return result

    @builtins.property
    def xml_link(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_link")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementApiOperationPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationRequest",
    jsii_struct_bases=[],
    name_mapping={
        "description": "description",
        "header": "header",
        "query_parameter": "queryParameter",
        "representation": "representation",
    },
)
class ApiManagementApiOperationRequest:
    def __init__(
        self,
        *,
        description: typing.Optional[builtins.str] = None,
        header: typing.Optional[typing.List["ApiManagementApiOperationRequestHeader"]] = None,
        query_parameter: typing.Optional[typing.List["ApiManagementApiOperationRequestQueryParameter"]] = None,
        representation: typing.Optional[typing.List["ApiManagementApiOperationRequestRepresentation"]] = None,
    ) -> None:
        """
        :param description: -
        :param header: header block.
        :param query_parameter: query_parameter block.
        :param representation: representation block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if description is not None:
            self._values["description"] = description
        if header is not None:
            self._values["header"] = header
        if query_parameter is not None:
            self._values["query_parameter"] = query_parameter
        if representation is not None:
            self._values["representation"] = representation

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def header(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationRequestHeader"]]:
        """header block."""
        result = self._values.get("header")
        return result

    @builtins.property
    def query_parameter(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationRequestQueryParameter"]]:
        """query_parameter block."""
        result = self._values.get("query_parameter")
        return result

    @builtins.property
    def representation(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationRequestRepresentation"]]:
        """representation block."""
        result = self._values.get("representation")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationRequest(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationRequestHeader",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "required": "required",
        "type": "type",
        "default_value": "defaultValue",
        "description": "description",
        "values": "values",
    },
)
class ApiManagementApiOperationRequestHeader:
    def __init__(
        self,
        *,
        name: builtins.str,
        required: builtins.bool,
        type: builtins.str,
        default_value: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        values: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param required: -
        :param type: -
        :param default_value: -
        :param description: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "required": required,
            "type": type,
        }
        if default_value is not None:
            self._values["default_value"] = default_value
        if description is not None:
            self._values["description"] = description
        if values is not None:
            self._values["values"] = values

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def required(self) -> builtins.bool:
        result = self._values.get("required")
        assert result is not None, "Required property 'required' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def default_value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_value")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def values(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("values")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationRequestHeader(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationRequestQueryParameter",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "required": "required",
        "type": "type",
        "default_value": "defaultValue",
        "description": "description",
        "values": "values",
    },
)
class ApiManagementApiOperationRequestQueryParameter:
    def __init__(
        self,
        *,
        name: builtins.str,
        required: builtins.bool,
        type: builtins.str,
        default_value: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        values: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param required: -
        :param type: -
        :param default_value: -
        :param description: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "required": required,
            "type": type,
        }
        if default_value is not None:
            self._values["default_value"] = default_value
        if description is not None:
            self._values["description"] = description
        if values is not None:
            self._values["values"] = values

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def required(self) -> builtins.bool:
        result = self._values.get("required")
        assert result is not None, "Required property 'required' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def default_value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_value")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def values(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("values")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationRequestQueryParameter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationRequestRepresentation",
    jsii_struct_bases=[],
    name_mapping={
        "content_type": "contentType",
        "form_parameter": "formParameter",
        "sample": "sample",
        "schema_id": "schemaId",
        "type_name": "typeName",
    },
)
class ApiManagementApiOperationRequestRepresentation:
    def __init__(
        self,
        *,
        content_type: builtins.str,
        form_parameter: typing.Optional[typing.List["ApiManagementApiOperationRequestRepresentationFormParameter"]] = None,
        sample: typing.Optional[builtins.str] = None,
        schema_id: typing.Optional[builtins.str] = None,
        type_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param content_type: -
        :param form_parameter: form_parameter block.
        :param sample: -
        :param schema_id: -
        :param type_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "content_type": content_type,
        }
        if form_parameter is not None:
            self._values["form_parameter"] = form_parameter
        if sample is not None:
            self._values["sample"] = sample
        if schema_id is not None:
            self._values["schema_id"] = schema_id
        if type_name is not None:
            self._values["type_name"] = type_name

    @builtins.property
    def content_type(self) -> builtins.str:
        result = self._values.get("content_type")
        assert result is not None, "Required property 'content_type' is missing"
        return result

    @builtins.property
    def form_parameter(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationRequestRepresentationFormParameter"]]:
        """form_parameter block."""
        result = self._values.get("form_parameter")
        return result

    @builtins.property
    def sample(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sample")
        return result

    @builtins.property
    def schema_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("schema_id")
        return result

    @builtins.property
    def type_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationRequestRepresentation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationRequestRepresentationFormParameter",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "required": "required",
        "type": "type",
        "default_value": "defaultValue",
        "description": "description",
        "values": "values",
    },
)
class ApiManagementApiOperationRequestRepresentationFormParameter:
    def __init__(
        self,
        *,
        name: builtins.str,
        required: builtins.bool,
        type: builtins.str,
        default_value: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        values: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param required: -
        :param type: -
        :param default_value: -
        :param description: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "required": required,
            "type": type,
        }
        if default_value is not None:
            self._values["default_value"] = default_value
        if description is not None:
            self._values["description"] = description
        if values is not None:
            self._values["values"] = values

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def required(self) -> builtins.bool:
        result = self._values.get("required")
        assert result is not None, "Required property 'required' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def default_value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_value")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def values(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("values")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationRequestRepresentationFormParameter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationResponse",
    jsii_struct_bases=[],
    name_mapping={
        "status_code": "statusCode",
        "description": "description",
        "header": "header",
        "representation": "representation",
    },
)
class ApiManagementApiOperationResponse:
    def __init__(
        self,
        *,
        status_code: jsii.Number,
        description: typing.Optional[builtins.str] = None,
        header: typing.Optional[typing.List["ApiManagementApiOperationResponseHeader"]] = None,
        representation: typing.Optional[typing.List["ApiManagementApiOperationResponseRepresentation"]] = None,
    ) -> None:
        """
        :param status_code: -
        :param description: -
        :param header: header block.
        :param representation: representation block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "status_code": status_code,
        }
        if description is not None:
            self._values["description"] = description
        if header is not None:
            self._values["header"] = header
        if representation is not None:
            self._values["representation"] = representation

    @builtins.property
    def status_code(self) -> jsii.Number:
        result = self._values.get("status_code")
        assert result is not None, "Required property 'status_code' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def header(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationResponseHeader"]]:
        """header block."""
        result = self._values.get("header")
        return result

    @builtins.property
    def representation(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationResponseRepresentation"]]:
        """representation block."""
        result = self._values.get("representation")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationResponse(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationResponseHeader",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "required": "required",
        "type": "type",
        "default_value": "defaultValue",
        "description": "description",
        "values": "values",
    },
)
class ApiManagementApiOperationResponseHeader:
    def __init__(
        self,
        *,
        name: builtins.str,
        required: builtins.bool,
        type: builtins.str,
        default_value: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        values: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param required: -
        :param type: -
        :param default_value: -
        :param description: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "required": required,
            "type": type,
        }
        if default_value is not None:
            self._values["default_value"] = default_value
        if description is not None:
            self._values["description"] = description
        if values is not None:
            self._values["values"] = values

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def required(self) -> builtins.bool:
        result = self._values.get("required")
        assert result is not None, "Required property 'required' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def default_value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_value")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def values(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("values")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationResponseHeader(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationResponseRepresentation",
    jsii_struct_bases=[],
    name_mapping={
        "content_type": "contentType",
        "form_parameter": "formParameter",
        "sample": "sample",
        "schema_id": "schemaId",
        "type_name": "typeName",
    },
)
class ApiManagementApiOperationResponseRepresentation:
    def __init__(
        self,
        *,
        content_type: builtins.str,
        form_parameter: typing.Optional[typing.List["ApiManagementApiOperationResponseRepresentationFormParameter"]] = None,
        sample: typing.Optional[builtins.str] = None,
        schema_id: typing.Optional[builtins.str] = None,
        type_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param content_type: -
        :param form_parameter: form_parameter block.
        :param sample: -
        :param schema_id: -
        :param type_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "content_type": content_type,
        }
        if form_parameter is not None:
            self._values["form_parameter"] = form_parameter
        if sample is not None:
            self._values["sample"] = sample
        if schema_id is not None:
            self._values["schema_id"] = schema_id
        if type_name is not None:
            self._values["type_name"] = type_name

    @builtins.property
    def content_type(self) -> builtins.str:
        result = self._values.get("content_type")
        assert result is not None, "Required property 'content_type' is missing"
        return result

    @builtins.property
    def form_parameter(
        self,
    ) -> typing.Optional[typing.List["ApiManagementApiOperationResponseRepresentationFormParameter"]]:
        """form_parameter block."""
        result = self._values.get("form_parameter")
        return result

    @builtins.property
    def sample(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sample")
        return result

    @builtins.property
    def schema_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("schema_id")
        return result

    @builtins.property
    def type_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationResponseRepresentation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationResponseRepresentationFormParameter",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "required": "required",
        "type": "type",
        "default_value": "defaultValue",
        "description": "description",
        "values": "values",
    },
)
class ApiManagementApiOperationResponseRepresentationFormParameter:
    def __init__(
        self,
        *,
        name: builtins.str,
        required: builtins.bool,
        type: builtins.str,
        default_value: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        values: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param required: -
        :param type: -
        :param default_value: -
        :param description: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "required": required,
            "type": type,
        }
        if default_value is not None:
            self._values["default_value"] = default_value
        if description is not None:
            self._values["description"] = description
        if values is not None:
            self._values["values"] = values

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def required(self) -> builtins.bool:
        result = self._values.get("required")
        assert result is not None, "Required property 'required' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def default_value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_value")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def values(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("values")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationResponseRepresentationFormParameter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationTemplateParameter",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "required": "required",
        "type": "type",
        "default_value": "defaultValue",
        "description": "description",
        "values": "values",
    },
)
class ApiManagementApiOperationTemplateParameter:
    def __init__(
        self,
        *,
        name: builtins.str,
        required: builtins.bool,
        type: builtins.str,
        default_value: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        values: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param required: -
        :param type: -
        :param default_value: -
        :param description: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "required": required,
            "type": type,
        }
        if default_value is not None:
            self._values["default_value"] = default_value
        if description is not None:
            self._values["description"] = description
        if values is not None:
            self._values["values"] = values

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def required(self) -> builtins.bool:
        result = self._values.get("required")
        assert result is not None, "Required property 'required' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def default_value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_value")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def values(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("values")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationTemplateParameter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiOperationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementApiOperationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiOperationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementApiPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementApiPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        api_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementApiPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param api_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementApiPolicyConfig(
            api_management_name=api_management_name,
            api_name=api_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            xml_content=xml_content,
            xml_link=xml_link,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementApiPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetXmlContent")
    def reset_xml_content(self) -> None:
        return jsii.invoke(self, "resetXmlContent", [])

    @jsii.member(jsii_name="resetXmlLink")
    def reset_xml_link(self) -> None:
        return jsii.invoke(self, "resetXmlLink", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiNameInput")
    def api_name_input(self) -> builtins.str:
        return jsii.get(self, "apiNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementApiPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContentInput")
    def xml_content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLinkInput")
    def xml_link_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlLinkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiName")
    def api_name(self) -> builtins.str:
        return jsii.get(self, "apiName")

    @api_name.setter # type: ignore
    def api_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementApiPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementApiPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContent")
    def xml_content(self) -> builtins.str:
        return jsii.get(self, "xmlContent")

    @xml_content.setter # type: ignore
    def xml_content(self, value: builtins.str) -> None:
        jsii.set(self, "xmlContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLink")
    def xml_link(self) -> builtins.str:
        return jsii.get(self, "xmlLink")

    @xml_link.setter # type: ignore
    def xml_link(self, value: builtins.str) -> None:
        jsii.set(self, "xmlLink", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "api_name": "apiName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "xml_content": "xmlContent",
        "xml_link": "xmlLink",
    },
)
class ApiManagementApiPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        api_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementApiPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param api_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementApiPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "api_name": api_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if xml_content is not None:
            self._values["xml_content"] = xml_content
        if xml_link is not None:
            self._values["xml_link"] = xml_link

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def api_name(self) -> builtins.str:
        result = self._values.get("api_name")
        assert result is not None, "Required property 'api_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementApiPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def xml_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_content")
        return result

    @builtins.property
    def xml_link(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_link")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementApiPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementApiSchema(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementApiSchema",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        api_name: builtins.str,
        content_type: builtins.str,
        resource_group_name: builtins.str,
        schema_id: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["ApiManagementApiSchemaTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param api_name: -
        :param content_type: -
        :param resource_group_name: -
        :param schema_id: -
        :param value: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementApiSchemaConfig(
            api_management_name=api_management_name,
            api_name=api_name,
            content_type=content_type,
            resource_group_name=resource_group_name,
            schema_id=schema_id,
            value=value,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementApiSchema, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiNameInput")
    def api_name_input(self) -> builtins.str:
        return jsii.get(self, "apiNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypeInput")
    def content_type_input(self) -> builtins.str:
        return jsii.get(self, "contentTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaIdInput")
    def schema_id_input(self) -> builtins.str:
        return jsii.get(self, "schemaIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementApiSchemaTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiName")
    def api_name(self) -> builtins.str:
        return jsii.get(self, "apiName")

    @api_name.setter # type: ignore
    def api_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")

    @content_type.setter # type: ignore
    def content_type(self, value: builtins.str) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaId")
    def schema_id(self) -> builtins.str:
        return jsii.get(self, "schemaId")

    @schema_id.setter # type: ignore
    def schema_id(self, value: builtins.str) -> None:
        jsii.set(self, "schemaId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementApiSchemaTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementApiSchemaTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiSchemaConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "api_name": "apiName",
        "content_type": "contentType",
        "resource_group_name": "resourceGroupName",
        "schema_id": "schemaId",
        "value": "value",
        "timeouts": "timeouts",
    },
)
class ApiManagementApiSchemaConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        api_name: builtins.str,
        content_type: builtins.str,
        resource_group_name: builtins.str,
        schema_id: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["ApiManagementApiSchemaTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param api_name: -
        :param content_type: -
        :param resource_group_name: -
        :param schema_id: -
        :param value: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementApiSchemaTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "api_name": api_name,
            "content_type": content_type,
            "resource_group_name": resource_group_name,
            "schema_id": schema_id,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def api_name(self) -> builtins.str:
        result = self._values.get("api_name")
        assert result is not None, "Required property 'api_name' is missing"
        return result

    @builtins.property
    def content_type(self) -> builtins.str:
        result = self._values.get("content_type")
        assert result is not None, "Required property 'content_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def schema_id(self) -> builtins.str:
        result = self._values.get("schema_id")
        assert result is not None, "Required property 'schema_id' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementApiSchemaTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiSchemaConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiSchemaTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementApiSchemaTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiSchemaTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiSubscriptionKeyParameterNames",
    jsii_struct_bases=[],
    name_mapping={"header": "header", "query": "query"},
)
class ApiManagementApiSubscriptionKeyParameterNames:
    def __init__(self, *, header: builtins.str, query: builtins.str) -> None:
        """
        :param header: -
        :param query: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "header": header,
            "query": query,
        }

    @builtins.property
    def header(self) -> builtins.str:
        result = self._values.get("header")
        assert result is not None, "Required property 'header' is missing"
        return result

    @builtins.property
    def query(self) -> builtins.str:
        result = self._values.get("query")
        assert result is not None, "Required property 'query' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiSubscriptionKeyParameterNames(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementApiTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementApiVersionSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementApiVersionSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        versioning_scheme: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementApiVersionSetTimeouts"] = None,
        version_header_name: typing.Optional[builtins.str] = None,
        version_query_name: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param versioning_scheme: -
        :param description: -
        :param timeouts: timeouts block.
        :param version_header_name: -
        :param version_query_name: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementApiVersionSetConfig(
            api_management_name=api_management_name,
            display_name=display_name,
            name=name,
            resource_group_name=resource_group_name,
            versioning_scheme=versioning_scheme,
            description=description,
            timeouts=timeouts,
            version_header_name=version_header_name,
            version_query_name=version_query_name,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementApiVersionSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVersionHeaderName")
    def reset_version_header_name(self) -> None:
        return jsii.invoke(self, "resetVersionHeaderName", [])

    @jsii.member(jsii_name="resetVersionQueryName")
    def reset_version_query_name(self) -> None:
        return jsii.invoke(self, "resetVersionQueryName", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versioningSchemeInput")
    def versioning_scheme_input(self) -> builtins.str:
        return jsii.get(self, "versioningSchemeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementApiVersionSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionHeaderNameInput")
    def version_header_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionHeaderNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionQueryNameInput")
    def version_query_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionQueryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementApiVersionSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementApiVersionSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionHeaderName")
    def version_header_name(self) -> builtins.str:
        return jsii.get(self, "versionHeaderName")

    @version_header_name.setter # type: ignore
    def version_header_name(self, value: builtins.str) -> None:
        jsii.set(self, "versionHeaderName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versioningScheme")
    def versioning_scheme(self) -> builtins.str:
        return jsii.get(self, "versioningScheme")

    @versioning_scheme.setter # type: ignore
    def versioning_scheme(self, value: builtins.str) -> None:
        jsii.set(self, "versioningScheme", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionQueryName")
    def version_query_name(self) -> builtins.str:
        return jsii.get(self, "versionQueryName")

    @version_query_name.setter # type: ignore
    def version_query_name(self, value: builtins.str) -> None:
        jsii.set(self, "versionQueryName", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiVersionSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "display_name": "displayName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "versioning_scheme": "versioningScheme",
        "description": "description",
        "timeouts": "timeouts",
        "version_header_name": "versionHeaderName",
        "version_query_name": "versionQueryName",
    },
)
class ApiManagementApiVersionSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        versioning_scheme: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementApiVersionSetTimeouts"] = None,
        version_header_name: typing.Optional[builtins.str] = None,
        version_query_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param versioning_scheme: -
        :param description: -
        :param timeouts: timeouts block.
        :param version_header_name: -
        :param version_query_name: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementApiVersionSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "display_name": display_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "versioning_scheme": versioning_scheme,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if version_header_name is not None:
            self._values["version_header_name"] = version_header_name
        if version_query_name is not None:
            self._values["version_query_name"] = version_query_name

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def versioning_scheme(self) -> builtins.str:
        result = self._values.get("versioning_scheme")
        assert result is not None, "Required property 'versioning_scheme' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementApiVersionSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def version_header_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version_header_name")
        return result

    @builtins.property
    def version_query_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version_query_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiVersionSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementApiVersionSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementApiVersionSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementApiVersionSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementAuthorizationServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementAuthorizationServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        authorization_endpoint: builtins.str,
        authorization_methods: typing.List[builtins.str],
        client_id: builtins.str,
        client_registration_endpoint: builtins.str,
        display_name: builtins.str,
        grant_types: typing.List[builtins.str],
        name: builtins.str,
        resource_group_name: builtins.str,
        bearer_token_sending_methods: typing.Optional[typing.List[builtins.str]] = None,
        client_authentication_method: typing.Optional[typing.List[builtins.str]] = None,
        client_secret: typing.Optional[builtins.str] = None,
        default_scope: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        resource_owner_password: typing.Optional[builtins.str] = None,
        resource_owner_username: typing.Optional[builtins.str] = None,
        support_state: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementAuthorizationServerTimeouts"] = None,
        token_body_parameter: typing.Optional[typing.List["ApiManagementAuthorizationServerTokenBodyParameter"]] = None,
        token_endpoint: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param authorization_endpoint: -
        :param authorization_methods: -
        :param client_id: -
        :param client_registration_endpoint: -
        :param display_name: -
        :param grant_types: -
        :param name: -
        :param resource_group_name: -
        :param bearer_token_sending_methods: -
        :param client_authentication_method: -
        :param client_secret: -
        :param default_scope: -
        :param description: -
        :param resource_owner_password: -
        :param resource_owner_username: -
        :param support_state: -
        :param timeouts: timeouts block.
        :param token_body_parameter: token_body_parameter block.
        :param token_endpoint: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementAuthorizationServerConfig(
            api_management_name=api_management_name,
            authorization_endpoint=authorization_endpoint,
            authorization_methods=authorization_methods,
            client_id=client_id,
            client_registration_endpoint=client_registration_endpoint,
            display_name=display_name,
            grant_types=grant_types,
            name=name,
            resource_group_name=resource_group_name,
            bearer_token_sending_methods=bearer_token_sending_methods,
            client_authentication_method=client_authentication_method,
            client_secret=client_secret,
            default_scope=default_scope,
            description=description,
            resource_owner_password=resource_owner_password,
            resource_owner_username=resource_owner_username,
            support_state=support_state,
            timeouts=timeouts,
            token_body_parameter=token_body_parameter,
            token_endpoint=token_endpoint,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementAuthorizationServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetBearerTokenSendingMethods")
    def reset_bearer_token_sending_methods(self) -> None:
        return jsii.invoke(self, "resetBearerTokenSendingMethods", [])

    @jsii.member(jsii_name="resetClientAuthenticationMethod")
    def reset_client_authentication_method(self) -> None:
        return jsii.invoke(self, "resetClientAuthenticationMethod", [])

    @jsii.member(jsii_name="resetClientSecret")
    def reset_client_secret(self) -> None:
        return jsii.invoke(self, "resetClientSecret", [])

    @jsii.member(jsii_name="resetDefaultScope")
    def reset_default_scope(self) -> None:
        return jsii.invoke(self, "resetDefaultScope", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetResourceOwnerPassword")
    def reset_resource_owner_password(self) -> None:
        return jsii.invoke(self, "resetResourceOwnerPassword", [])

    @jsii.member(jsii_name="resetResourceOwnerUsername")
    def reset_resource_owner_username(self) -> None:
        return jsii.invoke(self, "resetResourceOwnerUsername", [])

    @jsii.member(jsii_name="resetSupportState")
    def reset_support_state(self) -> None:
        return jsii.invoke(self, "resetSupportState", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTokenBodyParameter")
    def reset_token_body_parameter(self) -> None:
        return jsii.invoke(self, "resetTokenBodyParameter", [])

    @jsii.member(jsii_name="resetTokenEndpoint")
    def reset_token_endpoint(self) -> None:
        return jsii.invoke(self, "resetTokenEndpoint", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationEndpointInput")
    def authorization_endpoint_input(self) -> builtins.str:
        return jsii.get(self, "authorizationEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationMethodsInput")
    def authorization_methods_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "authorizationMethodsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientRegistrationEndpointInput")
    def client_registration_endpoint_input(self) -> builtins.str:
        return jsii.get(self, "clientRegistrationEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="grantTypesInput")
    def grant_types_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "grantTypesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bearerTokenSendingMethodsInput")
    def bearer_token_sending_methods_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "bearerTokenSendingMethodsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAuthenticationMethodInput")
    def client_authentication_method_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "clientAuthenticationMethodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultScopeInput")
    def default_scope_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultScopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceOwnerPasswordInput")
    def resource_owner_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceOwnerPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceOwnerUsernameInput")
    def resource_owner_username_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceOwnerUsernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="supportStateInput")
    def support_state_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "supportStateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementAuthorizationServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tokenBodyParameterInput")
    def token_body_parameter_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementAuthorizationServerTokenBodyParameter"]]:
        return jsii.get(self, "tokenBodyParameterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tokenEndpointInput")
    def token_endpoint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tokenEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationEndpoint")
    def authorization_endpoint(self) -> builtins.str:
        return jsii.get(self, "authorizationEndpoint")

    @authorization_endpoint.setter # type: ignore
    def authorization_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "authorizationEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationMethods")
    def authorization_methods(self) -> typing.List[builtins.str]:
        return jsii.get(self, "authorizationMethods")

    @authorization_methods.setter # type: ignore
    def authorization_methods(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "authorizationMethods", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bearerTokenSendingMethods")
    def bearer_token_sending_methods(self) -> typing.List[builtins.str]:
        return jsii.get(self, "bearerTokenSendingMethods")

    @bearer_token_sending_methods.setter # type: ignore
    def bearer_token_sending_methods(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "bearerTokenSendingMethods", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAuthenticationMethod")
    def client_authentication_method(self) -> typing.List[builtins.str]:
        return jsii.get(self, "clientAuthenticationMethod")

    @client_authentication_method.setter # type: ignore
    def client_authentication_method(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "clientAuthenticationMethod", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientRegistrationEndpoint")
    def client_registration_endpoint(self) -> builtins.str:
        return jsii.get(self, "clientRegistrationEndpoint")

    @client_registration_endpoint.setter # type: ignore
    def client_registration_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "clientRegistrationEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> builtins.str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: builtins.str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultScope")
    def default_scope(self) -> builtins.str:
        return jsii.get(self, "defaultScope")

    @default_scope.setter # type: ignore
    def default_scope(self, value: builtins.str) -> None:
        jsii.set(self, "defaultScope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="grantTypes")
    def grant_types(self) -> typing.List[builtins.str]:
        return jsii.get(self, "grantTypes")

    @grant_types.setter # type: ignore
    def grant_types(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "grantTypes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceOwnerPassword")
    def resource_owner_password(self) -> builtins.str:
        return jsii.get(self, "resourceOwnerPassword")

    @resource_owner_password.setter # type: ignore
    def resource_owner_password(self, value: builtins.str) -> None:
        jsii.set(self, "resourceOwnerPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceOwnerUsername")
    def resource_owner_username(self) -> builtins.str:
        return jsii.get(self, "resourceOwnerUsername")

    @resource_owner_username.setter # type: ignore
    def resource_owner_username(self, value: builtins.str) -> None:
        jsii.set(self, "resourceOwnerUsername", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="supportState")
    def support_state(self) -> builtins.bool:
        return jsii.get(self, "supportState")

    @support_state.setter # type: ignore
    def support_state(self, value: builtins.bool) -> None:
        jsii.set(self, "supportState", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementAuthorizationServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementAuthorizationServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tokenBodyParameter")
    def token_body_parameter(
        self,
    ) -> typing.List["ApiManagementAuthorizationServerTokenBodyParameter"]:
        return jsii.get(self, "tokenBodyParameter")

    @token_body_parameter.setter # type: ignore
    def token_body_parameter(
        self,
        value: typing.List["ApiManagementAuthorizationServerTokenBodyParameter"],
    ) -> None:
        jsii.set(self, "tokenBodyParameter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tokenEndpoint")
    def token_endpoint(self) -> builtins.str:
        return jsii.get(self, "tokenEndpoint")

    @token_endpoint.setter # type: ignore
    def token_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "tokenEndpoint", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementAuthorizationServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "authorization_endpoint": "authorizationEndpoint",
        "authorization_methods": "authorizationMethods",
        "client_id": "clientId",
        "client_registration_endpoint": "clientRegistrationEndpoint",
        "display_name": "displayName",
        "grant_types": "grantTypes",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "bearer_token_sending_methods": "bearerTokenSendingMethods",
        "client_authentication_method": "clientAuthenticationMethod",
        "client_secret": "clientSecret",
        "default_scope": "defaultScope",
        "description": "description",
        "resource_owner_password": "resourceOwnerPassword",
        "resource_owner_username": "resourceOwnerUsername",
        "support_state": "supportState",
        "timeouts": "timeouts",
        "token_body_parameter": "tokenBodyParameter",
        "token_endpoint": "tokenEndpoint",
    },
)
class ApiManagementAuthorizationServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        authorization_endpoint: builtins.str,
        authorization_methods: typing.List[builtins.str],
        client_id: builtins.str,
        client_registration_endpoint: builtins.str,
        display_name: builtins.str,
        grant_types: typing.List[builtins.str],
        name: builtins.str,
        resource_group_name: builtins.str,
        bearer_token_sending_methods: typing.Optional[typing.List[builtins.str]] = None,
        client_authentication_method: typing.Optional[typing.List[builtins.str]] = None,
        client_secret: typing.Optional[builtins.str] = None,
        default_scope: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        resource_owner_password: typing.Optional[builtins.str] = None,
        resource_owner_username: typing.Optional[builtins.str] = None,
        support_state: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementAuthorizationServerTimeouts"] = None,
        token_body_parameter: typing.Optional[typing.List["ApiManagementAuthorizationServerTokenBodyParameter"]] = None,
        token_endpoint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param authorization_endpoint: -
        :param authorization_methods: -
        :param client_id: -
        :param client_registration_endpoint: -
        :param display_name: -
        :param grant_types: -
        :param name: -
        :param resource_group_name: -
        :param bearer_token_sending_methods: -
        :param client_authentication_method: -
        :param client_secret: -
        :param default_scope: -
        :param description: -
        :param resource_owner_password: -
        :param resource_owner_username: -
        :param support_state: -
        :param timeouts: timeouts block.
        :param token_body_parameter: token_body_parameter block.
        :param token_endpoint: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementAuthorizationServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "authorization_endpoint": authorization_endpoint,
            "authorization_methods": authorization_methods,
            "client_id": client_id,
            "client_registration_endpoint": client_registration_endpoint,
            "display_name": display_name,
            "grant_types": grant_types,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if bearer_token_sending_methods is not None:
            self._values["bearer_token_sending_methods"] = bearer_token_sending_methods
        if client_authentication_method is not None:
            self._values["client_authentication_method"] = client_authentication_method
        if client_secret is not None:
            self._values["client_secret"] = client_secret
        if default_scope is not None:
            self._values["default_scope"] = default_scope
        if description is not None:
            self._values["description"] = description
        if resource_owner_password is not None:
            self._values["resource_owner_password"] = resource_owner_password
        if resource_owner_username is not None:
            self._values["resource_owner_username"] = resource_owner_username
        if support_state is not None:
            self._values["support_state"] = support_state
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if token_body_parameter is not None:
            self._values["token_body_parameter"] = token_body_parameter
        if token_endpoint is not None:
            self._values["token_endpoint"] = token_endpoint

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def authorization_endpoint(self) -> builtins.str:
        result = self._values.get("authorization_endpoint")
        assert result is not None, "Required property 'authorization_endpoint' is missing"
        return result

    @builtins.property
    def authorization_methods(self) -> typing.List[builtins.str]:
        result = self._values.get("authorization_methods")
        assert result is not None, "Required property 'authorization_methods' is missing"
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_registration_endpoint(self) -> builtins.str:
        result = self._values.get("client_registration_endpoint")
        assert result is not None, "Required property 'client_registration_endpoint' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def grant_types(self) -> typing.List[builtins.str]:
        result = self._values.get("grant_types")
        assert result is not None, "Required property 'grant_types' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def bearer_token_sending_methods(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("bearer_token_sending_methods")
        return result

    @builtins.property
    def client_authentication_method(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("client_authentication_method")
        return result

    @builtins.property
    def client_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("client_secret")
        return result

    @builtins.property
    def default_scope(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_scope")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def resource_owner_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_owner_password")
        return result

    @builtins.property
    def resource_owner_username(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_owner_username")
        return result

    @builtins.property
    def support_state(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("support_state")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementAuthorizationServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def token_body_parameter(
        self,
    ) -> typing.Optional[typing.List["ApiManagementAuthorizationServerTokenBodyParameter"]]:
        """token_body_parameter block."""
        result = self._values.get("token_body_parameter")
        return result

    @builtins.property
    def token_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("token_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementAuthorizationServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementAuthorizationServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementAuthorizationServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementAuthorizationServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementAuthorizationServerTokenBodyParameter",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "value": "value"},
)
class ApiManagementAuthorizationServerTokenBodyParameter:
    def __init__(self, *, name: builtins.str, value: builtins.str) -> None:
        """
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementAuthorizationServerTokenBodyParameter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementBackend(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementBackend",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        credentials: typing.Optional[typing.List["ApiManagementBackendCredentials"]] = None,
        description: typing.Optional[builtins.str] = None,
        proxy: typing.Optional[typing.List["ApiManagementBackendProxy"]] = None,
        resource_id: typing.Optional[builtins.str] = None,
        service_fabric_cluster: typing.Optional[typing.List["ApiManagementBackendServiceFabricCluster"]] = None,
        timeouts: typing.Optional["ApiManagementBackendTimeouts"] = None,
        title: typing.Optional[builtins.str] = None,
        tls: typing.Optional[typing.List["ApiManagementBackendTls"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param url: -
        :param credentials: credentials block.
        :param description: -
        :param proxy: proxy block.
        :param resource_id: -
        :param service_fabric_cluster: service_fabric_cluster block.
        :param timeouts: timeouts block.
        :param title: -
        :param tls: tls block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementBackendConfig(
            api_management_name=api_management_name,
            name=name,
            protocol=protocol,
            resource_group_name=resource_group_name,
            url=url,
            credentials=credentials,
            description=description,
            proxy=proxy,
            resource_id=resource_id,
            service_fabric_cluster=service_fabric_cluster,
            timeouts=timeouts,
            title=title,
            tls=tls,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementBackend, self, [scope, id, config])

    @jsii.member(jsii_name="resetCredentials")
    def reset_credentials(self) -> None:
        return jsii.invoke(self, "resetCredentials", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetProxy")
    def reset_proxy(self) -> None:
        return jsii.invoke(self, "resetProxy", [])

    @jsii.member(jsii_name="resetResourceId")
    def reset_resource_id(self) -> None:
        return jsii.invoke(self, "resetResourceId", [])

    @jsii.member(jsii_name="resetServiceFabricCluster")
    def reset_service_fabric_cluster(self) -> None:
        return jsii.invoke(self, "resetServiceFabricCluster", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTitle")
    def reset_title(self) -> None:
        return jsii.invoke(self, "resetTitle", [])

    @jsii.member(jsii_name="resetTls")
    def reset_tls(self) -> None:
        return jsii.invoke(self, "resetTls", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolInput")
    def protocol_input(self) -> builtins.str:
        return jsii.get(self, "protocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlInput")
    def url_input(self) -> builtins.str:
        return jsii.get(self, "urlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="credentialsInput")
    def credentials_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementBackendCredentials"]]:
        return jsii.get(self, "credentialsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proxyInput")
    def proxy_input(self) -> typing.Optional[typing.List["ApiManagementBackendProxy"]]:
        return jsii.get(self, "proxyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceIdInput")
    def resource_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceFabricClusterInput")
    def service_fabric_cluster_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementBackendServiceFabricCluster"]]:
        return jsii.get(self, "serviceFabricClusterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementBackendTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="titleInput")
    def title_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "titleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsInput")
    def tls_input(self) -> typing.Optional[typing.List["ApiManagementBackendTls"]]:
        return jsii.get(self, "tlsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="credentials")
    def credentials(self) -> typing.List["ApiManagementBackendCredentials"]:
        return jsii.get(self, "credentials")

    @credentials.setter # type: ignore
    def credentials(
        self,
        value: typing.List["ApiManagementBackendCredentials"],
    ) -> None:
        jsii.set(self, "credentials", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @protocol.setter # type: ignore
    def protocol(self, value: builtins.str) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proxy")
    def proxy(self) -> typing.List["ApiManagementBackendProxy"]:
        return jsii.get(self, "proxy")

    @proxy.setter # type: ignore
    def proxy(self, value: typing.List["ApiManagementBackendProxy"]) -> None:
        jsii.set(self, "proxy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceId")
    def resource_id(self) -> builtins.str:
        return jsii.get(self, "resourceId")

    @resource_id.setter # type: ignore
    def resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "resourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceFabricCluster")
    def service_fabric_cluster(
        self,
    ) -> typing.List["ApiManagementBackendServiceFabricCluster"]:
        return jsii.get(self, "serviceFabricCluster")

    @service_fabric_cluster.setter # type: ignore
    def service_fabric_cluster(
        self,
        value: typing.List["ApiManagementBackendServiceFabricCluster"],
    ) -> None:
        jsii.set(self, "serviceFabricCluster", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementBackendTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementBackendTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="title")
    def title(self) -> builtins.str:
        return jsii.get(self, "title")

    @title.setter # type: ignore
    def title(self, value: builtins.str) -> None:
        jsii.set(self, "title", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tls")
    def tls(self) -> typing.List["ApiManagementBackendTls"]:
        return jsii.get(self, "tls")

    @tls.setter # type: ignore
    def tls(self, value: typing.List["ApiManagementBackendTls"]) -> None:
        jsii.set(self, "tls", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="url")
    def url(self) -> builtins.str:
        return jsii.get(self, "url")

    @url.setter # type: ignore
    def url(self, value: builtins.str) -> None:
        jsii.set(self, "url", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "name": "name",
        "protocol": "protocol",
        "resource_group_name": "resourceGroupName",
        "url": "url",
        "credentials": "credentials",
        "description": "description",
        "proxy": "proxy",
        "resource_id": "resourceId",
        "service_fabric_cluster": "serviceFabricCluster",
        "timeouts": "timeouts",
        "title": "title",
        "tls": "tls",
    },
)
class ApiManagementBackendConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        credentials: typing.Optional[typing.List["ApiManagementBackendCredentials"]] = None,
        description: typing.Optional[builtins.str] = None,
        proxy: typing.Optional[typing.List["ApiManagementBackendProxy"]] = None,
        resource_id: typing.Optional[builtins.str] = None,
        service_fabric_cluster: typing.Optional[typing.List["ApiManagementBackendServiceFabricCluster"]] = None,
        timeouts: typing.Optional["ApiManagementBackendTimeouts"] = None,
        title: typing.Optional[builtins.str] = None,
        tls: typing.Optional[typing.List["ApiManagementBackendTls"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param url: -
        :param credentials: credentials block.
        :param description: -
        :param proxy: proxy block.
        :param resource_id: -
        :param service_fabric_cluster: service_fabric_cluster block.
        :param timeouts: timeouts block.
        :param title: -
        :param tls: tls block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementBackendTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "name": name,
            "protocol": protocol,
            "resource_group_name": resource_group_name,
            "url": url,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if credentials is not None:
            self._values["credentials"] = credentials
        if description is not None:
            self._values["description"] = description
        if proxy is not None:
            self._values["proxy"] = proxy
        if resource_id is not None:
            self._values["resource_id"] = resource_id
        if service_fabric_cluster is not None:
            self._values["service_fabric_cluster"] = service_fabric_cluster
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if title is not None:
            self._values["title"] = title
        if tls is not None:
            self._values["tls"] = tls

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    @builtins.property
    def credentials(
        self,
    ) -> typing.Optional[typing.List["ApiManagementBackendCredentials"]]:
        """credentials block."""
        result = self._values.get("credentials")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def proxy(self) -> typing.Optional[typing.List["ApiManagementBackendProxy"]]:
        """proxy block."""
        result = self._values.get("proxy")
        return result

    @builtins.property
    def resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_id")
        return result

    @builtins.property
    def service_fabric_cluster(
        self,
    ) -> typing.Optional[typing.List["ApiManagementBackendServiceFabricCluster"]]:
        """service_fabric_cluster block."""
        result = self._values.get("service_fabric_cluster")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementBackendTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def title(self) -> typing.Optional[builtins.str]:
        result = self._values.get("title")
        return result

    @builtins.property
    def tls(self) -> typing.Optional[typing.List["ApiManagementBackendTls"]]:
        """tls block."""
        result = self._values.get("tls")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendCredentials",
    jsii_struct_bases=[],
    name_mapping={
        "authorization": "authorization",
        "certificate": "certificate",
        "header": "header",
        "query": "query",
    },
)
class ApiManagementBackendCredentials:
    def __init__(
        self,
        *,
        authorization: typing.Optional[typing.List["ApiManagementBackendCredentialsAuthorization"]] = None,
        certificate: typing.Optional[typing.List[builtins.str]] = None,
        header: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        query: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
    ) -> None:
        """
        :param authorization: authorization block.
        :param certificate: -
        :param header: -
        :param query: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if authorization is not None:
            self._values["authorization"] = authorization
        if certificate is not None:
            self._values["certificate"] = certificate
        if header is not None:
            self._values["header"] = header
        if query is not None:
            self._values["query"] = query

    @builtins.property
    def authorization(
        self,
    ) -> typing.Optional[typing.List["ApiManagementBackendCredentialsAuthorization"]]:
        """authorization block."""
        result = self._values.get("authorization")
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def header(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("header")
        return result

    @builtins.property
    def query(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("query")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendCredentials(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendCredentialsAuthorization",
    jsii_struct_bases=[],
    name_mapping={"parameter": "parameter", "scheme": "scheme"},
)
class ApiManagementBackendCredentialsAuthorization:
    def __init__(
        self,
        *,
        parameter: typing.Optional[builtins.str] = None,
        scheme: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param parameter: -
        :param scheme: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if parameter is not None:
            self._values["parameter"] = parameter
        if scheme is not None:
            self._values["scheme"] = scheme

    @builtins.property
    def parameter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameter")
        return result

    @builtins.property
    def scheme(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scheme")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendCredentialsAuthorization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendProxy",
    jsii_struct_bases=[],
    name_mapping={"url": "url", "username": "username", "password": "password"},
)
class ApiManagementBackendProxy:
    def __init__(
        self,
        *,
        url: builtins.str,
        username: builtins.str,
        password: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param url: -
        :param username: -
        :param password: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "url": url,
            "username": username,
        }
        if password is not None:
            self._values["password"] = password

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendProxy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendServiceFabricCluster",
    jsii_struct_bases=[],
    name_mapping={
        "client_certificate_thumbprint": "clientCertificateThumbprint",
        "management_endpoints": "managementEndpoints",
        "max_partition_resolution_retries": "maxPartitionResolutionRetries",
        "server_certificate_thumbprints": "serverCertificateThumbprints",
        "server_x509_name": "serverX509Name",
    },
)
class ApiManagementBackendServiceFabricCluster:
    def __init__(
        self,
        *,
        client_certificate_thumbprint: builtins.str,
        management_endpoints: typing.List[builtins.str],
        max_partition_resolution_retries: jsii.Number,
        server_certificate_thumbprints: typing.Optional[typing.List[builtins.str]] = None,
        server_x509_name: typing.Optional[typing.List["ApiManagementBackendServiceFabricClusterServerX509Name"]] = None,
    ) -> None:
        """
        :param client_certificate_thumbprint: -
        :param management_endpoints: -
        :param max_partition_resolution_retries: -
        :param server_certificate_thumbprints: -
        :param server_x509_name: server_x509_name block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_certificate_thumbprint": client_certificate_thumbprint,
            "management_endpoints": management_endpoints,
            "max_partition_resolution_retries": max_partition_resolution_retries,
        }
        if server_certificate_thumbprints is not None:
            self._values["server_certificate_thumbprints"] = server_certificate_thumbprints
        if server_x509_name is not None:
            self._values["server_x509_name"] = server_x509_name

    @builtins.property
    def client_certificate_thumbprint(self) -> builtins.str:
        result = self._values.get("client_certificate_thumbprint")
        assert result is not None, "Required property 'client_certificate_thumbprint' is missing"
        return result

    @builtins.property
    def management_endpoints(self) -> typing.List[builtins.str]:
        result = self._values.get("management_endpoints")
        assert result is not None, "Required property 'management_endpoints' is missing"
        return result

    @builtins.property
    def max_partition_resolution_retries(self) -> jsii.Number:
        result = self._values.get("max_partition_resolution_retries")
        assert result is not None, "Required property 'max_partition_resolution_retries' is missing"
        return result

    @builtins.property
    def server_certificate_thumbprints(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("server_certificate_thumbprints")
        return result

    @builtins.property
    def server_x509_name(
        self,
    ) -> typing.Optional[typing.List["ApiManagementBackendServiceFabricClusterServerX509Name"]]:
        """server_x509_name block."""
        result = self._values.get("server_x509_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendServiceFabricCluster(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendServiceFabricClusterServerX509Name",
    jsii_struct_bases=[],
    name_mapping={
        "issuer_certificate_thumbprint": "issuerCertificateThumbprint",
        "name": "name",
    },
)
class ApiManagementBackendServiceFabricClusterServerX509Name:
    def __init__(
        self,
        *,
        issuer_certificate_thumbprint: builtins.str,
        name: builtins.str,
    ) -> None:
        """
        :param issuer_certificate_thumbprint: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "issuer_certificate_thumbprint": issuer_certificate_thumbprint,
            "name": name,
        }

    @builtins.property
    def issuer_certificate_thumbprint(self) -> builtins.str:
        result = self._values.get("issuer_certificate_thumbprint")
        assert result is not None, "Required property 'issuer_certificate_thumbprint' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendServiceFabricClusterServerX509Name(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementBackendTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementBackendTls",
    jsii_struct_bases=[],
    name_mapping={
        "validate_certificate_chain": "validateCertificateChain",
        "validate_certificate_name": "validateCertificateName",
    },
)
class ApiManagementBackendTls:
    def __init__(
        self,
        *,
        validate_certificate_chain: typing.Optional[builtins.bool] = None,
        validate_certificate_name: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param validate_certificate_chain: -
        :param validate_certificate_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if validate_certificate_chain is not None:
            self._values["validate_certificate_chain"] = validate_certificate_chain
        if validate_certificate_name is not None:
            self._values["validate_certificate_name"] = validate_certificate_name

    @builtins.property
    def validate_certificate_chain(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("validate_certificate_chain")
        return result

    @builtins.property
    def validate_certificate_name(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("validate_certificate_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementBackendTls(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCertificate",
    jsii_struct_bases=[],
    name_mapping={
        "certificate_password": "certificatePassword",
        "encoded_certificate": "encodedCertificate",
        "store_name": "storeName",
    },
)
class ApiManagementCertificate:
    def __init__(
        self,
        *,
        certificate_password: builtins.str,
        encoded_certificate: builtins.str,
        store_name: builtins.str,
    ) -> None:
        """
        :param certificate_password: -
        :param encoded_certificate: -
        :param store_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate_password": certificate_password,
            "encoded_certificate": encoded_certificate,
            "store_name": store_name,
        }

    @builtins.property
    def certificate_password(self) -> builtins.str:
        result = self._values.get("certificate_password")
        assert result is not None, "Required property 'certificate_password' is missing"
        return result

    @builtins.property
    def encoded_certificate(self) -> builtins.str:
        result = self._values.get("encoded_certificate")
        assert result is not None, "Required property 'encoded_certificate' is missing"
        return result

    @builtins.property
    def store_name(self) -> builtins.str:
        result = self._values.get("store_name")
        assert result is not None, "Required property 'store_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementCertificateA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementCertificateA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        data: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param data: -
        :param name: -
        :param resource_group_name: -
        :param password: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementCertificateAConfig(
            api_management_name=api_management_name,
            data=data,
            name=name,
            resource_group_name=resource_group_name,
            password=password,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementCertificateA, self, [scope, id, config])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataInput")
    def data_input(self) -> builtins.str:
        return jsii.get(self, "dataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expiration")
    def expiration(self) -> builtins.str:
        return jsii.get(self, "expiration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subject")
    def subject(self) -> builtins.str:
        return jsii.get(self, "subject")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="data")
    def data(self) -> builtins.str:
        return jsii.get(self, "data")

    @data.setter # type: ignore
    def data(self, value: builtins.str) -> None:
        jsii.set(self, "data", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCertificateAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "data": "data",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "password": "password",
        "timeouts": "timeouts",
    },
)
class ApiManagementCertificateAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        data: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param data: -
        :param name: -
        :param resource_group_name: -
        :param password: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "data": data,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if password is not None:
            self._values["password"] = password
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def data(self) -> builtins.str:
        result = self._values.get("data")
        assert result is not None, "Required property 'data' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCertificateAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "publisher_email": "publisherEmail",
        "publisher_name": "publisherName",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "additional_location": "additionalLocation",
        "certificate": "certificate",
        "hostname_configuration": "hostnameConfiguration",
        "identity": "identity",
        "notification_sender_email": "notificationSenderEmail",
        "policy": "policy",
        "protocols": "protocols",
        "security": "security",
        "sign_in": "signIn",
        "sign_up": "signUp",
        "tags": "tags",
        "timeouts": "timeouts",
        "virtual_network_configuration": "virtualNetworkConfiguration",
        "virtual_network_type": "virtualNetworkType",
    },
)
class ApiManagementConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        publisher_email: builtins.str,
        publisher_name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        additional_location: typing.Optional[typing.List[ApiManagementAdditionalLocation]] = None,
        certificate: typing.Optional[typing.List[ApiManagementCertificate]] = None,
        hostname_configuration: typing.Optional[typing.List["ApiManagementHostnameConfiguration"]] = None,
        identity: typing.Optional[typing.List["ApiManagementIdentity"]] = None,
        notification_sender_email: typing.Optional[builtins.str] = None,
        policy: typing.Optional[typing.List["ApiManagementPolicy"]] = None,
        protocols: typing.Optional[typing.List["ApiManagementProtocols"]] = None,
        security: typing.Optional[typing.List["ApiManagementSecurity"]] = None,
        sign_in: typing.Optional[typing.List["ApiManagementSignIn"]] = None,
        sign_up: typing.Optional[typing.List["ApiManagementSignUp"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApiManagementTimeouts"] = None,
        virtual_network_configuration: typing.Optional[typing.List["ApiManagementVirtualNetworkConfiguration"]] = None,
        virtual_network_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param publisher_email: -
        :param publisher_name: -
        :param resource_group_name: -
        :param sku_name: -
        :param additional_location: additional_location block.
        :param certificate: certificate block.
        :param hostname_configuration: hostname_configuration block.
        :param identity: identity block.
        :param notification_sender_email: -
        :param policy: -
        :param protocols: protocols block.
        :param security: security block.
        :param sign_in: sign_in block.
        :param sign_up: sign_up block.
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_network_configuration: virtual_network_configuration block.
        :param virtual_network_type: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "publisher_email": publisher_email,
            "publisher_name": publisher_name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_location is not None:
            self._values["additional_location"] = additional_location
        if certificate is not None:
            self._values["certificate"] = certificate
        if hostname_configuration is not None:
            self._values["hostname_configuration"] = hostname_configuration
        if identity is not None:
            self._values["identity"] = identity
        if notification_sender_email is not None:
            self._values["notification_sender_email"] = notification_sender_email
        if policy is not None:
            self._values["policy"] = policy
        if protocols is not None:
            self._values["protocols"] = protocols
        if security is not None:
            self._values["security"] = security
        if sign_in is not None:
            self._values["sign_in"] = sign_in
        if sign_up is not None:
            self._values["sign_up"] = sign_up
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if virtual_network_configuration is not None:
            self._values["virtual_network_configuration"] = virtual_network_configuration
        if virtual_network_type is not None:
            self._values["virtual_network_type"] = virtual_network_type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def publisher_email(self) -> builtins.str:
        result = self._values.get("publisher_email")
        assert result is not None, "Required property 'publisher_email' is missing"
        return result

    @builtins.property
    def publisher_name(self) -> builtins.str:
        result = self._values.get("publisher_name")
        assert result is not None, "Required property 'publisher_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def additional_location(
        self,
    ) -> typing.Optional[typing.List[ApiManagementAdditionalLocation]]:
        """additional_location block."""
        result = self._values.get("additional_location")
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[typing.List[ApiManagementCertificate]]:
        """certificate block."""
        result = self._values.get("certificate")
        return result

    @builtins.property
    def hostname_configuration(
        self,
    ) -> typing.Optional[typing.List["ApiManagementHostnameConfiguration"]]:
        """hostname_configuration block."""
        result = self._values.get("hostname_configuration")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["ApiManagementIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def notification_sender_email(self) -> typing.Optional[builtins.str]:
        result = self._values.get("notification_sender_email")
        return result

    @builtins.property
    def policy(self) -> typing.Optional[typing.List["ApiManagementPolicy"]]:
        result = self._values.get("policy")
        return result

    @builtins.property
    def protocols(self) -> typing.Optional[typing.List["ApiManagementProtocols"]]:
        """protocols block."""
        result = self._values.get("protocols")
        return result

    @builtins.property
    def security(self) -> typing.Optional[typing.List["ApiManagementSecurity"]]:
        """security block."""
        result = self._values.get("security")
        return result

    @builtins.property
    def sign_in(self) -> typing.Optional[typing.List["ApiManagementSignIn"]]:
        """sign_in block."""
        result = self._values.get("sign_in")
        return result

    @builtins.property
    def sign_up(self) -> typing.Optional[typing.List["ApiManagementSignUp"]]:
        """sign_up block."""
        result = self._values.get("sign_up")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def virtual_network_configuration(
        self,
    ) -> typing.Optional[typing.List["ApiManagementVirtualNetworkConfiguration"]]:
        """virtual_network_configuration block."""
        result = self._values.get("virtual_network_configuration")
        return result

    @builtins.property
    def virtual_network_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementCustomDomain(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementCustomDomain",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_id: builtins.str,
        developer_portal: typing.Optional[typing.List["ApiManagementCustomDomainDeveloperPortal"]] = None,
        management: typing.Optional[typing.List["ApiManagementCustomDomainManagement"]] = None,
        portal: typing.Optional[typing.List["ApiManagementCustomDomainPortal"]] = None,
        proxy: typing.Optional[typing.List["ApiManagementCustomDomainProxy"]] = None,
        scm: typing.Optional[typing.List["ApiManagementCustomDomainScm"]] = None,
        timeouts: typing.Optional["ApiManagementCustomDomainTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_id: -
        :param developer_portal: developer_portal block.
        :param management: management block.
        :param portal: portal block.
        :param proxy: proxy block.
        :param scm: scm block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementCustomDomainConfig(
            api_management_id=api_management_id,
            developer_portal=developer_portal,
            management=management,
            portal=portal,
            proxy=proxy,
            scm=scm,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementCustomDomain, self, [scope, id, config])

    @jsii.member(jsii_name="resetDeveloperPortal")
    def reset_developer_portal(self) -> None:
        return jsii.invoke(self, "resetDeveloperPortal", [])

    @jsii.member(jsii_name="resetManagement")
    def reset_management(self) -> None:
        return jsii.invoke(self, "resetManagement", [])

    @jsii.member(jsii_name="resetPortal")
    def reset_portal(self) -> None:
        return jsii.invoke(self, "resetPortal", [])

    @jsii.member(jsii_name="resetProxy")
    def reset_proxy(self) -> None:
        return jsii.invoke(self, "resetProxy", [])

    @jsii.member(jsii_name="resetScm")
    def reset_scm(self) -> None:
        return jsii.invoke(self, "resetScm", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementIdInput")
    def api_management_id_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerPortalInput")
    def developer_portal_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementCustomDomainDeveloperPortal"]]:
        return jsii.get(self, "developerPortalInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementInput")
    def management_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementCustomDomainManagement"]]:
        return jsii.get(self, "managementInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portalInput")
    def portal_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementCustomDomainPortal"]]:
        return jsii.get(self, "portalInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proxyInput")
    def proxy_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementCustomDomainProxy"]]:
        return jsii.get(self, "proxyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmInput")
    def scm_input(self) -> typing.Optional[typing.List["ApiManagementCustomDomainScm"]]:
        return jsii.get(self, "scmInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementCustomDomainTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementId")
    def api_management_id(self) -> builtins.str:
        return jsii.get(self, "apiManagementId")

    @api_management_id.setter # type: ignore
    def api_management_id(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerPortal")
    def developer_portal(
        self,
    ) -> typing.List["ApiManagementCustomDomainDeveloperPortal"]:
        return jsii.get(self, "developerPortal")

    @developer_portal.setter # type: ignore
    def developer_portal(
        self,
        value: typing.List["ApiManagementCustomDomainDeveloperPortal"],
    ) -> None:
        jsii.set(self, "developerPortal", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="management")
    def management(self) -> typing.List["ApiManagementCustomDomainManagement"]:
        return jsii.get(self, "management")

    @management.setter # type: ignore
    def management(
        self,
        value: typing.List["ApiManagementCustomDomainManagement"],
    ) -> None:
        jsii.set(self, "management", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portal")
    def portal(self) -> typing.List["ApiManagementCustomDomainPortal"]:
        return jsii.get(self, "portal")

    @portal.setter # type: ignore
    def portal(self, value: typing.List["ApiManagementCustomDomainPortal"]) -> None:
        jsii.set(self, "portal", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proxy")
    def proxy(self) -> typing.List["ApiManagementCustomDomainProxy"]:
        return jsii.get(self, "proxy")

    @proxy.setter # type: ignore
    def proxy(self, value: typing.List["ApiManagementCustomDomainProxy"]) -> None:
        jsii.set(self, "proxy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scm")
    def scm(self) -> typing.List["ApiManagementCustomDomainScm"]:
        return jsii.get(self, "scm")

    @scm.setter # type: ignore
    def scm(self, value: typing.List["ApiManagementCustomDomainScm"]) -> None:
        jsii.set(self, "scm", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementCustomDomainTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementCustomDomainTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCustomDomainConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_id": "apiManagementId",
        "developer_portal": "developerPortal",
        "management": "management",
        "portal": "portal",
        "proxy": "proxy",
        "scm": "scm",
        "timeouts": "timeouts",
    },
)
class ApiManagementCustomDomainConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_id: builtins.str,
        developer_portal: typing.Optional[typing.List["ApiManagementCustomDomainDeveloperPortal"]] = None,
        management: typing.Optional[typing.List["ApiManagementCustomDomainManagement"]] = None,
        portal: typing.Optional[typing.List["ApiManagementCustomDomainPortal"]] = None,
        proxy: typing.Optional[typing.List["ApiManagementCustomDomainProxy"]] = None,
        scm: typing.Optional[typing.List["ApiManagementCustomDomainScm"]] = None,
        timeouts: typing.Optional["ApiManagementCustomDomainTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_id: -
        :param developer_portal: developer_portal block.
        :param management: management block.
        :param portal: portal block.
        :param proxy: proxy block.
        :param scm: scm block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementCustomDomainTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_id": api_management_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if developer_portal is not None:
            self._values["developer_portal"] = developer_portal
        if management is not None:
            self._values["management"] = management
        if portal is not None:
            self._values["portal"] = portal
        if proxy is not None:
            self._values["proxy"] = proxy
        if scm is not None:
            self._values["scm"] = scm
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_id(self) -> builtins.str:
        result = self._values.get("api_management_id")
        assert result is not None, "Required property 'api_management_id' is missing"
        return result

    @builtins.property
    def developer_portal(
        self,
    ) -> typing.Optional[typing.List["ApiManagementCustomDomainDeveloperPortal"]]:
        """developer_portal block."""
        result = self._values.get("developer_portal")
        return result

    @builtins.property
    def management(
        self,
    ) -> typing.Optional[typing.List["ApiManagementCustomDomainManagement"]]:
        """management block."""
        result = self._values.get("management")
        return result

    @builtins.property
    def portal(self) -> typing.Optional[typing.List["ApiManagementCustomDomainPortal"]]:
        """portal block."""
        result = self._values.get("portal")
        return result

    @builtins.property
    def proxy(self) -> typing.Optional[typing.List["ApiManagementCustomDomainProxy"]]:
        """proxy block."""
        result = self._values.get("proxy")
        return result

    @builtins.property
    def scm(self) -> typing.Optional[typing.List["ApiManagementCustomDomainScm"]]:
        """scm block."""
        result = self._values.get("scm")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementCustomDomainTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCustomDomainConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCustomDomainDeveloperPortal",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementCustomDomainDeveloperPortal:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCustomDomainDeveloperPortal(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCustomDomainManagement",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementCustomDomainManagement:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCustomDomainManagement(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCustomDomainPortal",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementCustomDomainPortal:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCustomDomainPortal(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCustomDomainProxy",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "default_ssl_binding": "defaultSslBinding",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementCustomDomainProxy:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        default_ssl_binding: typing.Optional[builtins.bool] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param default_ssl_binding: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if default_ssl_binding is not None:
            self._values["default_ssl_binding"] = default_ssl_binding
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def default_ssl_binding(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("default_ssl_binding")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCustomDomainProxy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCustomDomainScm",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementCustomDomainScm:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCustomDomainScm(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementCustomDomainTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementCustomDomainTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementCustomDomainTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementDiagnostic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementDiagnostic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_logger_id: builtins.str,
        api_management_name: builtins.str,
        identifier: builtins.str,
        resource_group_name: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementDiagnosticTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_logger_id: -
        :param api_management_name: -
        :param identifier: -
        :param resource_group_name: -
        :param enabled: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementDiagnosticConfig(
            api_management_logger_id=api_management_logger_id,
            api_management_name=api_management_name,
            identifier=identifier,
            resource_group_name=resource_group_name,
            enabled=enabled,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementDiagnostic, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementLoggerIdInput")
    def api_management_logger_id_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementLoggerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identifierInput")
    def identifier_input(self) -> builtins.str:
        return jsii.get(self, "identifierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementDiagnosticTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementLoggerId")
    def api_management_logger_id(self) -> builtins.str:
        return jsii.get(self, "apiManagementLoggerId")

    @api_management_logger_id.setter # type: ignore
    def api_management_logger_id(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementLoggerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identifier")
    def identifier(self) -> builtins.str:
        return jsii.get(self, "identifier")

    @identifier.setter # type: ignore
    def identifier(self, value: builtins.str) -> None:
        jsii.set(self, "identifier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementDiagnosticTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementDiagnosticTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementDiagnosticConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_logger_id": "apiManagementLoggerId",
        "api_management_name": "apiManagementName",
        "identifier": "identifier",
        "resource_group_name": "resourceGroupName",
        "enabled": "enabled",
        "timeouts": "timeouts",
    },
)
class ApiManagementDiagnosticConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_logger_id: builtins.str,
        api_management_name: builtins.str,
        identifier: builtins.str,
        resource_group_name: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ApiManagementDiagnosticTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_logger_id: -
        :param api_management_name: -
        :param identifier: -
        :param resource_group_name: -
        :param enabled: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementDiagnosticTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_logger_id": api_management_logger_id,
            "api_management_name": api_management_name,
            "identifier": identifier,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enabled is not None:
            self._values["enabled"] = enabled
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_logger_id(self) -> builtins.str:
        result = self._values.get("api_management_logger_id")
        assert result is not None, "Required property 'api_management_logger_id' is missing"
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def identifier(self) -> builtins.str:
        result = self._values.get("identifier")
        assert result is not None, "Required property 'identifier' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementDiagnosticTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementDiagnosticConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementDiagnosticTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementDiagnosticTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementDiagnosticTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        external_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementGroupTimeouts"] = None,
        type: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param external_id: -
        :param timeouts: timeouts block.
        :param type: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementGroupConfig(
            api_management_name=api_management_name,
            display_name=display_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            external_id=external_id,
            timeouts=timeouts,
            type=type,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetExternalId")
    def reset_external_id(self) -> None:
        return jsii.invoke(self, "resetExternalId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetType")
    def reset_type(self) -> None:
        return jsii.invoke(self, "resetType", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="externalIdInput")
    def external_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "externalIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="externalId")
    def external_id(self) -> builtins.str:
        return jsii.get(self, "externalId")

    @external_id.setter # type: ignore
    def external_id(self, value: builtins.str) -> None:
        jsii.set(self, "externalId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "display_name": "displayName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "external_id": "externalId",
        "timeouts": "timeouts",
        "type": "type",
    },
)
class ApiManagementGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        external_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementGroupTimeouts"] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param external_id: -
        :param timeouts: timeouts block.
        :param type: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "display_name": display_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if external_id is not None:
            self._values["external_id"] = external_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def external_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("external_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementGroupUser(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementGroupUser",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        group_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        timeouts: typing.Optional["ApiManagementGroupUserTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param group_name: -
        :param resource_group_name: -
        :param user_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementGroupUserConfig(
            api_management_name=api_management_name,
            group_name=group_name,
            resource_group_name=resource_group_name,
            user_id=user_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementGroupUser, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupNameInput")
    def group_name_input(self) -> builtins.str:
        return jsii.get(self, "groupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userIdInput")
    def user_id_input(self) -> builtins.str:
        return jsii.get(self, "userIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementGroupUserTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupName")
    def group_name(self) -> builtins.str:
        return jsii.get(self, "groupName")

    @group_name.setter # type: ignore
    def group_name(self, value: builtins.str) -> None:
        jsii.set(self, "groupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementGroupUserTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementGroupUserTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userId")
    def user_id(self) -> builtins.str:
        return jsii.get(self, "userId")

    @user_id.setter # type: ignore
    def user_id(self, value: builtins.str) -> None:
        jsii.set(self, "userId", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementGroupUserConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "group_name": "groupName",
        "resource_group_name": "resourceGroupName",
        "user_id": "userId",
        "timeouts": "timeouts",
    },
)
class ApiManagementGroupUserConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        group_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        timeouts: typing.Optional["ApiManagementGroupUserTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param group_name: -
        :param resource_group_name: -
        :param user_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementGroupUserTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "group_name": group_name,
            "resource_group_name": resource_group_name,
            "user_id": user_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def group_name(self) -> builtins.str:
        result = self._values.get("group_name")
        assert result is not None, "Required property 'group_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def user_id(self) -> builtins.str:
        result = self._values.get("user_id")
        assert result is not None, "Required property 'user_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementGroupUserTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementGroupUserConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementGroupUserTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementGroupUserTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementGroupUserTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementHostnameConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "developer_portal": "developerPortal",
        "management": "management",
        "portal": "portal",
        "proxy": "proxy",
        "scm": "scm",
    },
)
class ApiManagementHostnameConfiguration:
    def __init__(
        self,
        *,
        developer_portal: typing.Optional[typing.List["ApiManagementHostnameConfigurationDeveloperPortal"]] = None,
        management: typing.Optional[typing.List["ApiManagementHostnameConfigurationManagement"]] = None,
        portal: typing.Optional[typing.List["ApiManagementHostnameConfigurationPortal"]] = None,
        proxy: typing.Optional[typing.List["ApiManagementHostnameConfigurationProxy"]] = None,
        scm: typing.Optional[typing.List["ApiManagementHostnameConfigurationScm"]] = None,
    ) -> None:
        """
        :param developer_portal: developer_portal block.
        :param management: management block.
        :param portal: portal block.
        :param proxy: proxy block.
        :param scm: scm block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if developer_portal is not None:
            self._values["developer_portal"] = developer_portal
        if management is not None:
            self._values["management"] = management
        if portal is not None:
            self._values["portal"] = portal
        if proxy is not None:
            self._values["proxy"] = proxy
        if scm is not None:
            self._values["scm"] = scm

    @builtins.property
    def developer_portal(
        self,
    ) -> typing.Optional[typing.List["ApiManagementHostnameConfigurationDeveloperPortal"]]:
        """developer_portal block."""
        result = self._values.get("developer_portal")
        return result

    @builtins.property
    def management(
        self,
    ) -> typing.Optional[typing.List["ApiManagementHostnameConfigurationManagement"]]:
        """management block."""
        result = self._values.get("management")
        return result

    @builtins.property
    def portal(
        self,
    ) -> typing.Optional[typing.List["ApiManagementHostnameConfigurationPortal"]]:
        """portal block."""
        result = self._values.get("portal")
        return result

    @builtins.property
    def proxy(
        self,
    ) -> typing.Optional[typing.List["ApiManagementHostnameConfigurationProxy"]]:
        """proxy block."""
        result = self._values.get("proxy")
        return result

    @builtins.property
    def scm(
        self,
    ) -> typing.Optional[typing.List["ApiManagementHostnameConfigurationScm"]]:
        """scm block."""
        result = self._values.get("scm")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementHostnameConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementHostnameConfigurationDeveloperPortal",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementHostnameConfigurationDeveloperPortal:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementHostnameConfigurationDeveloperPortal(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementHostnameConfigurationManagement",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementHostnameConfigurationManagement:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementHostnameConfigurationManagement(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementHostnameConfigurationPortal",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementHostnameConfigurationPortal:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementHostnameConfigurationPortal(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementHostnameConfigurationProxy",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "default_ssl_binding": "defaultSslBinding",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementHostnameConfigurationProxy:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        default_ssl_binding: typing.Optional[builtins.bool] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param default_ssl_binding: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if default_ssl_binding is not None:
            self._values["default_ssl_binding"] = default_ssl_binding
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def default_ssl_binding(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("default_ssl_binding")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementHostnameConfigurationProxy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementHostnameConfigurationScm",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "certificate": "certificate",
        "certificate_password": "certificatePassword",
        "key_vault_id": "keyVaultId",
        "negotiate_client_certificate": "negotiateClientCertificate",
    },
)
class ApiManagementHostnameConfigurationScm:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        certificate: typing.Optional[builtins.str] = None,
        certificate_password: typing.Optional[builtins.str] = None,
        key_vault_id: typing.Optional[builtins.str] = None,
        negotiate_client_certificate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param host_name: -
        :param certificate: -
        :param certificate_password: -
        :param key_vault_id: -
        :param negotiate_client_certificate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
        }
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_password is not None:
            self._values["certificate_password"] = certificate_password
        if key_vault_id is not None:
            self._values["key_vault_id"] = key_vault_id
        if negotiate_client_certificate is not None:
            self._values["negotiate_client_certificate"] = negotiate_client_certificate

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_password")
        return result

    @builtins.property
    def key_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_id")
        return result

    @builtins.property
    def negotiate_client_certificate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negotiate_client_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementHostnameConfigurationScm(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentity",
    jsii_struct_bases=[],
    name_mapping={"identity_ids": "identityIds", "type": "type"},
)
class ApiManagementIdentity:
    def __init__(
        self,
        *,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param identity_ids: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementIdentityProviderAad(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementIdentityProviderAad",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        allowed_tenants: typing.List[builtins.str],
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        resource_group_name: builtins.str,
        signin_tenant: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementIdentityProviderAadTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param allowed_tenants: -
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param resource_group_name: -
        :param signin_tenant: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementIdentityProviderAadConfig(
            allowed_tenants=allowed_tenants,
            api_management_name=api_management_name,
            client_id=client_id,
            client_secret=client_secret,
            resource_group_name=resource_group_name,
            signin_tenant=signin_tenant,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementIdentityProviderAad, self, [scope, id, config])

    @jsii.member(jsii_name="resetSigninTenant")
    def reset_signin_tenant(self) -> None:
        return jsii.invoke(self, "resetSigninTenant", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedTenantsInput")
    def allowed_tenants_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedTenantsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> builtins.str:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signinTenantInput")
    def signin_tenant_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "signinTenantInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderAadTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedTenants")
    def allowed_tenants(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedTenants")

    @allowed_tenants.setter # type: ignore
    def allowed_tenants(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "allowedTenants", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> builtins.str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: builtins.str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signinTenant")
    def signin_tenant(self) -> builtins.str:
        return jsii.get(self, "signinTenant")

    @signin_tenant.setter # type: ignore
    def signin_tenant(self, value: builtins.str) -> None:
        jsii.set(self, "signinTenant", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementIdentityProviderAadTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementIdentityProviderAadTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderAadConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "allowed_tenants": "allowedTenants",
        "api_management_name": "apiManagementName",
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "resource_group_name": "resourceGroupName",
        "signin_tenant": "signinTenant",
        "timeouts": "timeouts",
    },
)
class ApiManagementIdentityProviderAadConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        allowed_tenants: typing.List[builtins.str],
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        resource_group_name: builtins.str,
        signin_tenant: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementIdentityProviderAadTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param allowed_tenants: -
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param resource_group_name: -
        :param signin_tenant: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementIdentityProviderAadTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_tenants": allowed_tenants,
            "api_management_name": api_management_name,
            "client_id": client_id,
            "client_secret": client_secret,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if signin_tenant is not None:
            self._values["signin_tenant"] = signin_tenant
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def allowed_tenants(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_tenants")
        assert result is not None, "Required property 'allowed_tenants' is missing"
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def signin_tenant(self) -> typing.Optional[builtins.str]:
        result = self._values.get("signin_tenant")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementIdentityProviderAadTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderAadConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderAadTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementIdentityProviderAadTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderAadTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementIdentityProviderFacebook(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementIdentityProviderFacebook",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        app_id: builtins.str,
        app_secret: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderFacebookTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param app_id: -
        :param app_secret: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementIdentityProviderFacebookConfig(
            api_management_name=api_management_name,
            app_id=app_id,
            app_secret=app_secret,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementIdentityProviderFacebook, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appIdInput")
    def app_id_input(self) -> builtins.str:
        return jsii.get(self, "appIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSecretInput")
    def app_secret_input(self) -> builtins.str:
        return jsii.get(self, "appSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderFacebookTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appId")
    def app_id(self) -> builtins.str:
        return jsii.get(self, "appId")

    @app_id.setter # type: ignore
    def app_id(self, value: builtins.str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSecret")
    def app_secret(self) -> builtins.str:
        return jsii.get(self, "appSecret")

    @app_secret.setter # type: ignore
    def app_secret(self, value: builtins.str) -> None:
        jsii.set(self, "appSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementIdentityProviderFacebookTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementIdentityProviderFacebookTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderFacebookConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "app_id": "appId",
        "app_secret": "appSecret",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class ApiManagementIdentityProviderFacebookConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        app_id: builtins.str,
        app_secret: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderFacebookTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param app_id: -
        :param app_secret: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementIdentityProviderFacebookTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "app_id": app_id,
            "app_secret": app_secret,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def app_id(self) -> builtins.str:
        result = self._values.get("app_id")
        assert result is not None, "Required property 'app_id' is missing"
        return result

    @builtins.property
    def app_secret(self) -> builtins.str:
        result = self._values.get("app_secret")
        assert result is not None, "Required property 'app_secret' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderFacebookTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderFacebookConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderFacebookTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementIdentityProviderFacebookTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderFacebookTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementIdentityProviderGoogle(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementIdentityProviderGoogle",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderGoogleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementIdentityProviderGoogleConfig(
            api_management_name=api_management_name,
            client_id=client_id,
            client_secret=client_secret,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementIdentityProviderGoogle, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> builtins.str:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderGoogleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> builtins.str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: builtins.str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementIdentityProviderGoogleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementIdentityProviderGoogleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderGoogleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class ApiManagementIdentityProviderGoogleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderGoogleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementIdentityProviderGoogleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "client_id": client_id,
            "client_secret": client_secret,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderGoogleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderGoogleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderGoogleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementIdentityProviderGoogleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderGoogleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementIdentityProviderMicrosoft(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementIdentityProviderMicrosoft",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderMicrosoftTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementIdentityProviderMicrosoftConfig(
            api_management_name=api_management_name,
            client_id=client_id,
            client_secret=client_secret,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementIdentityProviderMicrosoft, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> builtins.str:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderMicrosoftTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> builtins.str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: builtins.str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementIdentityProviderMicrosoftTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementIdentityProviderMicrosoftTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderMicrosoftConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class ApiManagementIdentityProviderMicrosoftConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderMicrosoftTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementIdentityProviderMicrosoftTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "client_id": client_id,
            "client_secret": client_secret,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderMicrosoftTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderMicrosoftConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderMicrosoftTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementIdentityProviderMicrosoftTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderMicrosoftTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementIdentityProviderTwitter(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementIdentityProviderTwitter",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_key: builtins.str,
        api_management_name: builtins.str,
        api_secret_key: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderTwitterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_key: -
        :param api_management_name: -
        :param api_secret_key: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementIdentityProviderTwitterConfig(
            api_key=api_key,
            api_management_name=api_management_name,
            api_secret_key=api_secret_key,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementIdentityProviderTwitter, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiKeyInput")
    def api_key_input(self) -> builtins.str:
        return jsii.get(self, "apiKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiSecretKeyInput")
    def api_secret_key_input(self) -> builtins.str:
        return jsii.get(self, "apiSecretKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderTwitterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiKey")
    def api_key(self) -> builtins.str:
        return jsii.get(self, "apiKey")

    @api_key.setter # type: ignore
    def api_key(self, value: builtins.str) -> None:
        jsii.set(self, "apiKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiSecretKey")
    def api_secret_key(self) -> builtins.str:
        return jsii.get(self, "apiSecretKey")

    @api_secret_key.setter # type: ignore
    def api_secret_key(self, value: builtins.str) -> None:
        jsii.set(self, "apiSecretKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementIdentityProviderTwitterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementIdentityProviderTwitterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderTwitterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_key": "apiKey",
        "api_management_name": "apiManagementName",
        "api_secret_key": "apiSecretKey",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class ApiManagementIdentityProviderTwitterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_key: builtins.str,
        api_management_name: builtins.str,
        api_secret_key: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementIdentityProviderTwitterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_key: -
        :param api_management_name: -
        :param api_secret_key: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementIdentityProviderTwitterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_key": api_key,
            "api_management_name": api_management_name,
            "api_secret_key": api_secret_key,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_key(self) -> builtins.str:
        result = self._values.get("api_key")
        assert result is not None, "Required property 'api_key' is missing"
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def api_secret_key(self) -> builtins.str:
        result = self._values.get("api_secret_key")
        assert result is not None, "Required property 'api_secret_key' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["ApiManagementIdentityProviderTwitterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderTwitterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementIdentityProviderTwitterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementIdentityProviderTwitterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementIdentityProviderTwitterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementLogger(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementLogger",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        application_insights: typing.Optional[typing.List["ApiManagementLoggerApplicationInsights"]] = None,
        buffered: typing.Optional[builtins.bool] = None,
        description: typing.Optional[builtins.str] = None,
        eventhub: typing.Optional[typing.List["ApiManagementLoggerEventhub"]] = None,
        timeouts: typing.Optional["ApiManagementLoggerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param application_insights: application_insights block.
        :param buffered: -
        :param description: -
        :param eventhub: eventhub block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementLoggerConfig(
            api_management_name=api_management_name,
            name=name,
            resource_group_name=resource_group_name,
            application_insights=application_insights,
            buffered=buffered,
            description=description,
            eventhub=eventhub,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementLogger, self, [scope, id, config])

    @jsii.member(jsii_name="resetApplicationInsights")
    def reset_application_insights(self) -> None:
        return jsii.invoke(self, "resetApplicationInsights", [])

    @jsii.member(jsii_name="resetBuffered")
    def reset_buffered(self) -> None:
        return jsii.invoke(self, "resetBuffered", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEventhub")
    def reset_eventhub(self) -> None:
        return jsii.invoke(self, "resetEventhub", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsInput")
    def application_insights_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementLoggerApplicationInsights"]]:
        return jsii.get(self, "applicationInsightsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bufferedInput")
    def buffered_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "bufferedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubInput")
    def eventhub_input(
        self,
    ) -> typing.Optional[typing.List["ApiManagementLoggerEventhub"]]:
        return jsii.get(self, "eventhubInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementLoggerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsights")
    def application_insights(
        self,
    ) -> typing.List["ApiManagementLoggerApplicationInsights"]:
        return jsii.get(self, "applicationInsights")

    @application_insights.setter # type: ignore
    def application_insights(
        self,
        value: typing.List["ApiManagementLoggerApplicationInsights"],
    ) -> None:
        jsii.set(self, "applicationInsights", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="buffered")
    def buffered(self) -> builtins.bool:
        return jsii.get(self, "buffered")

    @buffered.setter # type: ignore
    def buffered(self, value: builtins.bool) -> None:
        jsii.set(self, "buffered", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhub")
    def eventhub(self) -> typing.List["ApiManagementLoggerEventhub"]:
        return jsii.get(self, "eventhub")

    @eventhub.setter # type: ignore
    def eventhub(self, value: typing.List["ApiManagementLoggerEventhub"]) -> None:
        jsii.set(self, "eventhub", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementLoggerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementLoggerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementLoggerApplicationInsights",
    jsii_struct_bases=[],
    name_mapping={"instrumentation_key": "instrumentationKey"},
)
class ApiManagementLoggerApplicationInsights:
    def __init__(self, *, instrumentation_key: builtins.str) -> None:
        """
        :param instrumentation_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "instrumentation_key": instrumentation_key,
        }

    @builtins.property
    def instrumentation_key(self) -> builtins.str:
        result = self._values.get("instrumentation_key")
        assert result is not None, "Required property 'instrumentation_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementLoggerApplicationInsights(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementLoggerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "application_insights": "applicationInsights",
        "buffered": "buffered",
        "description": "description",
        "eventhub": "eventhub",
        "timeouts": "timeouts",
    },
)
class ApiManagementLoggerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        application_insights: typing.Optional[typing.List[ApiManagementLoggerApplicationInsights]] = None,
        buffered: typing.Optional[builtins.bool] = None,
        description: typing.Optional[builtins.str] = None,
        eventhub: typing.Optional[typing.List["ApiManagementLoggerEventhub"]] = None,
        timeouts: typing.Optional["ApiManagementLoggerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param application_insights: application_insights block.
        :param buffered: -
        :param description: -
        :param eventhub: eventhub block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementLoggerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if application_insights is not None:
            self._values["application_insights"] = application_insights
        if buffered is not None:
            self._values["buffered"] = buffered
        if description is not None:
            self._values["description"] = description
        if eventhub is not None:
            self._values["eventhub"] = eventhub
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def application_insights(
        self,
    ) -> typing.Optional[typing.List[ApiManagementLoggerApplicationInsights]]:
        """application_insights block."""
        result = self._values.get("application_insights")
        return result

    @builtins.property
    def buffered(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("buffered")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def eventhub(self) -> typing.Optional[typing.List["ApiManagementLoggerEventhub"]]:
        """eventhub block."""
        result = self._values.get("eventhub")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementLoggerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementLoggerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementLoggerEventhub",
    jsii_struct_bases=[],
    name_mapping={"connection_string": "connectionString", "name": "name"},
)
class ApiManagementLoggerEventhub:
    def __init__(self, *, connection_string: builtins.str, name: builtins.str) -> None:
        """
        :param connection_string: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "name": name,
        }

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementLoggerEventhub(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementLoggerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementLoggerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementLoggerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementNamedValue(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementNamedValue",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        value: builtins.str,
        secret: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ApiManagementNamedValueTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param value: -
        :param secret: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementNamedValueConfig(
            api_management_name=api_management_name,
            display_name=display_name,
            name=name,
            resource_group_name=resource_group_name,
            value=value,
            secret=secret,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementNamedValue, self, [scope, id, config])

    @jsii.member(jsii_name="resetSecret")
    def reset_secret(self) -> None:
        return jsii.invoke(self, "resetSecret", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretInput")
    def secret_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "secretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementNamedValueTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.bool:
        return jsii.get(self, "secret")

    @secret.setter # type: ignore
    def secret(self, value: builtins.bool) -> None:
        jsii.set(self, "secret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.List[builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementNamedValueTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementNamedValueTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementNamedValueConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "display_name": "displayName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "value": "value",
        "secret": "secret",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ApiManagementNamedValueConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        value: builtins.str,
        secret: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ApiManagementNamedValueTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param value: -
        :param secret: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementNamedValueTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "display_name": display_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if secret is not None:
            self._values["secret"] = secret
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def secret(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("secret")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementNamedValueTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementNamedValueConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementNamedValueTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementNamedValueTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementNamedValueTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementOpenidConnectProvider(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementOpenidConnectProvider",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        display_name: builtins.str,
        metadata_endpoint: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementOpenidConnectProviderTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param display_name: -
        :param metadata_endpoint: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementOpenidConnectProviderConfig(
            api_management_name=api_management_name,
            client_id=client_id,
            client_secret=client_secret,
            display_name=display_name,
            metadata_endpoint=metadata_endpoint,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementOpenidConnectProvider, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> builtins.str:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataEndpointInput")
    def metadata_endpoint_input(self) -> builtins.str:
        return jsii.get(self, "metadataEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApiManagementOpenidConnectProviderTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> builtins.str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: builtins.str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataEndpoint")
    def metadata_endpoint(self) -> builtins.str:
        return jsii.get(self, "metadataEndpoint")

    @metadata_endpoint.setter # type: ignore
    def metadata_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "metadataEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementOpenidConnectProviderTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementOpenidConnectProviderTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementOpenidConnectProviderConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "display_name": "displayName",
        "metadata_endpoint": "metadataEndpoint",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class ApiManagementOpenidConnectProviderConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        display_name: builtins.str,
        metadata_endpoint: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementOpenidConnectProviderTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param client_id: -
        :param client_secret: -
        :param display_name: -
        :param metadata_endpoint: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementOpenidConnectProviderTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "client_id": client_id,
            "client_secret": client_secret,
            "display_name": display_name,
            "metadata_endpoint": metadata_endpoint,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def metadata_endpoint(self) -> builtins.str:
        result = self._values.get("metadata_endpoint")
        assert result is not None, "Required property 'metadata_endpoint' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementOpenidConnectProviderTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementOpenidConnectProviderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementOpenidConnectProviderTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementOpenidConnectProviderTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementOpenidConnectProviderTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementPolicy",
    jsii_struct_bases=[],
    name_mapping={"xml_content": "xmlContent", "xml_link": "xmlLink"},
)
class ApiManagementPolicy:
    def __init__(
        self,
        *,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param xml_content: -
        :param xml_link: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if xml_content is not None:
            self._values["xml_content"] = xml_content
        if xml_link is not None:
            self._values["xml_link"] = xml_link

    @builtins.property
    def xml_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_content")
        return result

    @builtins.property
    def xml_link(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_link")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementPolicyA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementPolicyA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_id: builtins.str,
        timeouts: typing.Optional["ApiManagementPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_id: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementPolicyAConfig(
            api_management_id=api_management_id,
            timeouts=timeouts,
            xml_content=xml_content,
            xml_link=xml_link,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementPolicyA, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetXmlContent")
    def reset_xml_content(self) -> None:
        return jsii.invoke(self, "resetXmlContent", [])

    @jsii.member(jsii_name="resetXmlLink")
    def reset_xml_link(self) -> None:
        return jsii.invoke(self, "resetXmlLink", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementIdInput")
    def api_management_id_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContentInput")
    def xml_content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLinkInput")
    def xml_link_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlLinkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementId")
    def api_management_id(self) -> builtins.str:
        return jsii.get(self, "apiManagementId")

    @api_management_id.setter # type: ignore
    def api_management_id(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContent")
    def xml_content(self) -> builtins.str:
        return jsii.get(self, "xmlContent")

    @xml_content.setter # type: ignore
    def xml_content(self, value: builtins.str) -> None:
        jsii.set(self, "xmlContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLink")
    def xml_link(self) -> builtins.str:
        return jsii.get(self, "xmlLink")

    @xml_link.setter # type: ignore
    def xml_link(self, value: builtins.str) -> None:
        jsii.set(self, "xmlLink", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementPolicyAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_id": "apiManagementId",
        "timeouts": "timeouts",
        "xml_content": "xmlContent",
        "xml_link": "xmlLink",
    },
)
class ApiManagementPolicyAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_id: builtins.str,
        timeouts: typing.Optional["ApiManagementPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_id: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_id": api_management_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if xml_content is not None:
            self._values["xml_content"] = xml_content
        if xml_link is not None:
            self._values["xml_link"] = xml_link

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_id(self) -> builtins.str:
        result = self._values.get("api_management_id")
        assert result is not None, "Required property 'api_management_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def xml_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_content")
        return result

    @builtins.property
    def xml_link(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_link")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementPolicyAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementProduct(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementProduct",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        display_name: builtins.str,
        product_id: builtins.str,
        published: builtins.bool,
        resource_group_name: builtins.str,
        subscription_required: builtins.bool,
        approval_required: typing.Optional[builtins.bool] = None,
        description: typing.Optional[builtins.str] = None,
        subscriptions_limit: typing.Optional[jsii.Number] = None,
        terms: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementProductTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param display_name: -
        :param product_id: -
        :param published: -
        :param resource_group_name: -
        :param subscription_required: -
        :param approval_required: -
        :param description: -
        :param subscriptions_limit: -
        :param terms: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementProductConfig(
            api_management_name=api_management_name,
            display_name=display_name,
            product_id=product_id,
            published=published,
            resource_group_name=resource_group_name,
            subscription_required=subscription_required,
            approval_required=approval_required,
            description=description,
            subscriptions_limit=subscriptions_limit,
            terms=terms,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementProduct, self, [scope, id, config])

    @jsii.member(jsii_name="resetApprovalRequired")
    def reset_approval_required(self) -> None:
        return jsii.invoke(self, "resetApprovalRequired", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetSubscriptionsLimit")
    def reset_subscriptions_limit(self) -> None:
        return jsii.invoke(self, "resetSubscriptionsLimit", [])

    @jsii.member(jsii_name="resetTerms")
    def reset_terms(self) -> None:
        return jsii.invoke(self, "resetTerms", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productIdInput")
    def product_id_input(self) -> builtins.str:
        return jsii.get(self, "productIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publishedInput")
    def published_input(self) -> builtins.bool:
        return jsii.get(self, "publishedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionRequiredInput")
    def subscription_required_input(self) -> builtins.bool:
        return jsii.get(self, "subscriptionRequiredInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="approvalRequiredInput")
    def approval_required_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "approvalRequiredInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionsLimitInput")
    def subscriptions_limit_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "subscriptionsLimitInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="termsInput")
    def terms_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "termsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementProductTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="approvalRequired")
    def approval_required(self) -> builtins.bool:
        return jsii.get(self, "approvalRequired")

    @approval_required.setter # type: ignore
    def approval_required(self, value: builtins.bool) -> None:
        jsii.set(self, "approvalRequired", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productId")
    def product_id(self) -> builtins.str:
        return jsii.get(self, "productId")

    @product_id.setter # type: ignore
    def product_id(self, value: builtins.str) -> None:
        jsii.set(self, "productId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="published")
    def published(self) -> builtins.bool:
        return jsii.get(self, "published")

    @published.setter # type: ignore
    def published(self, value: builtins.bool) -> None:
        jsii.set(self, "published", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionRequired")
    def subscription_required(self) -> builtins.bool:
        return jsii.get(self, "subscriptionRequired")

    @subscription_required.setter # type: ignore
    def subscription_required(self, value: builtins.bool) -> None:
        jsii.set(self, "subscriptionRequired", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionsLimit")
    def subscriptions_limit(self) -> jsii.Number:
        return jsii.get(self, "subscriptionsLimit")

    @subscriptions_limit.setter # type: ignore
    def subscriptions_limit(self, value: jsii.Number) -> None:
        jsii.set(self, "subscriptionsLimit", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terms")
    def terms(self) -> builtins.str:
        return jsii.get(self, "terms")

    @terms.setter # type: ignore
    def terms(self, value: builtins.str) -> None:
        jsii.set(self, "terms", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementProductTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementProductTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class ApiManagementProductApi(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementProductApi",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        api_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementProductApiTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param api_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementProductApiConfig(
            api_management_name=api_management_name,
            api_name=api_name,
            product_id=product_id,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementProductApi, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiNameInput")
    def api_name_input(self) -> builtins.str:
        return jsii.get(self, "apiNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productIdInput")
    def product_id_input(self) -> builtins.str:
        return jsii.get(self, "productIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementProductApiTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiName")
    def api_name(self) -> builtins.str:
        return jsii.get(self, "apiName")

    @api_name.setter # type: ignore
    def api_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productId")
    def product_id(self) -> builtins.str:
        return jsii.get(self, "productId")

    @product_id.setter # type: ignore
    def product_id(self, value: builtins.str) -> None:
        jsii.set(self, "productId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementProductApiTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementProductApiTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductApiConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "api_name": "apiName",
        "product_id": "productId",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class ApiManagementProductApiConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        api_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementProductApiTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param api_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementProductApiTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "api_name": api_name,
            "product_id": product_id,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def api_name(self) -> builtins.str:
        result = self._values.get("api_name")
        assert result is not None, "Required property 'api_name' is missing"
        return result

    @builtins.property
    def product_id(self) -> builtins.str:
        result = self._values.get("product_id")
        assert result is not None, "Required property 'product_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementProductApiTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductApiConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductApiTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementProductApiTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductApiTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "display_name": "displayName",
        "product_id": "productId",
        "published": "published",
        "resource_group_name": "resourceGroupName",
        "subscription_required": "subscriptionRequired",
        "approval_required": "approvalRequired",
        "description": "description",
        "subscriptions_limit": "subscriptionsLimit",
        "terms": "terms",
        "timeouts": "timeouts",
    },
)
class ApiManagementProductConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        display_name: builtins.str,
        product_id: builtins.str,
        published: builtins.bool,
        resource_group_name: builtins.str,
        subscription_required: builtins.bool,
        approval_required: typing.Optional[builtins.bool] = None,
        description: typing.Optional[builtins.str] = None,
        subscriptions_limit: typing.Optional[jsii.Number] = None,
        terms: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementProductTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param display_name: -
        :param product_id: -
        :param published: -
        :param resource_group_name: -
        :param subscription_required: -
        :param approval_required: -
        :param description: -
        :param subscriptions_limit: -
        :param terms: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementProductTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "display_name": display_name,
            "product_id": product_id,
            "published": published,
            "resource_group_name": resource_group_name,
            "subscription_required": subscription_required,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if approval_required is not None:
            self._values["approval_required"] = approval_required
        if description is not None:
            self._values["description"] = description
        if subscriptions_limit is not None:
            self._values["subscriptions_limit"] = subscriptions_limit
        if terms is not None:
            self._values["terms"] = terms
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def product_id(self) -> builtins.str:
        result = self._values.get("product_id")
        assert result is not None, "Required property 'product_id' is missing"
        return result

    @builtins.property
    def published(self) -> builtins.bool:
        result = self._values.get("published")
        assert result is not None, "Required property 'published' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def subscription_required(self) -> builtins.bool:
        result = self._values.get("subscription_required")
        assert result is not None, "Required property 'subscription_required' is missing"
        return result

    @builtins.property
    def approval_required(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("approval_required")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def subscriptions_limit(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("subscriptions_limit")
        return result

    @builtins.property
    def terms(self) -> typing.Optional[builtins.str]:
        result = self._values.get("terms")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementProductTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementProductGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementProductGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        group_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementProductGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param group_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementProductGroupConfig(
            api_management_name=api_management_name,
            group_name=group_name,
            product_id=product_id,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementProductGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupNameInput")
    def group_name_input(self) -> builtins.str:
        return jsii.get(self, "groupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productIdInput")
    def product_id_input(self) -> builtins.str:
        return jsii.get(self, "productIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementProductGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupName")
    def group_name(self) -> builtins.str:
        return jsii.get(self, "groupName")

    @group_name.setter # type: ignore
    def group_name(self, value: builtins.str) -> None:
        jsii.set(self, "groupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productId")
    def product_id(self) -> builtins.str:
        return jsii.get(self, "productId")

    @product_id.setter # type: ignore
    def product_id(self, value: builtins.str) -> None:
        jsii.set(self, "productId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementProductGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementProductGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "group_name": "groupName",
        "product_id": "productId",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class ApiManagementProductGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        group_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementProductGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param group_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementProductGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "group_name": group_name,
            "product_id": product_id,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def group_name(self) -> builtins.str:
        result = self._values.get("group_name")
        assert result is not None, "Required property 'group_name' is missing"
        return result

    @builtins.property
    def product_id(self) -> builtins.str:
        result = self._values.get("product_id")
        assert result is not None, "Required property 'product_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementProductGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementProductGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementProductPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementProductPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementProductPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementProductPolicyConfig(
            api_management_name=api_management_name,
            product_id=product_id,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            xml_content=xml_content,
            xml_link=xml_link,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementProductPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetXmlContent")
    def reset_xml_content(self) -> None:
        return jsii.invoke(self, "resetXmlContent", [])

    @jsii.member(jsii_name="resetXmlLink")
    def reset_xml_link(self) -> None:
        return jsii.invoke(self, "resetXmlLink", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productIdInput")
    def product_id_input(self) -> builtins.str:
        return jsii.get(self, "productIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementProductPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContentInput")
    def xml_content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLinkInput")
    def xml_link_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "xmlLinkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productId")
    def product_id(self) -> builtins.str:
        return jsii.get(self, "productId")

    @product_id.setter # type: ignore
    def product_id(self, value: builtins.str) -> None:
        jsii.set(self, "productId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementProductPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementProductPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlContent")
    def xml_content(self) -> builtins.str:
        return jsii.get(self, "xmlContent")

    @xml_content.setter # type: ignore
    def xml_content(self, value: builtins.str) -> None:
        jsii.set(self, "xmlContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xmlLink")
    def xml_link(self) -> builtins.str:
        return jsii.get(self, "xmlLink")

    @xml_link.setter # type: ignore
    def xml_link(self, value: builtins.str) -> None:
        jsii.set(self, "xmlLink", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "product_id": "productId",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "xml_content": "xmlContent",
        "xml_link": "xmlLink",
    },
)
class ApiManagementProductPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ApiManagementProductPolicyTimeouts"] = None,
        xml_content: typing.Optional[builtins.str] = None,
        xml_link: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param xml_content: -
        :param xml_link: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementProductPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "product_id": product_id,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if xml_content is not None:
            self._values["xml_content"] = xml_content
        if xml_link is not None:
            self._values["xml_link"] = xml_link

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def product_id(self) -> builtins.str:
        result = self._values.get("product_id")
        assert result is not None, "Required property 'product_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementProductPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def xml_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_content")
        return result

    @builtins.property
    def xml_link(self) -> typing.Optional[builtins.str]:
        result = self._values.get("xml_link")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementProductPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProductTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementProductTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProductTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementProperty(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementProperty",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        value: builtins.str,
        secret: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ApiManagementPropertyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param value: -
        :param secret: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementPropertyConfig(
            api_management_name=api_management_name,
            display_name=display_name,
            name=name,
            resource_group_name=resource_group_name,
            value=value,
            secret=secret,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementProperty, self, [scope, id, config])

    @jsii.member(jsii_name="resetSecret")
    def reset_secret(self) -> None:
        return jsii.invoke(self, "resetSecret", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretInput")
    def secret_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "secretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementPropertyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.bool:
        return jsii.get(self, "secret")

    @secret.setter # type: ignore
    def secret(self, value: builtins.bool) -> None:
        jsii.set(self, "secret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.List[builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementPropertyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementPropertyTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementPropertyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "display_name": "displayName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "value": "value",
        "secret": "secret",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ApiManagementPropertyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        display_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        value: builtins.str,
        secret: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ApiManagementPropertyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param display_name: -
        :param name: -
        :param resource_group_name: -
        :param value: -
        :param secret: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementPropertyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "display_name": display_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if secret is not None:
            self._values["secret"] = secret
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def secret(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("secret")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementPropertyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementPropertyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementPropertyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementPropertyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementPropertyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementProtocols",
    jsii_struct_bases=[],
    name_mapping={"enable_http2": "enableHttp2"},
)
class ApiManagementProtocols:
    def __init__(self, *, enable_http2: typing.Optional[builtins.bool] = None) -> None:
        """
        :param enable_http2: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if enable_http2 is not None:
            self._values["enable_http2"] = enable_http2

    @builtins.property
    def enable_http2(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_http2")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementProtocols(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementSecurity",
    jsii_struct_bases=[],
    name_mapping={
        "enable_backend_ssl30": "enableBackendSsl30",
        "enable_backend_tls10": "enableBackendTls10",
        "enable_backend_tls11": "enableBackendTls11",
        "enable_frontend_ssl30": "enableFrontendSsl30",
        "enable_frontend_tls10": "enableFrontendTls10",
        "enable_frontend_tls11": "enableFrontendTls11",
        "enable_triple_des_ciphers": "enableTripleDesCiphers",
    },
)
class ApiManagementSecurity:
    def __init__(
        self,
        *,
        enable_backend_ssl30: typing.Optional[builtins.bool] = None,
        enable_backend_tls10: typing.Optional[builtins.bool] = None,
        enable_backend_tls11: typing.Optional[builtins.bool] = None,
        enable_frontend_ssl30: typing.Optional[builtins.bool] = None,
        enable_frontend_tls10: typing.Optional[builtins.bool] = None,
        enable_frontend_tls11: typing.Optional[builtins.bool] = None,
        enable_triple_des_ciphers: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param enable_backend_ssl30: -
        :param enable_backend_tls10: -
        :param enable_backend_tls11: -
        :param enable_frontend_ssl30: -
        :param enable_frontend_tls10: -
        :param enable_frontend_tls11: -
        :param enable_triple_des_ciphers: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if enable_backend_ssl30 is not None:
            self._values["enable_backend_ssl30"] = enable_backend_ssl30
        if enable_backend_tls10 is not None:
            self._values["enable_backend_tls10"] = enable_backend_tls10
        if enable_backend_tls11 is not None:
            self._values["enable_backend_tls11"] = enable_backend_tls11
        if enable_frontend_ssl30 is not None:
            self._values["enable_frontend_ssl30"] = enable_frontend_ssl30
        if enable_frontend_tls10 is not None:
            self._values["enable_frontend_tls10"] = enable_frontend_tls10
        if enable_frontend_tls11 is not None:
            self._values["enable_frontend_tls11"] = enable_frontend_tls11
        if enable_triple_des_ciphers is not None:
            self._values["enable_triple_des_ciphers"] = enable_triple_des_ciphers

    @builtins.property
    def enable_backend_ssl30(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_backend_ssl30")
        return result

    @builtins.property
    def enable_backend_tls10(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_backend_tls10")
        return result

    @builtins.property
    def enable_backend_tls11(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_backend_tls11")
        return result

    @builtins.property
    def enable_frontend_ssl30(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_frontend_ssl30")
        return result

    @builtins.property
    def enable_frontend_tls10(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_frontend_tls10")
        return result

    @builtins.property
    def enable_frontend_tls11(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_frontend_tls11")
        return result

    @builtins.property
    def enable_triple_des_ciphers(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_triple_des_ciphers")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementSecurity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementSignIn",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled"},
)
class ApiManagementSignIn:
    def __init__(self, *, enabled: builtins.bool) -> None:
        """
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementSignIn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementSignUp",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "terms_of_service": "termsOfService"},
)
class ApiManagementSignUp:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        terms_of_service: typing.List["ApiManagementSignUpTermsOfService"],
    ) -> None:
        """
        :param enabled: -
        :param terms_of_service: terms_of_service block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "terms_of_service": terms_of_service,
        }

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def terms_of_service(self) -> typing.List["ApiManagementSignUpTermsOfService"]:
        """terms_of_service block."""
        result = self._values.get("terms_of_service")
        assert result is not None, "Required property 'terms_of_service' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementSignUp(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementSignUpTermsOfService",
    jsii_struct_bases=[],
    name_mapping={
        "consent_required": "consentRequired",
        "enabled": "enabled",
        "text": "text",
    },
)
class ApiManagementSignUpTermsOfService:
    def __init__(
        self,
        *,
        consent_required: builtins.bool,
        enabled: builtins.bool,
        text: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param consent_required: -
        :param enabled: -
        :param text: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "consent_required": consent_required,
            "enabled": enabled,
        }
        if text is not None:
            self._values["text"] = text

    @builtins.property
    def consent_required(self) -> builtins.bool:
        result = self._values.get("consent_required")
        assert result is not None, "Required property 'consent_required' is missing"
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def text(self) -> typing.Optional[builtins.str]:
        result = self._values.get("text")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementSignUpTermsOfService(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementSubscription(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementSubscription",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        display_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        allow_tracing: typing.Optional[builtins.bool] = None,
        primary_key: typing.Optional[builtins.str] = None,
        product_id: typing.Optional[builtins.str] = None,
        secondary_key: typing.Optional[builtins.str] = None,
        state: typing.Optional[builtins.str] = None,
        subscription_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementSubscriptionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param display_name: -
        :param resource_group_name: -
        :param user_id: -
        :param allow_tracing: -
        :param primary_key: -
        :param product_id: -
        :param secondary_key: -
        :param state: -
        :param subscription_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementSubscriptionConfig(
            api_management_name=api_management_name,
            display_name=display_name,
            resource_group_name=resource_group_name,
            user_id=user_id,
            allow_tracing=allow_tracing,
            primary_key=primary_key,
            product_id=product_id,
            secondary_key=secondary_key,
            state=state,
            subscription_id=subscription_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementSubscription, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowTracing")
    def reset_allow_tracing(self) -> None:
        return jsii.invoke(self, "resetAllowTracing", [])

    @jsii.member(jsii_name="resetPrimaryKey")
    def reset_primary_key(self) -> None:
        return jsii.invoke(self, "resetPrimaryKey", [])

    @jsii.member(jsii_name="resetProductId")
    def reset_product_id(self) -> None:
        return jsii.invoke(self, "resetProductId", [])

    @jsii.member(jsii_name="resetSecondaryKey")
    def reset_secondary_key(self) -> None:
        return jsii.invoke(self, "resetSecondaryKey", [])

    @jsii.member(jsii_name="resetState")
    def reset_state(self) -> None:
        return jsii.invoke(self, "resetState", [])

    @jsii.member(jsii_name="resetSubscriptionId")
    def reset_subscription_id(self) -> None:
        return jsii.invoke(self, "resetSubscriptionId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userIdInput")
    def user_id_input(self) -> builtins.str:
        return jsii.get(self, "userIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowTracingInput")
    def allow_tracing_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowTracingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKeyInput")
    def primary_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "primaryKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productIdInput")
    def product_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "productIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKeyInput")
    def secondary_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "secondaryKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="stateInput")
    def state_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "stateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIdInput")
    def subscription_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "subscriptionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementSubscriptionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowTracing")
    def allow_tracing(self) -> builtins.bool:
        return jsii.get(self, "allowTracing")

    @allow_tracing.setter # type: ignore
    def allow_tracing(self, value: builtins.bool) -> None:
        jsii.set(self, "allowTracing", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @primary_key.setter # type: ignore
    def primary_key(self, value: builtins.str) -> None:
        jsii.set(self, "primaryKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productId")
    def product_id(self) -> builtins.str:
        return jsii.get(self, "productId")

    @product_id.setter # type: ignore
    def product_id(self, value: builtins.str) -> None:
        jsii.set(self, "productId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @secondary_key.setter # type: ignore
    def secondary_key(self, value: builtins.str) -> None:
        jsii.set(self, "secondaryKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="state")
    def state(self) -> builtins.str:
        return jsii.get(self, "state")

    @state.setter # type: ignore
    def state(self, value: builtins.str) -> None:
        jsii.set(self, "state", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")

    @subscription_id.setter # type: ignore
    def subscription_id(self, value: builtins.str) -> None:
        jsii.set(self, "subscriptionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementSubscriptionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementSubscriptionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userId")
    def user_id(self) -> builtins.str:
        return jsii.get(self, "userId")

    @user_id.setter # type: ignore
    def user_id(self, value: builtins.str) -> None:
        jsii.set(self, "userId", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementSubscriptionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "display_name": "displayName",
        "resource_group_name": "resourceGroupName",
        "user_id": "userId",
        "allow_tracing": "allowTracing",
        "primary_key": "primaryKey",
        "product_id": "productId",
        "secondary_key": "secondaryKey",
        "state": "state",
        "subscription_id": "subscriptionId",
        "timeouts": "timeouts",
    },
)
class ApiManagementSubscriptionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        display_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        allow_tracing: typing.Optional[builtins.bool] = None,
        primary_key: typing.Optional[builtins.str] = None,
        product_id: typing.Optional[builtins.str] = None,
        secondary_key: typing.Optional[builtins.str] = None,
        state: typing.Optional[builtins.str] = None,
        subscription_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementSubscriptionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param display_name: -
        :param resource_group_name: -
        :param user_id: -
        :param allow_tracing: -
        :param primary_key: -
        :param product_id: -
        :param secondary_key: -
        :param state: -
        :param subscription_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementSubscriptionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "display_name": display_name,
            "resource_group_name": resource_group_name,
            "user_id": user_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allow_tracing is not None:
            self._values["allow_tracing"] = allow_tracing
        if primary_key is not None:
            self._values["primary_key"] = primary_key
        if product_id is not None:
            self._values["product_id"] = product_id
        if secondary_key is not None:
            self._values["secondary_key"] = secondary_key
        if state is not None:
            self._values["state"] = state
        if subscription_id is not None:
            self._values["subscription_id"] = subscription_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def user_id(self) -> builtins.str:
        result = self._values.get("user_id")
        assert result is not None, "Required property 'user_id' is missing"
        return result

    @builtins.property
    def allow_tracing(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_tracing")
        return result

    @builtins.property
    def primary_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("primary_key")
        return result

    @builtins.property
    def product_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("product_id")
        return result

    @builtins.property
    def secondary_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("secondary_key")
        return result

    @builtins.property
    def state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("state")
        return result

    @builtins.property
    def subscription_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subscription_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementSubscriptionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementSubscriptionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementSubscriptionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementSubscriptionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementSubscriptionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApiManagementUser(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApiManagementUser",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        email: builtins.str,
        first_name: builtins.str,
        last_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        confirmation: typing.Optional[builtins.str] = None,
        note: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        state: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementUserTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param email: -
        :param first_name: -
        :param last_name: -
        :param resource_group_name: -
        :param user_id: -
        :param confirmation: -
        :param note: -
        :param password: -
        :param state: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApiManagementUserConfig(
            api_management_name=api_management_name,
            email=email,
            first_name=first_name,
            last_name=last_name,
            resource_group_name=resource_group_name,
            user_id=user_id,
            confirmation=confirmation,
            note=note,
            password=password,
            state=state,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApiManagementUser, self, [scope, id, config])

    @jsii.member(jsii_name="resetConfirmation")
    def reset_confirmation(self) -> None:
        return jsii.invoke(self, "resetConfirmation", [])

    @jsii.member(jsii_name="resetNote")
    def reset_note(self) -> None:
        return jsii.invoke(self, "resetNote", [])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetState")
    def reset_state(self) -> None:
        return jsii.invoke(self, "resetState", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailInput")
    def email_input(self) -> builtins.str:
        return jsii.get(self, "emailInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firstNameInput")
    def first_name_input(self) -> builtins.str:
        return jsii.get(self, "firstNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lastNameInput")
    def last_name_input(self) -> builtins.str:
        return jsii.get(self, "lastNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userIdInput")
    def user_id_input(self) -> builtins.str:
        return jsii.get(self, "userIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="confirmationInput")
    def confirmation_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "confirmationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="noteInput")
    def note_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "noteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="stateInput")
    def state_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "stateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApiManagementUserTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="confirmation")
    def confirmation(self) -> builtins.str:
        return jsii.get(self, "confirmation")

    @confirmation.setter # type: ignore
    def confirmation(self, value: builtins.str) -> None:
        jsii.set(self, "confirmation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="email")
    def email(self) -> builtins.str:
        return jsii.get(self, "email")

    @email.setter # type: ignore
    def email(self, value: builtins.str) -> None:
        jsii.set(self, "email", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firstName")
    def first_name(self) -> builtins.str:
        return jsii.get(self, "firstName")

    @first_name.setter # type: ignore
    def first_name(self, value: builtins.str) -> None:
        jsii.set(self, "firstName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lastName")
    def last_name(self) -> builtins.str:
        return jsii.get(self, "lastName")

    @last_name.setter # type: ignore
    def last_name(self, value: builtins.str) -> None:
        jsii.set(self, "lastName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="note")
    def note(self) -> builtins.str:
        return jsii.get(self, "note")

    @note.setter # type: ignore
    def note(self, value: builtins.str) -> None:
        jsii.set(self, "note", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="state")
    def state(self) -> builtins.str:
        return jsii.get(self, "state")

    @state.setter # type: ignore
    def state(self, value: builtins.str) -> None:
        jsii.set(self, "state", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApiManagementUserTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApiManagementUserTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userId")
    def user_id(self) -> builtins.str:
        return jsii.get(self, "userId")

    @user_id.setter # type: ignore
    def user_id(self, value: builtins.str) -> None:
        jsii.set(self, "userId", value)


@jsii.data_type(
    jsii_type="azurerm.ApiManagementUserConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "email": "email",
        "first_name": "firstName",
        "last_name": "lastName",
        "resource_group_name": "resourceGroupName",
        "user_id": "userId",
        "confirmation": "confirmation",
        "note": "note",
        "password": "password",
        "state": "state",
        "timeouts": "timeouts",
    },
)
class ApiManagementUserConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        email: builtins.str,
        first_name: builtins.str,
        last_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        confirmation: typing.Optional[builtins.str] = None,
        note: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        state: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApiManagementUserTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param email: -
        :param first_name: -
        :param last_name: -
        :param resource_group_name: -
        :param user_id: -
        :param confirmation: -
        :param note: -
        :param password: -
        :param state: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApiManagementUserTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "email": email,
            "first_name": first_name,
            "last_name": last_name,
            "resource_group_name": resource_group_name,
            "user_id": user_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if confirmation is not None:
            self._values["confirmation"] = confirmation
        if note is not None:
            self._values["note"] = note
        if password is not None:
            self._values["password"] = password
        if state is not None:
            self._values["state"] = state
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def email(self) -> builtins.str:
        result = self._values.get("email")
        assert result is not None, "Required property 'email' is missing"
        return result

    @builtins.property
    def first_name(self) -> builtins.str:
        result = self._values.get("first_name")
        assert result is not None, "Required property 'first_name' is missing"
        return result

    @builtins.property
    def last_name(self) -> builtins.str:
        result = self._values.get("last_name")
        assert result is not None, "Required property 'last_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def user_id(self) -> builtins.str:
        result = self._values.get("user_id")
        assert result is not None, "Required property 'user_id' is missing"
        return result

    @builtins.property
    def confirmation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("confirmation")
        return result

    @builtins.property
    def note(self) -> typing.Optional[builtins.str]:
        result = self._values.get("note")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("state")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApiManagementUserTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementUserConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementUserTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApiManagementUserTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementUserTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApiManagementVirtualNetworkConfiguration",
    jsii_struct_bases=[],
    name_mapping={"subnet_id": "subnetId"},
)
class ApiManagementVirtualNetworkConfiguration:
    def __init__(self, *, subnet_id: builtins.str) -> None:
        """
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "subnet_id": subnet_id,
        }

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApiManagementVirtualNetworkConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        identity: typing.Optional[typing.List["AppConfigurationIdentity"]] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param identity: identity block.
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppConfigurationConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            identity=identity,
            sku=sku,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="primaryReadKey")
    def primary_read_key(self, index: builtins.str) -> "AppConfigurationPrimaryReadKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "primaryReadKey", [index])

    @jsii.member(jsii_name="primaryWriteKey")
    def primary_write_key(
        self,
        index: builtins.str,
    ) -> "AppConfigurationPrimaryWriteKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "primaryWriteKey", [index])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="secondaryReadKey")
    def secondary_read_key(
        self,
        index: builtins.str,
    ) -> "AppConfigurationSecondaryReadKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "secondaryReadKey", [index])

    @jsii.member(jsii_name="secondaryWriteKey")
    def secondary_write_key(
        self,
        index: builtins.str,
    ) -> "AppConfigurationSecondaryWriteKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "secondaryWriteKey", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["AppConfigurationIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["AppConfigurationIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["AppConfigurationIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "identity": "identity",
        "sku": "sku",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AppConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        identity: typing.Optional[typing.List["AppConfigurationIdentity"]] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param identity: identity block.
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if identity is not None:
            self._values["identity"] = identity
        if sku is not None:
            self._values["sku"] = sku
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["AppConfigurationIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppConfigurationIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class AppConfigurationIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppConfigurationIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppConfigurationPrimaryReadKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppConfigurationPrimaryReadKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(AppConfigurationPrimaryReadKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


class AppConfigurationPrimaryWriteKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppConfigurationPrimaryWriteKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(AppConfigurationPrimaryWriteKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


class AppConfigurationSecondaryReadKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppConfigurationSecondaryReadKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(AppConfigurationSecondaryReadKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


class AppConfigurationSecondaryWriteKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppConfigurationSecondaryWriteKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(AppConfigurationSecondaryWriteKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


@jsii.data_type(
    jsii_type="azurerm.AppConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_plan_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List["AppServiceAuthSettings"]] = None,
        backup: typing.Optional[typing.List["AppServiceBackup"]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        client_cert_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["AppServiceConnectionString"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["AppServiceIdentity"]] = None,
        logs: typing.Optional[typing.List["AppServiceLogs"]] = None,
        site_config: typing.Optional[typing.List["AppServiceSiteConfig"]] = None,
        source_control: typing.Optional[typing.List["AppServiceSourceControl"]] = None,
        storage_account: typing.Optional[typing.List["AppServiceStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_plan_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param backup: backup block.
        :param client_affinity_enabled: -
        :param client_cert_enabled: -
        :param connection_string: connection_string block.
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param logs: logs block.
        :param site_config: site_config block.
        :param source_control: source_control block.
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceConfig(
            app_service_plan_id=app_service_plan_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            app_settings=app_settings,
            auth_settings=auth_settings,
            backup=backup,
            client_affinity_enabled=client_affinity_enabled,
            client_cert_enabled=client_cert_enabled,
            connection_string=connection_string,
            enabled=enabled,
            https_only=https_only,
            identity=identity,
            logs=logs,
            site_config=site_config,
            source_control=source_control,
            storage_account=storage_account,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppService, self, [scope, id, config])

    @jsii.member(jsii_name="resetAppSettings")
    def reset_app_settings(self) -> None:
        return jsii.invoke(self, "resetAppSettings", [])

    @jsii.member(jsii_name="resetAuthSettings")
    def reset_auth_settings(self) -> None:
        return jsii.invoke(self, "resetAuthSettings", [])

    @jsii.member(jsii_name="resetBackup")
    def reset_backup(self) -> None:
        return jsii.invoke(self, "resetBackup", [])

    @jsii.member(jsii_name="resetClientAffinityEnabled")
    def reset_client_affinity_enabled(self) -> None:
        return jsii.invoke(self, "resetClientAffinityEnabled", [])

    @jsii.member(jsii_name="resetClientCertEnabled")
    def reset_client_cert_enabled(self) -> None:
        return jsii.invoke(self, "resetClientCertEnabled", [])

    @jsii.member(jsii_name="resetConnectionString")
    def reset_connection_string(self) -> None:
        return jsii.invoke(self, "resetConnectionString", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetHttpsOnly")
    def reset_https_only(self) -> None:
        return jsii.invoke(self, "resetHttpsOnly", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLogs")
    def reset_logs(self) -> None:
        return jsii.invoke(self, "resetLogs", [])

    @jsii.member(jsii_name="resetSiteConfig")
    def reset_site_config(self) -> None:
        return jsii.invoke(self, "resetSiteConfig", [])

    @jsii.member(jsii_name="resetSourceControl")
    def reset_source_control(self) -> None:
        return jsii.invoke(self, "resetSourceControl", [])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="siteCredential")
    def site_credential(self, index: builtins.str) -> "AppServiceSiteCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteCredential", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanIdInput")
    def app_service_plan_id_input(self) -> builtins.str:
        return jsii.get(self, "appServicePlanIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDomainVerificationId")
    def custom_domain_verification_id(self) -> builtins.str:
        return jsii.get(self, "customDomainVerificationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSiteHostname")
    def default_site_hostname(self) -> builtins.str:
        return jsii.get(self, "defaultSiteHostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundIpAddresses")
    def outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "outboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="possibleOutboundIpAddresses")
    def possible_outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "possibleOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettingsInput")
    def app_settings_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "appSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettingsInput")
    def auth_settings_input(
        self,
    ) -> typing.Optional[typing.List["AppServiceAuthSettings"]]:
        return jsii.get(self, "authSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupInput")
    def backup_input(self) -> typing.Optional[typing.List["AppServiceBackup"]]:
        return jsii.get(self, "backupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabledInput")
    def client_affinity_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "clientAffinityEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertEnabledInput")
    def client_cert_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "clientCertEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(
        self,
    ) -> typing.Optional[typing.List["AppServiceConnectionString"]]:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnlyInput")
    def https_only_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "httpsOnlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["AppServiceIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logsInput")
    def logs_input(self) -> typing.Optional[typing.List["AppServiceLogs"]]:
        return jsii.get(self, "logsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfigInput")
    def site_config_input(self) -> typing.Optional[typing.List["AppServiceSiteConfig"]]:
        return jsii.get(self, "siteConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceControlInput")
    def source_control_input(
        self,
    ) -> typing.Optional[typing.List["AppServiceSourceControl"]]:
        return jsii.get(self, "sourceControlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["AppServiceStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanId")
    def app_service_plan_id(self) -> builtins.str:
        return jsii.get(self, "appServicePlanId")

    @app_service_plan_id.setter # type: ignore
    def app_service_plan_id(self, value: builtins.str) -> None:
        jsii.set(self, "appServicePlanId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettings")
    def app_settings(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "appSettings")

    @app_settings.setter # type: ignore
    def app_settings(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "appSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettings")
    def auth_settings(self) -> typing.List["AppServiceAuthSettings"]:
        return jsii.get(self, "authSettings")

    @auth_settings.setter # type: ignore
    def auth_settings(self, value: typing.List["AppServiceAuthSettings"]) -> None:
        jsii.set(self, "authSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backup")
    def backup(self) -> typing.List["AppServiceBackup"]:
        return jsii.get(self, "backup")

    @backup.setter # type: ignore
    def backup(self, value: typing.List["AppServiceBackup"]) -> None:
        jsii.set(self, "backup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabled")
    def client_affinity_enabled(self) -> builtins.bool:
        return jsii.get(self, "clientAffinityEnabled")

    @client_affinity_enabled.setter # type: ignore
    def client_affinity_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "clientAffinityEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertEnabled")
    def client_cert_enabled(self) -> builtins.bool:
        return jsii.get(self, "clientCertEnabled")

    @client_cert_enabled.setter # type: ignore
    def client_cert_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "clientCertEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> typing.List["AppServiceConnectionString"]:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(
        self,
        value: typing.List["AppServiceConnectionString"],
    ) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnly")
    def https_only(self) -> builtins.bool:
        return jsii.get(self, "httpsOnly")

    @https_only.setter # type: ignore
    def https_only(self, value: builtins.bool) -> None:
        jsii.set(self, "httpsOnly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["AppServiceIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["AppServiceIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logs")
    def logs(self) -> typing.List["AppServiceLogs"]:
        return jsii.get(self, "logs")

    @logs.setter # type: ignore
    def logs(self, value: typing.List["AppServiceLogs"]) -> None:
        jsii.set(self, "logs", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfig")
    def site_config(self) -> typing.List["AppServiceSiteConfig"]:
        return jsii.get(self, "siteConfig")

    @site_config.setter # type: ignore
    def site_config(self, value: typing.List["AppServiceSiteConfig"]) -> None:
        jsii.set(self, "siteConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceControl")
    def source_control(self) -> typing.List["AppServiceSourceControl"]:
        return jsii.get(self, "sourceControl")

    @source_control.setter # type: ignore
    def source_control(self, value: typing.List["AppServiceSourceControl"]) -> None:
        jsii.set(self, "sourceControl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["AppServiceStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(self, value: typing.List["AppServiceStorageAccount"]) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class AppServiceActiveSlot(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceActiveSlot",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_name: builtins.str,
        app_service_slot_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["AppServiceActiveSlotTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_name: -
        :param app_service_slot_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceActiveSlotConfig(
            app_service_name=app_service_name,
            app_service_slot_name=app_service_slot_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceActiveSlot, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceNameInput")
    def app_service_name_input(self) -> builtins.str:
        return jsii.get(self, "appServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceSlotNameInput")
    def app_service_slot_name_input(self) -> builtins.str:
        return jsii.get(self, "appServiceSlotNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceActiveSlotTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceName")
    def app_service_name(self) -> builtins.str:
        return jsii.get(self, "appServiceName")

    @app_service_name.setter # type: ignore
    def app_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceSlotName")
    def app_service_slot_name(self) -> builtins.str:
        return jsii.get(self, "appServiceSlotName")

    @app_service_slot_name.setter # type: ignore
    def app_service_slot_name(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceSlotName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceActiveSlotTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceActiveSlotTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceActiveSlotConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_name": "appServiceName",
        "app_service_slot_name": "appServiceSlotName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class AppServiceActiveSlotConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_name: builtins.str,
        app_service_slot_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["AppServiceActiveSlotTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_name: -
        :param app_service_slot_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceActiveSlotTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_name": app_service_name,
            "app_service_slot_name": app_service_slot_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_name(self) -> builtins.str:
        result = self._values.get("app_service_name")
        assert result is not None, "Required property 'app_service_name' is missing"
        return result

    @builtins.property
    def app_service_slot_name(self) -> builtins.str:
        result = self._values.get("app_service_slot_name")
        assert result is not None, "Required property 'app_service_slot_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceActiveSlotTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceActiveSlotConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceActiveSlotTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceActiveSlotTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceActiveSlotTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceAuthSettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "active_directory": "activeDirectory",
        "additional_login_params": "additionalLoginParams",
        "allowed_external_redirect_urls": "allowedExternalRedirectUrls",
        "default_provider": "defaultProvider",
        "facebook": "facebook",
        "google": "google",
        "issuer": "issuer",
        "microsoft": "microsoft",
        "runtime_version": "runtimeVersion",
        "token_refresh_extension_hours": "tokenRefreshExtensionHours",
        "token_store_enabled": "tokenStoreEnabled",
        "twitter": "twitter",
        "unauthenticated_client_action": "unauthenticatedClientAction",
    },
)
class AppServiceAuthSettings:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        active_directory: typing.Optional[typing.List["AppServiceAuthSettingsActiveDirectory"]] = None,
        additional_login_params: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        allowed_external_redirect_urls: typing.Optional[typing.List[builtins.str]] = None,
        default_provider: typing.Optional[builtins.str] = None,
        facebook: typing.Optional[typing.List["AppServiceAuthSettingsFacebook"]] = None,
        google: typing.Optional[typing.List["AppServiceAuthSettingsGoogle"]] = None,
        issuer: typing.Optional[builtins.str] = None,
        microsoft: typing.Optional[typing.List["AppServiceAuthSettingsMicrosoft"]] = None,
        runtime_version: typing.Optional[builtins.str] = None,
        token_refresh_extension_hours: typing.Optional[jsii.Number] = None,
        token_store_enabled: typing.Optional[builtins.bool] = None,
        twitter: typing.Optional[typing.List["AppServiceAuthSettingsTwitter"]] = None,
        unauthenticated_client_action: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param active_directory: active_directory block.
        :param additional_login_params: -
        :param allowed_external_redirect_urls: -
        :param default_provider: -
        :param facebook: facebook block.
        :param google: google block.
        :param issuer: -
        :param microsoft: microsoft block.
        :param runtime_version: -
        :param token_refresh_extension_hours: -
        :param token_store_enabled: -
        :param twitter: twitter block.
        :param unauthenticated_client_action: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if active_directory is not None:
            self._values["active_directory"] = active_directory
        if additional_login_params is not None:
            self._values["additional_login_params"] = additional_login_params
        if allowed_external_redirect_urls is not None:
            self._values["allowed_external_redirect_urls"] = allowed_external_redirect_urls
        if default_provider is not None:
            self._values["default_provider"] = default_provider
        if facebook is not None:
            self._values["facebook"] = facebook
        if google is not None:
            self._values["google"] = google
        if issuer is not None:
            self._values["issuer"] = issuer
        if microsoft is not None:
            self._values["microsoft"] = microsoft
        if runtime_version is not None:
            self._values["runtime_version"] = runtime_version
        if token_refresh_extension_hours is not None:
            self._values["token_refresh_extension_hours"] = token_refresh_extension_hours
        if token_store_enabled is not None:
            self._values["token_store_enabled"] = token_store_enabled
        if twitter is not None:
            self._values["twitter"] = twitter
        if unauthenticated_client_action is not None:
            self._values["unauthenticated_client_action"] = unauthenticated_client_action

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def active_directory(
        self,
    ) -> typing.Optional[typing.List["AppServiceAuthSettingsActiveDirectory"]]:
        """active_directory block."""
        result = self._values.get("active_directory")
        return result

    @builtins.property
    def additional_login_params(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_login_params")
        return result

    @builtins.property
    def allowed_external_redirect_urls(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_external_redirect_urls")
        return result

    @builtins.property
    def default_provider(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_provider")
        return result

    @builtins.property
    def facebook(
        self,
    ) -> typing.Optional[typing.List["AppServiceAuthSettingsFacebook"]]:
        """facebook block."""
        result = self._values.get("facebook")
        return result

    @builtins.property
    def google(self) -> typing.Optional[typing.List["AppServiceAuthSettingsGoogle"]]:
        """google block."""
        result = self._values.get("google")
        return result

    @builtins.property
    def issuer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("issuer")
        return result

    @builtins.property
    def microsoft(
        self,
    ) -> typing.Optional[typing.List["AppServiceAuthSettingsMicrosoft"]]:
        """microsoft block."""
        result = self._values.get("microsoft")
        return result

    @builtins.property
    def runtime_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("runtime_version")
        return result

    @builtins.property
    def token_refresh_extension_hours(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("token_refresh_extension_hours")
        return result

    @builtins.property
    def token_store_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("token_store_enabled")
        return result

    @builtins.property
    def twitter(self) -> typing.Optional[typing.List["AppServiceAuthSettingsTwitter"]]:
        """twitter block."""
        result = self._values.get("twitter")
        return result

    @builtins.property
    def unauthenticated_client_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("unauthenticated_client_action")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceAuthSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceAuthSettingsActiveDirectory",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "allowed_audiences": "allowedAudiences",
        "client_secret": "clientSecret",
    },
)
class AppServiceAuthSettingsActiveDirectory:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        allowed_audiences: typing.Optional[typing.List[builtins.str]] = None,
        client_secret: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param client_id: -
        :param allowed_audiences: -
        :param client_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
        }
        if allowed_audiences is not None:
            self._values["allowed_audiences"] = allowed_audiences
        if client_secret is not None:
            self._values["client_secret"] = client_secret

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def allowed_audiences(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_audiences")
        return result

    @builtins.property
    def client_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("client_secret")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceAuthSettingsActiveDirectory(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceAuthSettingsFacebook",
    jsii_struct_bases=[],
    name_mapping={
        "app_id": "appId",
        "app_secret": "appSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class AppServiceAuthSettingsFacebook:
    def __init__(
        self,
        *,
        app_id: builtins.str,
        app_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param app_id: -
        :param app_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "app_id": app_id,
            "app_secret": app_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def app_id(self) -> builtins.str:
        result = self._values.get("app_id")
        assert result is not None, "Required property 'app_id' is missing"
        return result

    @builtins.property
    def app_secret(self) -> builtins.str:
        result = self._values.get("app_secret")
        assert result is not None, "Required property 'app_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceAuthSettingsFacebook(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceAuthSettingsGoogle",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class AppServiceAuthSettingsGoogle:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceAuthSettingsGoogle(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceAuthSettingsMicrosoft",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class AppServiceAuthSettingsMicrosoft:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceAuthSettingsMicrosoft(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceAuthSettingsTwitter",
    jsii_struct_bases=[],
    name_mapping={"consumer_key": "consumerKey", "consumer_secret": "consumerSecret"},
)
class AppServiceAuthSettingsTwitter:
    def __init__(
        self,
        *,
        consumer_key: builtins.str,
        consumer_secret: builtins.str,
    ) -> None:
        """
        :param consumer_key: -
        :param consumer_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "consumer_key": consumer_key,
            "consumer_secret": consumer_secret,
        }

    @builtins.property
    def consumer_key(self) -> builtins.str:
        result = self._values.get("consumer_key")
        assert result is not None, "Required property 'consumer_key' is missing"
        return result

    @builtins.property
    def consumer_secret(self) -> builtins.str:
        result = self._values.get("consumer_secret")
        assert result is not None, "Required property 'consumer_secret' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceAuthSettingsTwitter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceBackup",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "schedule": "schedule",
        "storage_account_url": "storageAccountUrl",
        "enabled": "enabled",
    },
)
class AppServiceBackup:
    def __init__(
        self,
        *,
        name: builtins.str,
        schedule: typing.List["AppServiceBackupSchedule"],
        storage_account_url: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param name: -
        :param schedule: schedule block.
        :param storage_account_url: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "schedule": schedule,
            "storage_account_url": storage_account_url,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def schedule(self) -> typing.List["AppServiceBackupSchedule"]:
        """schedule block."""
        result = self._values.get("schedule")
        assert result is not None, "Required property 'schedule' is missing"
        return result

    @builtins.property
    def storage_account_url(self) -> builtins.str:
        result = self._values.get("storage_account_url")
        assert result is not None, "Required property 'storage_account_url' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceBackup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceBackupSchedule",
    jsii_struct_bases=[],
    name_mapping={
        "frequency_interval": "frequencyInterval",
        "frequency_unit": "frequencyUnit",
        "keep_at_least_one_backup": "keepAtLeastOneBackup",
        "retention_period_in_days": "retentionPeriodInDays",
        "start_time": "startTime",
    },
)
class AppServiceBackupSchedule:
    def __init__(
        self,
        *,
        frequency_interval: jsii.Number,
        frequency_unit: builtins.str,
        keep_at_least_one_backup: typing.Optional[builtins.bool] = None,
        retention_period_in_days: typing.Optional[jsii.Number] = None,
        start_time: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param frequency_interval: -
        :param frequency_unit: -
        :param keep_at_least_one_backup: -
        :param retention_period_in_days: -
        :param start_time: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "frequency_interval": frequency_interval,
            "frequency_unit": frequency_unit,
        }
        if keep_at_least_one_backup is not None:
            self._values["keep_at_least_one_backup"] = keep_at_least_one_backup
        if retention_period_in_days is not None:
            self._values["retention_period_in_days"] = retention_period_in_days
        if start_time is not None:
            self._values["start_time"] = start_time

    @builtins.property
    def frequency_interval(self) -> jsii.Number:
        result = self._values.get("frequency_interval")
        assert result is not None, "Required property 'frequency_interval' is missing"
        return result

    @builtins.property
    def frequency_unit(self) -> builtins.str:
        result = self._values.get("frequency_unit")
        assert result is not None, "Required property 'frequency_unit' is missing"
        return result

    @builtins.property
    def keep_at_least_one_backup(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("keep_at_least_one_backup")
        return result

    @builtins.property
    def retention_period_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_period_in_days")
        return result

    @builtins.property
    def start_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("start_time")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceBackupSchedule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        hosting_environment_profile_id: typing.Optional[builtins.str] = None,
        key_vault_secret_id: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        pfx_blob: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param hosting_environment_profile_id: -
        :param key_vault_secret_id: -
        :param password: -
        :param pfx_blob: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceCertificateConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            hosting_environment_profile_id=hosting_environment_profile_id,
            key_vault_secret_id=key_vault_secret_id,
            password=password,
            pfx_blob=pfx_blob,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetHostingEnvironmentProfileId")
    def reset_hosting_environment_profile_id(self) -> None:
        return jsii.invoke(self, "resetHostingEnvironmentProfileId", [])

    @jsii.member(jsii_name="resetKeyVaultSecretId")
    def reset_key_vault_secret_id(self) -> None:
        return jsii.invoke(self, "resetKeyVaultSecretId", [])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetPfxBlob")
    def reset_pfx_blob(self) -> None:
        return jsii.invoke(self, "resetPfxBlob", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationDate")
    def expiration_date(self) -> builtins.str:
        return jsii.get(self, "expirationDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostNames")
    def host_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "hostNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="issueDate")
    def issue_date(self) -> builtins.str:
        return jsii.get(self, "issueDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="issuer")
    def issuer(self) -> builtins.str:
        return jsii.get(self, "issuer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subjectName")
    def subject_name(self) -> builtins.str:
        return jsii.get(self, "subjectName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostingEnvironmentProfileIdInput")
    def hosting_environment_profile_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "hostingEnvironmentProfileIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultSecretIdInput")
    def key_vault_secret_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "keyVaultSecretIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pfxBlobInput")
    def pfx_blob_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "pfxBlobInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostingEnvironmentProfileId")
    def hosting_environment_profile_id(self) -> builtins.str:
        return jsii.get(self, "hostingEnvironmentProfileId")

    @hosting_environment_profile_id.setter # type: ignore
    def hosting_environment_profile_id(self, value: builtins.str) -> None:
        jsii.set(self, "hostingEnvironmentProfileId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultSecretId")
    def key_vault_secret_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultSecretId")

    @key_vault_secret_id.setter # type: ignore
    def key_vault_secret_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultSecretId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pfxBlob")
    def pfx_blob(self) -> builtins.str:
        return jsii.get(self, "pfxBlob")

    @pfx_blob.setter # type: ignore
    def pfx_blob(self, value: builtins.str) -> None:
        jsii.set(self, "pfxBlob", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class AppServiceCertificateBinding(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceCertificateBinding",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        certificate_id: builtins.str,
        hostname_binding_id: builtins.str,
        ssl_state: builtins.str,
        timeouts: typing.Optional["AppServiceCertificateBindingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param certificate_id: -
        :param hostname_binding_id: -
        :param ssl_state: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceCertificateBindingConfig(
            certificate_id=certificate_id,
            hostname_binding_id=hostname_binding_id,
            ssl_state=ssl_state,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceCertificateBinding, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceName")
    def app_service_name(self) -> builtins.str:
        return jsii.get(self, "appServiceName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateIdInput")
    def certificate_id_input(self) -> builtins.str:
        return jsii.get(self, "certificateIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostnameBindingIdInput")
    def hostname_binding_id_input(self) -> builtins.str:
        return jsii.get(self, "hostnameBindingIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslStateInput")
    def ssl_state_input(self) -> builtins.str:
        return jsii.get(self, "sslStateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceCertificateBindingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateId")
    def certificate_id(self) -> builtins.str:
        return jsii.get(self, "certificateId")

    @certificate_id.setter # type: ignore
    def certificate_id(self, value: builtins.str) -> None:
        jsii.set(self, "certificateId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostnameBindingId")
    def hostname_binding_id(self) -> builtins.str:
        return jsii.get(self, "hostnameBindingId")

    @hostname_binding_id.setter # type: ignore
    def hostname_binding_id(self, value: builtins.str) -> None:
        jsii.set(self, "hostnameBindingId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslState")
    def ssl_state(self) -> builtins.str:
        return jsii.get(self, "sslState")

    @ssl_state.setter # type: ignore
    def ssl_state(self, value: builtins.str) -> None:
        jsii.set(self, "sslState", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceCertificateBindingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceCertificateBindingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceCertificateBindingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "certificate_id": "certificateId",
        "hostname_binding_id": "hostnameBindingId",
        "ssl_state": "sslState",
        "timeouts": "timeouts",
    },
)
class AppServiceCertificateBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        certificate_id: builtins.str,
        hostname_binding_id: builtins.str,
        ssl_state: builtins.str,
        timeouts: typing.Optional["AppServiceCertificateBindingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param certificate_id: -
        :param hostname_binding_id: -
        :param ssl_state: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceCertificateBindingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "certificate_id": certificate_id,
            "hostname_binding_id": hostname_binding_id,
            "ssl_state": ssl_state,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def certificate_id(self) -> builtins.str:
        result = self._values.get("certificate_id")
        assert result is not None, "Required property 'certificate_id' is missing"
        return result

    @builtins.property
    def hostname_binding_id(self) -> builtins.str:
        result = self._values.get("hostname_binding_id")
        assert result is not None, "Required property 'hostname_binding_id' is missing"
        return result

    @builtins.property
    def ssl_state(self) -> builtins.str:
        result = self._values.get("ssl_state")
        assert result is not None, "Required property 'ssl_state' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceCertificateBindingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCertificateBindingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceCertificateBindingTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class AppServiceCertificateBindingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCertificateBindingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "hosting_environment_profile_id": "hostingEnvironmentProfileId",
        "key_vault_secret_id": "keyVaultSecretId",
        "password": "password",
        "pfx_blob": "pfxBlob",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AppServiceCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        hosting_environment_profile_id: typing.Optional[builtins.str] = None,
        key_vault_secret_id: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        pfx_blob: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param hosting_environment_profile_id: -
        :param key_vault_secret_id: -
        :param password: -
        :param pfx_blob: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if hosting_environment_profile_id is not None:
            self._values["hosting_environment_profile_id"] = hosting_environment_profile_id
        if key_vault_secret_id is not None:
            self._values["key_vault_secret_id"] = key_vault_secret_id
        if password is not None:
            self._values["password"] = password
        if pfx_blob is not None:
            self._values["pfx_blob"] = pfx_blob
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def hosting_environment_profile_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hosting_environment_profile_id")
        return result

    @builtins.property
    def key_vault_secret_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_secret_id")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def pfx_blob(self) -> typing.Optional[builtins.str]:
        result = self._values.get("pfx_blob")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceCertificateOrder(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceCertificateOrder",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        auto_renew: typing.Optional[builtins.bool] = None,
        csr: typing.Optional[builtins.str] = None,
        distinguished_name: typing.Optional[builtins.str] = None,
        key_size: typing.Optional[jsii.Number] = None,
        product_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceCertificateOrderTimeouts"] = None,
        validity_in_years: typing.Optional[jsii.Number] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param auto_renew: -
        :param csr: -
        :param distinguished_name: -
        :param key_size: -
        :param product_type: -
        :param tags: -
        :param timeouts: timeouts block.
        :param validity_in_years: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceCertificateOrderConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            auto_renew=auto_renew,
            csr=csr,
            distinguished_name=distinguished_name,
            key_size=key_size,
            product_type=product_type,
            tags=tags,
            timeouts=timeouts,
            validity_in_years=validity_in_years,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceCertificateOrder, self, [scope, id, config])

    @jsii.member(jsii_name="certificates")
    def certificates(
        self,
        index: builtins.str,
    ) -> "AppServiceCertificateOrderCertificates":
        """
        :param index: -
        """
        return jsii.invoke(self, "certificates", [index])

    @jsii.member(jsii_name="resetAutoRenew")
    def reset_auto_renew(self) -> None:
        return jsii.invoke(self, "resetAutoRenew", [])

    @jsii.member(jsii_name="resetCsr")
    def reset_csr(self) -> None:
        return jsii.invoke(self, "resetCsr", [])

    @jsii.member(jsii_name="resetDistinguishedName")
    def reset_distinguished_name(self) -> None:
        return jsii.invoke(self, "resetDistinguishedName", [])

    @jsii.member(jsii_name="resetKeySize")
    def reset_key_size(self) -> None:
        return jsii.invoke(self, "resetKeySize", [])

    @jsii.member(jsii_name="resetProductType")
    def reset_product_type(self) -> None:
        return jsii.invoke(self, "resetProductType", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetValidityInYears")
    def reset_validity_in_years(self) -> None:
        return jsii.invoke(self, "resetValidityInYears", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceCertificateNotRenewableReasons")
    def app_service_certificate_not_renewable_reasons(
        self,
    ) -> typing.List[builtins.str]:
        return jsii.get(self, "appServiceCertificateNotRenewableReasons")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainVerificationToken")
    def domain_verification_token(self) -> builtins.str:
        return jsii.get(self, "domainVerificationToken")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> builtins.str:
        return jsii.get(self, "expirationTime")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intermediateThumbprint")
    def intermediate_thumbprint(self) -> builtins.str:
        return jsii.get(self, "intermediateThumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isPrivateKeyExternal")
    def is_private_key_external(self) -> builtins.bool:
        return jsii.get(self, "isPrivateKeyExternal")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rootThumbprint")
    def root_thumbprint(self) -> builtins.str:
        return jsii.get(self, "rootThumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signedCertificateThumbprint")
    def signed_certificate_thumbprint(self) -> builtins.str:
        return jsii.get(self, "signedCertificateThumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoRenewInput")
    def auto_renew_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoRenewInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="csrInput")
    def csr_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "csrInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="distinguishedNameInput")
    def distinguished_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "distinguishedNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keySizeInput")
    def key_size_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "keySizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productTypeInput")
    def product_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "productTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceCertificateOrderTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validityInYearsInput")
    def validity_in_years_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "validityInYearsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoRenew")
    def auto_renew(self) -> builtins.bool:
        return jsii.get(self, "autoRenew")

    @auto_renew.setter # type: ignore
    def auto_renew(self, value: builtins.bool) -> None:
        jsii.set(self, "autoRenew", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="csr")
    def csr(self) -> builtins.str:
        return jsii.get(self, "csr")

    @csr.setter # type: ignore
    def csr(self, value: builtins.str) -> None:
        jsii.set(self, "csr", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="distinguishedName")
    def distinguished_name(self) -> builtins.str:
        return jsii.get(self, "distinguishedName")

    @distinguished_name.setter # type: ignore
    def distinguished_name(self, value: builtins.str) -> None:
        jsii.set(self, "distinguishedName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keySize")
    def key_size(self) -> jsii.Number:
        return jsii.get(self, "keySize")

    @key_size.setter # type: ignore
    def key_size(self, value: jsii.Number) -> None:
        jsii.set(self, "keySize", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productType")
    def product_type(self) -> builtins.str:
        return jsii.get(self, "productType")

    @product_type.setter # type: ignore
    def product_type(self, value: builtins.str) -> None:
        jsii.set(self, "productType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceCertificateOrderTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceCertificateOrderTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validityInYears")
    def validity_in_years(self) -> jsii.Number:
        return jsii.get(self, "validityInYears")

    @validity_in_years.setter # type: ignore
    def validity_in_years(self, value: jsii.Number) -> None:
        jsii.set(self, "validityInYears", value)


class AppServiceCertificateOrderCertificates(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceCertificateOrderCertificates",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(AppServiceCertificateOrderCertificates, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateName")
    def certificate_name(self) -> builtins.str:
        return jsii.get(self, "certificateName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultSecretName")
    def key_vault_secret_name(self) -> builtins.str:
        return jsii.get(self, "keyVaultSecretName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisioningState")
    def provisioning_state(self) -> builtins.str:
        return jsii.get(self, "provisioningState")


@jsii.data_type(
    jsii_type="azurerm.AppServiceCertificateOrderConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "auto_renew": "autoRenew",
        "csr": "csr",
        "distinguished_name": "distinguishedName",
        "key_size": "keySize",
        "product_type": "productType",
        "tags": "tags",
        "timeouts": "timeouts",
        "validity_in_years": "validityInYears",
    },
)
class AppServiceCertificateOrderConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        auto_renew: typing.Optional[builtins.bool] = None,
        csr: typing.Optional[builtins.str] = None,
        distinguished_name: typing.Optional[builtins.str] = None,
        key_size: typing.Optional[jsii.Number] = None,
        product_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceCertificateOrderTimeouts"] = None,
        validity_in_years: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param auto_renew: -
        :param csr: -
        :param distinguished_name: -
        :param key_size: -
        :param product_type: -
        :param tags: -
        :param timeouts: timeouts block.
        :param validity_in_years: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceCertificateOrderTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_renew is not None:
            self._values["auto_renew"] = auto_renew
        if csr is not None:
            self._values["csr"] = csr
        if distinguished_name is not None:
            self._values["distinguished_name"] = distinguished_name
        if key_size is not None:
            self._values["key_size"] = key_size
        if product_type is not None:
            self._values["product_type"] = product_type
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if validity_in_years is not None:
            self._values["validity_in_years"] = validity_in_years

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def auto_renew(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_renew")
        return result

    @builtins.property
    def csr(self) -> typing.Optional[builtins.str]:
        result = self._values.get("csr")
        return result

    @builtins.property
    def distinguished_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("distinguished_name")
        return result

    @builtins.property
    def key_size(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("key_size")
        return result

    @builtins.property
    def product_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("product_type")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceCertificateOrderTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def validity_in_years(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("validity_in_years")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCertificateOrderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceCertificateOrderTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceCertificateOrderTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCertificateOrderTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_plan_id": "appServicePlanId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "app_settings": "appSettings",
        "auth_settings": "authSettings",
        "backup": "backup",
        "client_affinity_enabled": "clientAffinityEnabled",
        "client_cert_enabled": "clientCertEnabled",
        "connection_string": "connectionString",
        "enabled": "enabled",
        "https_only": "httpsOnly",
        "identity": "identity",
        "logs": "logs",
        "site_config": "siteConfig",
        "source_control": "sourceControl",
        "storage_account": "storageAccount",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AppServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_plan_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List[AppServiceAuthSettings]] = None,
        backup: typing.Optional[typing.List[AppServiceBackup]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        client_cert_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["AppServiceConnectionString"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["AppServiceIdentity"]] = None,
        logs: typing.Optional[typing.List["AppServiceLogs"]] = None,
        site_config: typing.Optional[typing.List["AppServiceSiteConfig"]] = None,
        source_control: typing.Optional[typing.List["AppServiceSourceControl"]] = None,
        storage_account: typing.Optional[typing.List["AppServiceStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_plan_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param backup: backup block.
        :param client_affinity_enabled: -
        :param client_cert_enabled: -
        :param connection_string: connection_string block.
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param logs: logs block.
        :param site_config: site_config block.
        :param source_control: source_control block.
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_plan_id": app_service_plan_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if app_settings is not None:
            self._values["app_settings"] = app_settings
        if auth_settings is not None:
            self._values["auth_settings"] = auth_settings
        if backup is not None:
            self._values["backup"] = backup
        if client_affinity_enabled is not None:
            self._values["client_affinity_enabled"] = client_affinity_enabled
        if client_cert_enabled is not None:
            self._values["client_cert_enabled"] = client_cert_enabled
        if connection_string is not None:
            self._values["connection_string"] = connection_string
        if enabled is not None:
            self._values["enabled"] = enabled
        if https_only is not None:
            self._values["https_only"] = https_only
        if identity is not None:
            self._values["identity"] = identity
        if logs is not None:
            self._values["logs"] = logs
        if site_config is not None:
            self._values["site_config"] = site_config
        if source_control is not None:
            self._values["source_control"] = source_control
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_plan_id(self) -> builtins.str:
        result = self._values.get("app_service_plan_id")
        assert result is not None, "Required property 'app_service_plan_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def app_settings(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("app_settings")
        return result

    @builtins.property
    def auth_settings(self) -> typing.Optional[typing.List[AppServiceAuthSettings]]:
        """auth_settings block."""
        result = self._values.get("auth_settings")
        return result

    @builtins.property
    def backup(self) -> typing.Optional[typing.List[AppServiceBackup]]:
        """backup block."""
        result = self._values.get("backup")
        return result

    @builtins.property
    def client_affinity_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("client_affinity_enabled")
        return result

    @builtins.property
    def client_cert_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("client_cert_enabled")
        return result

    @builtins.property
    def connection_string(
        self,
    ) -> typing.Optional[typing.List["AppServiceConnectionString"]]:
        """connection_string block."""
        result = self._values.get("connection_string")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def https_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("https_only")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["AppServiceIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def logs(self) -> typing.Optional[typing.List["AppServiceLogs"]]:
        """logs block."""
        result = self._values.get("logs")
        return result

    @builtins.property
    def site_config(self) -> typing.Optional[typing.List["AppServiceSiteConfig"]]:
        """site_config block."""
        result = self._values.get("site_config")
        return result

    @builtins.property
    def source_control(self) -> typing.Optional[typing.List["AppServiceSourceControl"]]:
        """source_control block."""
        result = self._values.get("source_control")
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["AppServiceStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceConnectionString",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "type": "type", "value": "value"},
)
class AppServiceConnectionString:
    def __init__(
        self,
        *,
        name: builtins.str,
        type: builtins.str,
        value: builtins.str,
    ) -> None:
        """
        :param name: -
        :param type: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "type": type,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceConnectionString(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceCustomHostnameBinding(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceCustomHostnameBinding",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_name: builtins.str,
        hostname: builtins.str,
        resource_group_name: builtins.str,
        ssl_state: typing.Optional[builtins.str] = None,
        thumbprint: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AppServiceCustomHostnameBindingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_name: -
        :param hostname: -
        :param resource_group_name: -
        :param ssl_state: -
        :param thumbprint: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceCustomHostnameBindingConfig(
            app_service_name=app_service_name,
            hostname=hostname,
            resource_group_name=resource_group_name,
            ssl_state=ssl_state,
            thumbprint=thumbprint,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceCustomHostnameBinding, self, [scope, id, config])

    @jsii.member(jsii_name="resetSslState")
    def reset_ssl_state(self) -> None:
        return jsii.invoke(self, "resetSslState", [])

    @jsii.member(jsii_name="resetThumbprint")
    def reset_thumbprint(self) -> None:
        return jsii.invoke(self, "resetThumbprint", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceNameInput")
    def app_service_name_input(self) -> builtins.str:
        return jsii.get(self, "appServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostnameInput")
    def hostname_input(self) -> builtins.str:
        return jsii.get(self, "hostnameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualIp")
    def virtual_ip(self) -> builtins.str:
        return jsii.get(self, "virtualIp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslStateInput")
    def ssl_state_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sslStateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprintInput")
    def thumbprint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "thumbprintInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["AppServiceCustomHostnameBindingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceName")
    def app_service_name(self) -> builtins.str:
        return jsii.get(self, "appServiceName")

    @app_service_name.setter # type: ignore
    def app_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @hostname.setter # type: ignore
    def hostname(self, value: builtins.str) -> None:
        jsii.set(self, "hostname", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslState")
    def ssl_state(self) -> builtins.str:
        return jsii.get(self, "sslState")

    @ssl_state.setter # type: ignore
    def ssl_state(self, value: builtins.str) -> None:
        jsii.set(self, "sslState", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @thumbprint.setter # type: ignore
    def thumbprint(self, value: builtins.str) -> None:
        jsii.set(self, "thumbprint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceCustomHostnameBindingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceCustomHostnameBindingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceCustomHostnameBindingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_name": "appServiceName",
        "hostname": "hostname",
        "resource_group_name": "resourceGroupName",
        "ssl_state": "sslState",
        "thumbprint": "thumbprint",
        "timeouts": "timeouts",
    },
)
class AppServiceCustomHostnameBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_name: builtins.str,
        hostname: builtins.str,
        resource_group_name: builtins.str,
        ssl_state: typing.Optional[builtins.str] = None,
        thumbprint: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AppServiceCustomHostnameBindingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_name: -
        :param hostname: -
        :param resource_group_name: -
        :param ssl_state: -
        :param thumbprint: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceCustomHostnameBindingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_name": app_service_name,
            "hostname": hostname,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if ssl_state is not None:
            self._values["ssl_state"] = ssl_state
        if thumbprint is not None:
            self._values["thumbprint"] = thumbprint
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_name(self) -> builtins.str:
        result = self._values.get("app_service_name")
        assert result is not None, "Required property 'app_service_name' is missing"
        return result

    @builtins.property
    def hostname(self) -> builtins.str:
        result = self._values.get("hostname")
        assert result is not None, "Required property 'hostname' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ssl_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssl_state")
        return result

    @builtins.property
    def thumbprint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("thumbprint")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceCustomHostnameBindingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCustomHostnameBindingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceCustomHostnameBindingTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceCustomHostnameBindingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceCustomHostnameBindingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceEnvironment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceEnvironment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        subnet_id: builtins.str,
        allowed_user_ip_cidrs: typing.Optional[typing.List[builtins.str]] = None,
        front_end_scale_factor: typing.Optional[jsii.Number] = None,
        internal_load_balancing_mode: typing.Optional[builtins.str] = None,
        pricing_tier: typing.Optional[builtins.str] = None,
        resource_group_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceEnvironmentTimeouts"] = None,
        user_whitelisted_ip_ranges: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param subnet_id: -
        :param allowed_user_ip_cidrs: -
        :param front_end_scale_factor: -
        :param internal_load_balancing_mode: -
        :param pricing_tier: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param user_whitelisted_ip_ranges: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceEnvironmentConfig(
            name=name,
            subnet_id=subnet_id,
            allowed_user_ip_cidrs=allowed_user_ip_cidrs,
            front_end_scale_factor=front_end_scale_factor,
            internal_load_balancing_mode=internal_load_balancing_mode,
            pricing_tier=pricing_tier,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            user_whitelisted_ip_ranges=user_whitelisted_ip_ranges,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceEnvironment, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowedUserIpCidrs")
    def reset_allowed_user_ip_cidrs(self) -> None:
        return jsii.invoke(self, "resetAllowedUserIpCidrs", [])

    @jsii.member(jsii_name="resetFrontEndScaleFactor")
    def reset_front_end_scale_factor(self) -> None:
        return jsii.invoke(self, "resetFrontEndScaleFactor", [])

    @jsii.member(jsii_name="resetInternalLoadBalancingMode")
    def reset_internal_load_balancing_mode(self) -> None:
        return jsii.invoke(self, "resetInternalLoadBalancingMode", [])

    @jsii.member(jsii_name="resetPricingTier")
    def reset_pricing_tier(self) -> None:
        return jsii.invoke(self, "resetPricingTier", [])

    @jsii.member(jsii_name="resetResourceGroupName")
    def reset_resource_group_name(self) -> None:
        return jsii.invoke(self, "resetResourceGroupName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUserWhitelistedIpRanges")
    def reset_user_whitelisted_ip_ranges(self) -> None:
        return jsii.invoke(self, "resetUserWhitelistedIpRanges", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedUserIpCidrsInput")
    def allowed_user_ip_cidrs_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "allowedUserIpCidrsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontEndScaleFactorInput")
    def front_end_scale_factor_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "frontEndScaleFactorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internalLoadBalancingModeInput")
    def internal_load_balancing_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "internalLoadBalancingModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pricingTierInput")
    def pricing_tier_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "pricingTierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceEnvironmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userWhitelistedIpRangesInput")
    def user_whitelisted_ip_ranges_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "userWhitelistedIpRangesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedUserIpCidrs")
    def allowed_user_ip_cidrs(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedUserIpCidrs")

    @allowed_user_ip_cidrs.setter # type: ignore
    def allowed_user_ip_cidrs(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "allowedUserIpCidrs", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontEndScaleFactor")
    def front_end_scale_factor(self) -> jsii.Number:
        return jsii.get(self, "frontEndScaleFactor")

    @front_end_scale_factor.setter # type: ignore
    def front_end_scale_factor(self, value: jsii.Number) -> None:
        jsii.set(self, "frontEndScaleFactor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internalLoadBalancingMode")
    def internal_load_balancing_mode(self) -> builtins.str:
        return jsii.get(self, "internalLoadBalancingMode")

    @internal_load_balancing_mode.setter # type: ignore
    def internal_load_balancing_mode(self, value: builtins.str) -> None:
        jsii.set(self, "internalLoadBalancingMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pricingTier")
    def pricing_tier(self) -> builtins.str:
        return jsii.get(self, "pricingTier")

    @pricing_tier.setter # type: ignore
    def pricing_tier(self, value: builtins.str) -> None:
        jsii.set(self, "pricingTier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceEnvironmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceEnvironmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userWhitelistedIpRanges")
    def user_whitelisted_ip_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "userWhitelistedIpRanges")

    @user_whitelisted_ip_ranges.setter # type: ignore
    def user_whitelisted_ip_ranges(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "userWhitelistedIpRanges", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceEnvironmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "subnet_id": "subnetId",
        "allowed_user_ip_cidrs": "allowedUserIpCidrs",
        "front_end_scale_factor": "frontEndScaleFactor",
        "internal_load_balancing_mode": "internalLoadBalancingMode",
        "pricing_tier": "pricingTier",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
        "user_whitelisted_ip_ranges": "userWhitelistedIpRanges",
    },
)
class AppServiceEnvironmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        subnet_id: builtins.str,
        allowed_user_ip_cidrs: typing.Optional[typing.List[builtins.str]] = None,
        front_end_scale_factor: typing.Optional[jsii.Number] = None,
        internal_load_balancing_mode: typing.Optional[builtins.str] = None,
        pricing_tier: typing.Optional[builtins.str] = None,
        resource_group_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceEnvironmentTimeouts"] = None,
        user_whitelisted_ip_ranges: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param subnet_id: -
        :param allowed_user_ip_cidrs: -
        :param front_end_scale_factor: -
        :param internal_load_balancing_mode: -
        :param pricing_tier: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param user_whitelisted_ip_ranges: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceEnvironmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allowed_user_ip_cidrs is not None:
            self._values["allowed_user_ip_cidrs"] = allowed_user_ip_cidrs
        if front_end_scale_factor is not None:
            self._values["front_end_scale_factor"] = front_end_scale_factor
        if internal_load_balancing_mode is not None:
            self._values["internal_load_balancing_mode"] = internal_load_balancing_mode
        if pricing_tier is not None:
            self._values["pricing_tier"] = pricing_tier
        if resource_group_name is not None:
            self._values["resource_group_name"] = resource_group_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if user_whitelisted_ip_ranges is not None:
            self._values["user_whitelisted_ip_ranges"] = user_whitelisted_ip_ranges

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def allowed_user_ip_cidrs(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_user_ip_cidrs")
        return result

    @builtins.property
    def front_end_scale_factor(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("front_end_scale_factor")
        return result

    @builtins.property
    def internal_load_balancing_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("internal_load_balancing_mode")
        return result

    @builtins.property
    def pricing_tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("pricing_tier")
        return result

    @builtins.property
    def resource_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_group_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceEnvironmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def user_whitelisted_ip_ranges(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("user_whitelisted_ip_ranges")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceEnvironmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceEnvironmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceEnvironmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceEnvironmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceHybridConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceHybridConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_name: builtins.str,
        hostname: builtins.str,
        port: jsii.Number,
        relay_id: builtins.str,
        resource_group_name: builtins.str,
        send_key_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AppServiceHybridConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_name: -
        :param hostname: -
        :param port: -
        :param relay_id: -
        :param resource_group_name: -
        :param send_key_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceHybridConnectionConfig(
            app_service_name=app_service_name,
            hostname=hostname,
            port=port,
            relay_id=relay_id,
            resource_group_name=resource_group_name,
            send_key_name=send_key_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceHybridConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetSendKeyName")
    def reset_send_key_name(self) -> None:
        return jsii.invoke(self, "resetSendKeyName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceNameInput")
    def app_service_name_input(self) -> builtins.str:
        return jsii.get(self, "appServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostnameInput")
    def hostname_input(self) -> builtins.str:
        return jsii.get(self, "hostnameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portInput")
    def port_input(self) -> jsii.Number:
        return jsii.get(self, "portInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relayIdInput")
    def relay_id_input(self) -> builtins.str:
        return jsii.get(self, "relayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relayName")
    def relay_name(self) -> builtins.str:
        return jsii.get(self, "relayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendKeyValue")
    def send_key_value(self) -> builtins.str:
        return jsii.get(self, "sendKeyValue")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceBusNamespace")
    def service_bus_namespace(self) -> builtins.str:
        return jsii.get(self, "serviceBusNamespace")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceBusSuffix")
    def service_bus_suffix(self) -> builtins.str:
        return jsii.get(self, "serviceBusSuffix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendKeyNameInput")
    def send_key_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sendKeyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceHybridConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceName")
    def app_service_name(self) -> builtins.str:
        return jsii.get(self, "appServiceName")

    @app_service_name.setter # type: ignore
    def app_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @hostname.setter # type: ignore
    def hostname(self, value: builtins.str) -> None:
        jsii.set(self, "hostname", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @port.setter # type: ignore
    def port(self, value: jsii.Number) -> None:
        jsii.set(self, "port", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relayId")
    def relay_id(self) -> builtins.str:
        return jsii.get(self, "relayId")

    @relay_id.setter # type: ignore
    def relay_id(self, value: builtins.str) -> None:
        jsii.set(self, "relayId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendKeyName")
    def send_key_name(self) -> builtins.str:
        return jsii.get(self, "sendKeyName")

    @send_key_name.setter # type: ignore
    def send_key_name(self, value: builtins.str) -> None:
        jsii.set(self, "sendKeyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceHybridConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceHybridConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceHybridConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_name": "appServiceName",
        "hostname": "hostname",
        "port": "port",
        "relay_id": "relayId",
        "resource_group_name": "resourceGroupName",
        "send_key_name": "sendKeyName",
        "timeouts": "timeouts",
    },
)
class AppServiceHybridConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_name: builtins.str,
        hostname: builtins.str,
        port: jsii.Number,
        relay_id: builtins.str,
        resource_group_name: builtins.str,
        send_key_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AppServiceHybridConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_name: -
        :param hostname: -
        :param port: -
        :param relay_id: -
        :param resource_group_name: -
        :param send_key_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceHybridConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_name": app_service_name,
            "hostname": hostname,
            "port": port,
            "relay_id": relay_id,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if send_key_name is not None:
            self._values["send_key_name"] = send_key_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_name(self) -> builtins.str:
        result = self._values.get("app_service_name")
        assert result is not None, "Required property 'app_service_name' is missing"
        return result

    @builtins.property
    def hostname(self) -> builtins.str:
        result = self._values.get("hostname")
        assert result is not None, "Required property 'hostname' is missing"
        return result

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def relay_id(self) -> builtins.str:
        result = self._values.get("relay_id")
        assert result is not None, "Required property 'relay_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def send_key_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("send_key_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceHybridConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceHybridConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceHybridConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceHybridConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceHybridConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class AppServiceIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceLogs",
    jsii_struct_bases=[],
    name_mapping={"application_logs": "applicationLogs", "http_logs": "httpLogs"},
)
class AppServiceLogs:
    def __init__(
        self,
        *,
        application_logs: typing.Optional[typing.List["AppServiceLogsApplicationLogs"]] = None,
        http_logs: typing.Optional[typing.List["AppServiceLogsHttpLogs"]] = None,
    ) -> None:
        """
        :param application_logs: application_logs block.
        :param http_logs: http_logs block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if application_logs is not None:
            self._values["application_logs"] = application_logs
        if http_logs is not None:
            self._values["http_logs"] = http_logs

    @builtins.property
    def application_logs(
        self,
    ) -> typing.Optional[typing.List["AppServiceLogsApplicationLogs"]]:
        """application_logs block."""
        result = self._values.get("application_logs")
        return result

    @builtins.property
    def http_logs(self) -> typing.Optional[typing.List["AppServiceLogsHttpLogs"]]:
        """http_logs block."""
        result = self._values.get("http_logs")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceLogs(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceLogsApplicationLogs",
    jsii_struct_bases=[],
    name_mapping={
        "azure_blob_storage": "azureBlobStorage",
        "file_system_level": "fileSystemLevel",
    },
)
class AppServiceLogsApplicationLogs:
    def __init__(
        self,
        *,
        azure_blob_storage: typing.Optional[typing.List["AppServiceLogsApplicationLogsAzureBlobStorage"]] = None,
        file_system_level: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param azure_blob_storage: azure_blob_storage block.
        :param file_system_level: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if azure_blob_storage is not None:
            self._values["azure_blob_storage"] = azure_blob_storage
        if file_system_level is not None:
            self._values["file_system_level"] = file_system_level

    @builtins.property
    def azure_blob_storage(
        self,
    ) -> typing.Optional[typing.List["AppServiceLogsApplicationLogsAzureBlobStorage"]]:
        """azure_blob_storage block."""
        result = self._values.get("azure_blob_storage")
        return result

    @builtins.property
    def file_system_level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_system_level")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceLogsApplicationLogs(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceLogsApplicationLogsAzureBlobStorage",
    jsii_struct_bases=[],
    name_mapping={
        "level": "level",
        "retention_in_days": "retentionInDays",
        "sas_url": "sasUrl",
    },
)
class AppServiceLogsApplicationLogsAzureBlobStorage:
    def __init__(
        self,
        *,
        level: builtins.str,
        retention_in_days: jsii.Number,
        sas_url: builtins.str,
    ) -> None:
        """
        :param level: -
        :param retention_in_days: -
        :param sas_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "level": level,
            "retention_in_days": retention_in_days,
            "sas_url": sas_url,
        }

    @builtins.property
    def level(self) -> builtins.str:
        result = self._values.get("level")
        assert result is not None, "Required property 'level' is missing"
        return result

    @builtins.property
    def retention_in_days(self) -> jsii.Number:
        result = self._values.get("retention_in_days")
        assert result is not None, "Required property 'retention_in_days' is missing"
        return result

    @builtins.property
    def sas_url(self) -> builtins.str:
        result = self._values.get("sas_url")
        assert result is not None, "Required property 'sas_url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceLogsApplicationLogsAzureBlobStorage(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceLogsHttpLogs",
    jsii_struct_bases=[],
    name_mapping={
        "azure_blob_storage": "azureBlobStorage",
        "file_system": "fileSystem",
    },
)
class AppServiceLogsHttpLogs:
    def __init__(
        self,
        *,
        azure_blob_storage: typing.Optional[typing.List["AppServiceLogsHttpLogsAzureBlobStorage"]] = None,
        file_system: typing.Optional[typing.List["AppServiceLogsHttpLogsFileSystem"]] = None,
    ) -> None:
        """
        :param azure_blob_storage: azure_blob_storage block.
        :param file_system: file_system block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if azure_blob_storage is not None:
            self._values["azure_blob_storage"] = azure_blob_storage
        if file_system is not None:
            self._values["file_system"] = file_system

    @builtins.property
    def azure_blob_storage(
        self,
    ) -> typing.Optional[typing.List["AppServiceLogsHttpLogsAzureBlobStorage"]]:
        """azure_blob_storage block."""
        result = self._values.get("azure_blob_storage")
        return result

    @builtins.property
    def file_system(
        self,
    ) -> typing.Optional[typing.List["AppServiceLogsHttpLogsFileSystem"]]:
        """file_system block."""
        result = self._values.get("file_system")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceLogsHttpLogs(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceLogsHttpLogsAzureBlobStorage",
    jsii_struct_bases=[],
    name_mapping={"retention_in_days": "retentionInDays", "sas_url": "sasUrl"},
)
class AppServiceLogsHttpLogsAzureBlobStorage:
    def __init__(
        self,
        *,
        retention_in_days: jsii.Number,
        sas_url: builtins.str,
    ) -> None:
        """
        :param retention_in_days: -
        :param sas_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "retention_in_days": retention_in_days,
            "sas_url": sas_url,
        }

    @builtins.property
    def retention_in_days(self) -> jsii.Number:
        result = self._values.get("retention_in_days")
        assert result is not None, "Required property 'retention_in_days' is missing"
        return result

    @builtins.property
    def sas_url(self) -> builtins.str:
        result = self._values.get("sas_url")
        assert result is not None, "Required property 'sas_url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceLogsHttpLogsAzureBlobStorage(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceLogsHttpLogsFileSystem",
    jsii_struct_bases=[],
    name_mapping={
        "retention_in_days": "retentionInDays",
        "retention_in_mb": "retentionInMb",
    },
)
class AppServiceLogsHttpLogsFileSystem:
    def __init__(
        self,
        *,
        retention_in_days: jsii.Number,
        retention_in_mb: jsii.Number,
    ) -> None:
        """
        :param retention_in_days: -
        :param retention_in_mb: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "retention_in_days": retention_in_days,
            "retention_in_mb": retention_in_mb,
        }

    @builtins.property
    def retention_in_days(self) -> jsii.Number:
        result = self._values.get("retention_in_days")
        assert result is not None, "Required property 'retention_in_days' is missing"
        return result

    @builtins.property
    def retention_in_mb(self) -> jsii.Number:
        result = self._values.get("retention_in_mb")
        assert result is not None, "Required property 'retention_in_mb' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceLogsHttpLogsFileSystem(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceManagedCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceManagedCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        custom_hostname_binding_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceManagedCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param custom_hostname_binding_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceManagedCertificateConfig(
            custom_hostname_binding_id=custom_hostname_binding_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceManagedCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="canonicalName")
    def canonical_name(self) -> builtins.str:
        return jsii.get(self, "canonicalName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHostnameBindingIdInput")
    def custom_hostname_binding_id_input(self) -> builtins.str:
        return jsii.get(self, "customHostnameBindingIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationDate")
    def expiration_date(self) -> builtins.str:
        return jsii.get(self, "expirationDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostNames")
    def host_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "hostNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="issueDate")
    def issue_date(self) -> builtins.str:
        return jsii.get(self, "issueDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="issuer")
    def issuer(self) -> builtins.str:
        return jsii.get(self, "issuer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subjectName")
    def subject_name(self) -> builtins.str:
        return jsii.get(self, "subjectName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceManagedCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHostnameBindingId")
    def custom_hostname_binding_id(self) -> builtins.str:
        return jsii.get(self, "customHostnameBindingId")

    @custom_hostname_binding_id.setter # type: ignore
    def custom_hostname_binding_id(self, value: builtins.str) -> None:
        jsii.set(self, "customHostnameBindingId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceManagedCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceManagedCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceManagedCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "custom_hostname_binding_id": "customHostnameBindingId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AppServiceManagedCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        custom_hostname_binding_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceManagedCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param custom_hostname_binding_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceManagedCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "custom_hostname_binding_id": custom_hostname_binding_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def custom_hostname_binding_id(self) -> builtins.str:
        result = self._values.get("custom_hostname_binding_id")
        assert result is not None, "Required property 'custom_hostname_binding_id' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceManagedCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceManagedCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceManagedCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceManagedCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceManagedCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServicePlan(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServicePlan",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["AppServicePlanSku"],
        app_service_environment_id: typing.Optional[builtins.str] = None,
        is_xenon: typing.Optional[builtins.bool] = None,
        kind: typing.Optional[builtins.str] = None,
        maximum_elastic_worker_count: typing.Optional[jsii.Number] = None,
        per_site_scaling: typing.Optional[builtins.bool] = None,
        reserved: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServicePlanTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param app_service_environment_id: -
        :param is_xenon: -
        :param kind: -
        :param maximum_elastic_worker_count: -
        :param per_site_scaling: -
        :param reserved: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServicePlanConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            app_service_environment_id=app_service_environment_id,
            is_xenon=is_xenon,
            kind=kind,
            maximum_elastic_worker_count=maximum_elastic_worker_count,
            per_site_scaling=per_site_scaling,
            reserved=reserved,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServicePlan, self, [scope, id, config])

    @jsii.member(jsii_name="resetAppServiceEnvironmentId")
    def reset_app_service_environment_id(self) -> None:
        return jsii.invoke(self, "resetAppServiceEnvironmentId", [])

    @jsii.member(jsii_name="resetIsXenon")
    def reset_is_xenon(self) -> None:
        return jsii.invoke(self, "resetIsXenon", [])

    @jsii.member(jsii_name="resetKind")
    def reset_kind(self) -> None:
        return jsii.invoke(self, "resetKind", [])

    @jsii.member(jsii_name="resetMaximumElasticWorkerCount")
    def reset_maximum_elastic_worker_count(self) -> None:
        return jsii.invoke(self, "resetMaximumElasticWorkerCount", [])

    @jsii.member(jsii_name="resetPerSiteScaling")
    def reset_per_site_scaling(self) -> None:
        return jsii.invoke(self, "resetPerSiteScaling", [])

    @jsii.member(jsii_name="resetReserved")
    def reset_reserved(self) -> None:
        return jsii.invoke(self, "resetReserved", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumNumberOfWorkers")
    def maximum_number_of_workers(self) -> jsii.Number:
        return jsii.get(self, "maximumNumberOfWorkers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["AppServicePlanSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceEnvironmentIdInput")
    def app_service_environment_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "appServiceEnvironmentIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isXenonInput")
    def is_xenon_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "isXenonInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kindInput")
    def kind_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "kindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumElasticWorkerCountInput")
    def maximum_elastic_worker_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumElasticWorkerCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="perSiteScalingInput")
    def per_site_scaling_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "perSiteScalingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reservedInput")
    def reserved_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "reservedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServicePlanTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceEnvironmentId")
    def app_service_environment_id(self) -> builtins.str:
        return jsii.get(self, "appServiceEnvironmentId")

    @app_service_environment_id.setter # type: ignore
    def app_service_environment_id(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceEnvironmentId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isXenon")
    def is_xenon(self) -> builtins.bool:
        return jsii.get(self, "isXenon")

    @is_xenon.setter # type: ignore
    def is_xenon(self, value: builtins.bool) -> None:
        jsii.set(self, "isXenon", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @kind.setter # type: ignore
    def kind(self, value: builtins.str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumElasticWorkerCount")
    def maximum_elastic_worker_count(self) -> jsii.Number:
        return jsii.get(self, "maximumElasticWorkerCount")

    @maximum_elastic_worker_count.setter # type: ignore
    def maximum_elastic_worker_count(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumElasticWorkerCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="perSiteScaling")
    def per_site_scaling(self) -> builtins.bool:
        return jsii.get(self, "perSiteScaling")

    @per_site_scaling.setter # type: ignore
    def per_site_scaling(self, value: builtins.bool) -> None:
        jsii.set(self, "perSiteScaling", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reserved")
    def reserved(self) -> builtins.bool:
        return jsii.get(self, "reserved")

    @reserved.setter # type: ignore
    def reserved(self, value: builtins.bool) -> None:
        jsii.set(self, "reserved", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["AppServicePlanSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["AppServicePlanSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServicePlanTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServicePlanTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServicePlanConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "app_service_environment_id": "appServiceEnvironmentId",
        "is_xenon": "isXenon",
        "kind": "kind",
        "maximum_elastic_worker_count": "maximumElasticWorkerCount",
        "per_site_scaling": "perSiteScaling",
        "reserved": "reserved",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AppServicePlanConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["AppServicePlanSku"],
        app_service_environment_id: typing.Optional[builtins.str] = None,
        is_xenon: typing.Optional[builtins.bool] = None,
        kind: typing.Optional[builtins.str] = None,
        maximum_elastic_worker_count: typing.Optional[jsii.Number] = None,
        per_site_scaling: typing.Optional[builtins.bool] = None,
        reserved: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServicePlanTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param app_service_environment_id: -
        :param is_xenon: -
        :param kind: -
        :param maximum_elastic_worker_count: -
        :param per_site_scaling: -
        :param reserved: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServicePlanTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if app_service_environment_id is not None:
            self._values["app_service_environment_id"] = app_service_environment_id
        if is_xenon is not None:
            self._values["is_xenon"] = is_xenon
        if kind is not None:
            self._values["kind"] = kind
        if maximum_elastic_worker_count is not None:
            self._values["maximum_elastic_worker_count"] = maximum_elastic_worker_count
        if per_site_scaling is not None:
            self._values["per_site_scaling"] = per_site_scaling
        if reserved is not None:
            self._values["reserved"] = reserved
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["AppServicePlanSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def app_service_environment_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("app_service_environment_id")
        return result

    @builtins.property
    def is_xenon(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("is_xenon")
        return result

    @builtins.property
    def kind(self) -> typing.Optional[builtins.str]:
        result = self._values.get("kind")
        return result

    @builtins.property
    def maximum_elastic_worker_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_elastic_worker_count")
        return result

    @builtins.property
    def per_site_scaling(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("per_site_scaling")
        return result

    @builtins.property
    def reserved(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("reserved")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServicePlanTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServicePlanConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServicePlanSku",
    jsii_struct_bases=[],
    name_mapping={"size": "size", "tier": "tier", "capacity": "capacity"},
)
class AppServicePlanSku:
    def __init__(
        self,
        *,
        size: builtins.str,
        tier: builtins.str,
        capacity: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param size: -
        :param tier: -
        :param capacity: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "size": size,
            "tier": tier,
        }
        if capacity is not None:
            self._values["capacity"] = capacity

    @builtins.property
    def size(self) -> builtins.str:
        result = self._values.get("size")
        assert result is not None, "Required property 'size' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def capacity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("capacity")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServicePlanSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServicePlanTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServicePlanTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServicePlanTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSiteConfig",
    jsii_struct_bases=[],
    name_mapping={
        "always_on": "alwaysOn",
        "app_command_line": "appCommandLine",
        "auto_swap_slot_name": "autoSwapSlotName",
        "cors": "cors",
        "default_documents": "defaultDocuments",
        "dotnet_framework_version": "dotnetFrameworkVersion",
        "ftps_state": "ftpsState",
        "health_check_path": "healthCheckPath",
        "http2_enabled": "http2Enabled",
        "ip_restriction": "ipRestriction",
        "java_container": "javaContainer",
        "java_container_version": "javaContainerVersion",
        "java_version": "javaVersion",
        "linux_fx_version": "linuxFxVersion",
        "local_mysql_enabled": "localMysqlEnabled",
        "managed_pipeline_mode": "managedPipelineMode",
        "min_tls_version": "minTlsVersion",
        "php_version": "phpVersion",
        "python_version": "pythonVersion",
        "remote_debugging_enabled": "remoteDebuggingEnabled",
        "remote_debugging_version": "remoteDebuggingVersion",
        "scm_ip_restriction": "scmIpRestriction",
        "scm_type": "scmType",
        "scm_use_main_ip_restriction": "scmUseMainIpRestriction",
        "use32_bit_worker_process": "use32BitWorkerProcess",
        "websockets_enabled": "websocketsEnabled",
        "windows_fx_version": "windowsFxVersion",
    },
)
class AppServiceSiteConfig:
    def __init__(
        self,
        *,
        always_on: typing.Optional[builtins.bool] = None,
        app_command_line: typing.Optional[builtins.str] = None,
        auto_swap_slot_name: typing.Optional[builtins.str] = None,
        cors: typing.Optional[typing.List["AppServiceSiteConfigCors"]] = None,
        default_documents: typing.Optional[typing.List[builtins.str]] = None,
        dotnet_framework_version: typing.Optional[builtins.str] = None,
        ftps_state: typing.Optional[builtins.str] = None,
        health_check_path: typing.Optional[builtins.str] = None,
        http2_enabled: typing.Optional[builtins.bool] = None,
        ip_restriction: typing.Optional[typing.List["AppServiceSiteConfigIpRestriction"]] = None,
        java_container: typing.Optional[builtins.str] = None,
        java_container_version: typing.Optional[builtins.str] = None,
        java_version: typing.Optional[builtins.str] = None,
        linux_fx_version: typing.Optional[builtins.str] = None,
        local_mysql_enabled: typing.Optional[builtins.bool] = None,
        managed_pipeline_mode: typing.Optional[builtins.str] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        php_version: typing.Optional[builtins.str] = None,
        python_version: typing.Optional[builtins.str] = None,
        remote_debugging_enabled: typing.Optional[builtins.bool] = None,
        remote_debugging_version: typing.Optional[builtins.str] = None,
        scm_ip_restriction: typing.Optional[typing.List["AppServiceSiteConfigScmIpRestriction"]] = None,
        scm_type: typing.Optional[builtins.str] = None,
        scm_use_main_ip_restriction: typing.Optional[builtins.bool] = None,
        use32_bit_worker_process: typing.Optional[builtins.bool] = None,
        websockets_enabled: typing.Optional[builtins.bool] = None,
        windows_fx_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param always_on: -
        :param app_command_line: -
        :param auto_swap_slot_name: -
        :param cors: cors block.
        :param default_documents: -
        :param dotnet_framework_version: -
        :param ftps_state: -
        :param health_check_path: -
        :param http2_enabled: -
        :param ip_restriction: -
        :param java_container: -
        :param java_container_version: -
        :param java_version: -
        :param linux_fx_version: -
        :param local_mysql_enabled: -
        :param managed_pipeline_mode: -
        :param min_tls_version: -
        :param php_version: -
        :param python_version: -
        :param remote_debugging_enabled: -
        :param remote_debugging_version: -
        :param scm_ip_restriction: -
        :param scm_type: -
        :param scm_use_main_ip_restriction: -
        :param use32_bit_worker_process: -
        :param websockets_enabled: -
        :param windows_fx_version: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if always_on is not None:
            self._values["always_on"] = always_on
        if app_command_line is not None:
            self._values["app_command_line"] = app_command_line
        if auto_swap_slot_name is not None:
            self._values["auto_swap_slot_name"] = auto_swap_slot_name
        if cors is not None:
            self._values["cors"] = cors
        if default_documents is not None:
            self._values["default_documents"] = default_documents
        if dotnet_framework_version is not None:
            self._values["dotnet_framework_version"] = dotnet_framework_version
        if ftps_state is not None:
            self._values["ftps_state"] = ftps_state
        if health_check_path is not None:
            self._values["health_check_path"] = health_check_path
        if http2_enabled is not None:
            self._values["http2_enabled"] = http2_enabled
        if ip_restriction is not None:
            self._values["ip_restriction"] = ip_restriction
        if java_container is not None:
            self._values["java_container"] = java_container
        if java_container_version is not None:
            self._values["java_container_version"] = java_container_version
        if java_version is not None:
            self._values["java_version"] = java_version
        if linux_fx_version is not None:
            self._values["linux_fx_version"] = linux_fx_version
        if local_mysql_enabled is not None:
            self._values["local_mysql_enabled"] = local_mysql_enabled
        if managed_pipeline_mode is not None:
            self._values["managed_pipeline_mode"] = managed_pipeline_mode
        if min_tls_version is not None:
            self._values["min_tls_version"] = min_tls_version
        if php_version is not None:
            self._values["php_version"] = php_version
        if python_version is not None:
            self._values["python_version"] = python_version
        if remote_debugging_enabled is not None:
            self._values["remote_debugging_enabled"] = remote_debugging_enabled
        if remote_debugging_version is not None:
            self._values["remote_debugging_version"] = remote_debugging_version
        if scm_ip_restriction is not None:
            self._values["scm_ip_restriction"] = scm_ip_restriction
        if scm_type is not None:
            self._values["scm_type"] = scm_type
        if scm_use_main_ip_restriction is not None:
            self._values["scm_use_main_ip_restriction"] = scm_use_main_ip_restriction
        if use32_bit_worker_process is not None:
            self._values["use32_bit_worker_process"] = use32_bit_worker_process
        if websockets_enabled is not None:
            self._values["websockets_enabled"] = websockets_enabled
        if windows_fx_version is not None:
            self._values["windows_fx_version"] = windows_fx_version

    @builtins.property
    def always_on(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("always_on")
        return result

    @builtins.property
    def app_command_line(self) -> typing.Optional[builtins.str]:
        result = self._values.get("app_command_line")
        return result

    @builtins.property
    def auto_swap_slot_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_swap_slot_name")
        return result

    @builtins.property
    def cors(self) -> typing.Optional[typing.List["AppServiceSiteConfigCors"]]:
        """cors block."""
        result = self._values.get("cors")
        return result

    @builtins.property
    def default_documents(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("default_documents")
        return result

    @builtins.property
    def dotnet_framework_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dotnet_framework_version")
        return result

    @builtins.property
    def ftps_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ftps_state")
        return result

    @builtins.property
    def health_check_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("health_check_path")
        return result

    @builtins.property
    def http2_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("http2_enabled")
        return result

    @builtins.property
    def ip_restriction(
        self,
    ) -> typing.Optional[typing.List["AppServiceSiteConfigIpRestriction"]]:
        result = self._values.get("ip_restriction")
        return result

    @builtins.property
    def java_container(self) -> typing.Optional[builtins.str]:
        result = self._values.get("java_container")
        return result

    @builtins.property
    def java_container_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("java_container_version")
        return result

    @builtins.property
    def java_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("java_version")
        return result

    @builtins.property
    def linux_fx_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("linux_fx_version")
        return result

    @builtins.property
    def local_mysql_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("local_mysql_enabled")
        return result

    @builtins.property
    def managed_pipeline_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_pipeline_mode")
        return result

    @builtins.property
    def min_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_tls_version")
        return result

    @builtins.property
    def php_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("php_version")
        return result

    @builtins.property
    def python_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("python_version")
        return result

    @builtins.property
    def remote_debugging_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("remote_debugging_enabled")
        return result

    @builtins.property
    def remote_debugging_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("remote_debugging_version")
        return result

    @builtins.property
    def scm_ip_restriction(
        self,
    ) -> typing.Optional[typing.List["AppServiceSiteConfigScmIpRestriction"]]:
        result = self._values.get("scm_ip_restriction")
        return result

    @builtins.property
    def scm_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scm_type")
        return result

    @builtins.property
    def scm_use_main_ip_restriction(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("scm_use_main_ip_restriction")
        return result

    @builtins.property
    def use32_bit_worker_process(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use32_bit_worker_process")
        return result

    @builtins.property
    def websockets_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("websockets_enabled")
        return result

    @builtins.property
    def windows_fx_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("windows_fx_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSiteConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSiteConfigCors",
    jsii_struct_bases=[],
    name_mapping={
        "allowed_origins": "allowedOrigins",
        "support_credentials": "supportCredentials",
    },
)
class AppServiceSiteConfigCors:
    def __init__(
        self,
        *,
        allowed_origins: typing.List[builtins.str],
        support_credentials: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param allowed_origins: -
        :param support_credentials: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_origins": allowed_origins,
        }
        if support_credentials is not None:
            self._values["support_credentials"] = support_credentials

    @builtins.property
    def allowed_origins(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_origins")
        assert result is not None, "Required property 'allowed_origins' is missing"
        return result

    @builtins.property
    def support_credentials(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("support_credentials")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSiteConfigCors(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSiteConfigIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class AppServiceSiteConfigIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSiteConfigIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSiteConfigScmIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class AppServiceSiteConfigScmIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSiteConfigScmIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceSiteCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceSiteCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(AppServiceSiteCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class AppServiceSlot(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceSlot",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_name: builtins.str,
        app_service_plan_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List["AppServiceSlotAuthSettings"]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["AppServiceSlotConnectionString"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["AppServiceSlotIdentity"]] = None,
        logs: typing.Optional[typing.List["AppServiceSlotLogs"]] = None,
        site_config: typing.Optional[typing.List["AppServiceSlotSiteConfig"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceSlotTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_name: -
        :param app_service_plan_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param client_affinity_enabled: -
        :param connection_string: connection_string block.
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param logs: logs block.
        :param site_config: site_config block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceSlotConfig(
            app_service_name=app_service_name,
            app_service_plan_id=app_service_plan_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            app_settings=app_settings,
            auth_settings=auth_settings,
            client_affinity_enabled=client_affinity_enabled,
            connection_string=connection_string,
            enabled=enabled,
            https_only=https_only,
            identity=identity,
            logs=logs,
            site_config=site_config,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceSlot, self, [scope, id, config])

    @jsii.member(jsii_name="resetAppSettings")
    def reset_app_settings(self) -> None:
        return jsii.invoke(self, "resetAppSettings", [])

    @jsii.member(jsii_name="resetAuthSettings")
    def reset_auth_settings(self) -> None:
        return jsii.invoke(self, "resetAuthSettings", [])

    @jsii.member(jsii_name="resetClientAffinityEnabled")
    def reset_client_affinity_enabled(self) -> None:
        return jsii.invoke(self, "resetClientAffinityEnabled", [])

    @jsii.member(jsii_name="resetConnectionString")
    def reset_connection_string(self) -> None:
        return jsii.invoke(self, "resetConnectionString", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetHttpsOnly")
    def reset_https_only(self) -> None:
        return jsii.invoke(self, "resetHttpsOnly", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLogs")
    def reset_logs(self) -> None:
        return jsii.invoke(self, "resetLogs", [])

    @jsii.member(jsii_name="resetSiteConfig")
    def reset_site_config(self) -> None:
        return jsii.invoke(self, "resetSiteConfig", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="siteCredential")
    def site_credential(self, index: builtins.str) -> "AppServiceSlotSiteCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteCredential", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceNameInput")
    def app_service_name_input(self) -> builtins.str:
        return jsii.get(self, "appServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanIdInput")
    def app_service_plan_id_input(self) -> builtins.str:
        return jsii.get(self, "appServicePlanIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSiteHostname")
    def default_site_hostname(self) -> builtins.str:
        return jsii.get(self, "defaultSiteHostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettingsInput")
    def app_settings_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "appSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettingsInput")
    def auth_settings_input(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotAuthSettings"]]:
        return jsii.get(self, "authSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabledInput")
    def client_affinity_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "clientAffinityEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotConnectionString"]]:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnlyInput")
    def https_only_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "httpsOnlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["AppServiceSlotIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logsInput")
    def logs_input(self) -> typing.Optional[typing.List["AppServiceSlotLogs"]]:
        return jsii.get(self, "logsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfigInput")
    def site_config_input(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotSiteConfig"]]:
        return jsii.get(self, "siteConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceSlotTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceName")
    def app_service_name(self) -> builtins.str:
        return jsii.get(self, "appServiceName")

    @app_service_name.setter # type: ignore
    def app_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanId")
    def app_service_plan_id(self) -> builtins.str:
        return jsii.get(self, "appServicePlanId")

    @app_service_plan_id.setter # type: ignore
    def app_service_plan_id(self, value: builtins.str) -> None:
        jsii.set(self, "appServicePlanId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettings")
    def app_settings(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "appSettings")

    @app_settings.setter # type: ignore
    def app_settings(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "appSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettings")
    def auth_settings(self) -> typing.List["AppServiceSlotAuthSettings"]:
        return jsii.get(self, "authSettings")

    @auth_settings.setter # type: ignore
    def auth_settings(self, value: typing.List["AppServiceSlotAuthSettings"]) -> None:
        jsii.set(self, "authSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabled")
    def client_affinity_enabled(self) -> builtins.bool:
        return jsii.get(self, "clientAffinityEnabled")

    @client_affinity_enabled.setter # type: ignore
    def client_affinity_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "clientAffinityEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> typing.List["AppServiceSlotConnectionString"]:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(
        self,
        value: typing.List["AppServiceSlotConnectionString"],
    ) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnly")
    def https_only(self) -> builtins.bool:
        return jsii.get(self, "httpsOnly")

    @https_only.setter # type: ignore
    def https_only(self, value: builtins.bool) -> None:
        jsii.set(self, "httpsOnly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["AppServiceSlotIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["AppServiceSlotIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logs")
    def logs(self) -> typing.List["AppServiceSlotLogs"]:
        return jsii.get(self, "logs")

    @logs.setter # type: ignore
    def logs(self, value: typing.List["AppServiceSlotLogs"]) -> None:
        jsii.set(self, "logs", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfig")
    def site_config(self) -> typing.List["AppServiceSlotSiteConfig"]:
        return jsii.get(self, "siteConfig")

    @site_config.setter # type: ignore
    def site_config(self, value: typing.List["AppServiceSlotSiteConfig"]) -> None:
        jsii.set(self, "siteConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceSlotTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceSlotTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotAuthSettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "active_directory": "activeDirectory",
        "additional_login_params": "additionalLoginParams",
        "allowed_external_redirect_urls": "allowedExternalRedirectUrls",
        "default_provider": "defaultProvider",
        "facebook": "facebook",
        "google": "google",
        "issuer": "issuer",
        "microsoft": "microsoft",
        "runtime_version": "runtimeVersion",
        "token_refresh_extension_hours": "tokenRefreshExtensionHours",
        "token_store_enabled": "tokenStoreEnabled",
        "twitter": "twitter",
        "unauthenticated_client_action": "unauthenticatedClientAction",
    },
)
class AppServiceSlotAuthSettings:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        active_directory: typing.Optional[typing.List["AppServiceSlotAuthSettingsActiveDirectory"]] = None,
        additional_login_params: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        allowed_external_redirect_urls: typing.Optional[typing.List[builtins.str]] = None,
        default_provider: typing.Optional[builtins.str] = None,
        facebook: typing.Optional[typing.List["AppServiceSlotAuthSettingsFacebook"]] = None,
        google: typing.Optional[typing.List["AppServiceSlotAuthSettingsGoogle"]] = None,
        issuer: typing.Optional[builtins.str] = None,
        microsoft: typing.Optional[typing.List["AppServiceSlotAuthSettingsMicrosoft"]] = None,
        runtime_version: typing.Optional[builtins.str] = None,
        token_refresh_extension_hours: typing.Optional[jsii.Number] = None,
        token_store_enabled: typing.Optional[builtins.bool] = None,
        twitter: typing.Optional[typing.List["AppServiceSlotAuthSettingsTwitter"]] = None,
        unauthenticated_client_action: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param active_directory: active_directory block.
        :param additional_login_params: -
        :param allowed_external_redirect_urls: -
        :param default_provider: -
        :param facebook: facebook block.
        :param google: google block.
        :param issuer: -
        :param microsoft: microsoft block.
        :param runtime_version: -
        :param token_refresh_extension_hours: -
        :param token_store_enabled: -
        :param twitter: twitter block.
        :param unauthenticated_client_action: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if active_directory is not None:
            self._values["active_directory"] = active_directory
        if additional_login_params is not None:
            self._values["additional_login_params"] = additional_login_params
        if allowed_external_redirect_urls is not None:
            self._values["allowed_external_redirect_urls"] = allowed_external_redirect_urls
        if default_provider is not None:
            self._values["default_provider"] = default_provider
        if facebook is not None:
            self._values["facebook"] = facebook
        if google is not None:
            self._values["google"] = google
        if issuer is not None:
            self._values["issuer"] = issuer
        if microsoft is not None:
            self._values["microsoft"] = microsoft
        if runtime_version is not None:
            self._values["runtime_version"] = runtime_version
        if token_refresh_extension_hours is not None:
            self._values["token_refresh_extension_hours"] = token_refresh_extension_hours
        if token_store_enabled is not None:
            self._values["token_store_enabled"] = token_store_enabled
        if twitter is not None:
            self._values["twitter"] = twitter
        if unauthenticated_client_action is not None:
            self._values["unauthenticated_client_action"] = unauthenticated_client_action

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def active_directory(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotAuthSettingsActiveDirectory"]]:
        """active_directory block."""
        result = self._values.get("active_directory")
        return result

    @builtins.property
    def additional_login_params(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_login_params")
        return result

    @builtins.property
    def allowed_external_redirect_urls(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_external_redirect_urls")
        return result

    @builtins.property
    def default_provider(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_provider")
        return result

    @builtins.property
    def facebook(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotAuthSettingsFacebook"]]:
        """facebook block."""
        result = self._values.get("facebook")
        return result

    @builtins.property
    def google(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotAuthSettingsGoogle"]]:
        """google block."""
        result = self._values.get("google")
        return result

    @builtins.property
    def issuer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("issuer")
        return result

    @builtins.property
    def microsoft(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotAuthSettingsMicrosoft"]]:
        """microsoft block."""
        result = self._values.get("microsoft")
        return result

    @builtins.property
    def runtime_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("runtime_version")
        return result

    @builtins.property
    def token_refresh_extension_hours(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("token_refresh_extension_hours")
        return result

    @builtins.property
    def token_store_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("token_store_enabled")
        return result

    @builtins.property
    def twitter(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotAuthSettingsTwitter"]]:
        """twitter block."""
        result = self._values.get("twitter")
        return result

    @builtins.property
    def unauthenticated_client_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("unauthenticated_client_action")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotAuthSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotAuthSettingsActiveDirectory",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "allowed_audiences": "allowedAudiences",
        "client_secret": "clientSecret",
    },
)
class AppServiceSlotAuthSettingsActiveDirectory:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        allowed_audiences: typing.Optional[typing.List[builtins.str]] = None,
        client_secret: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param client_id: -
        :param allowed_audiences: -
        :param client_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
        }
        if allowed_audiences is not None:
            self._values["allowed_audiences"] = allowed_audiences
        if client_secret is not None:
            self._values["client_secret"] = client_secret

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def allowed_audiences(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_audiences")
        return result

    @builtins.property
    def client_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("client_secret")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotAuthSettingsActiveDirectory(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotAuthSettingsFacebook",
    jsii_struct_bases=[],
    name_mapping={
        "app_id": "appId",
        "app_secret": "appSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class AppServiceSlotAuthSettingsFacebook:
    def __init__(
        self,
        *,
        app_id: builtins.str,
        app_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param app_id: -
        :param app_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "app_id": app_id,
            "app_secret": app_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def app_id(self) -> builtins.str:
        result = self._values.get("app_id")
        assert result is not None, "Required property 'app_id' is missing"
        return result

    @builtins.property
    def app_secret(self) -> builtins.str:
        result = self._values.get("app_secret")
        assert result is not None, "Required property 'app_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotAuthSettingsFacebook(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotAuthSettingsGoogle",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class AppServiceSlotAuthSettingsGoogle:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotAuthSettingsGoogle(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotAuthSettingsMicrosoft",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class AppServiceSlotAuthSettingsMicrosoft:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotAuthSettingsMicrosoft(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotAuthSettingsTwitter",
    jsii_struct_bases=[],
    name_mapping={"consumer_key": "consumerKey", "consumer_secret": "consumerSecret"},
)
class AppServiceSlotAuthSettingsTwitter:
    def __init__(
        self,
        *,
        consumer_key: builtins.str,
        consumer_secret: builtins.str,
    ) -> None:
        """
        :param consumer_key: -
        :param consumer_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "consumer_key": consumer_key,
            "consumer_secret": consumer_secret,
        }

    @builtins.property
    def consumer_key(self) -> builtins.str:
        result = self._values.get("consumer_key")
        assert result is not None, "Required property 'consumer_key' is missing"
        return result

    @builtins.property
    def consumer_secret(self) -> builtins.str:
        result = self._values.get("consumer_secret")
        assert result is not None, "Required property 'consumer_secret' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotAuthSettingsTwitter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_name": "appServiceName",
        "app_service_plan_id": "appServicePlanId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "app_settings": "appSettings",
        "auth_settings": "authSettings",
        "client_affinity_enabled": "clientAffinityEnabled",
        "connection_string": "connectionString",
        "enabled": "enabled",
        "https_only": "httpsOnly",
        "identity": "identity",
        "logs": "logs",
        "site_config": "siteConfig",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AppServiceSlotConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_name: builtins.str,
        app_service_plan_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List[AppServiceSlotAuthSettings]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["AppServiceSlotConnectionString"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["AppServiceSlotIdentity"]] = None,
        logs: typing.Optional[typing.List["AppServiceSlotLogs"]] = None,
        site_config: typing.Optional[typing.List["AppServiceSlotSiteConfig"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AppServiceSlotTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_name: -
        :param app_service_plan_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param client_affinity_enabled: -
        :param connection_string: connection_string block.
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param logs: logs block.
        :param site_config: site_config block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceSlotTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_name": app_service_name,
            "app_service_plan_id": app_service_plan_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if app_settings is not None:
            self._values["app_settings"] = app_settings
        if auth_settings is not None:
            self._values["auth_settings"] = auth_settings
        if client_affinity_enabled is not None:
            self._values["client_affinity_enabled"] = client_affinity_enabled
        if connection_string is not None:
            self._values["connection_string"] = connection_string
        if enabled is not None:
            self._values["enabled"] = enabled
        if https_only is not None:
            self._values["https_only"] = https_only
        if identity is not None:
            self._values["identity"] = identity
        if logs is not None:
            self._values["logs"] = logs
        if site_config is not None:
            self._values["site_config"] = site_config
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_name(self) -> builtins.str:
        result = self._values.get("app_service_name")
        assert result is not None, "Required property 'app_service_name' is missing"
        return result

    @builtins.property
    def app_service_plan_id(self) -> builtins.str:
        result = self._values.get("app_service_plan_id")
        assert result is not None, "Required property 'app_service_plan_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def app_settings(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("app_settings")
        return result

    @builtins.property
    def auth_settings(self) -> typing.Optional[typing.List[AppServiceSlotAuthSettings]]:
        """auth_settings block."""
        result = self._values.get("auth_settings")
        return result

    @builtins.property
    def client_affinity_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("client_affinity_enabled")
        return result

    @builtins.property
    def connection_string(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotConnectionString"]]:
        """connection_string block."""
        result = self._values.get("connection_string")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def https_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("https_only")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["AppServiceSlotIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def logs(self) -> typing.Optional[typing.List["AppServiceSlotLogs"]]:
        """logs block."""
        result = self._values.get("logs")
        return result

    @builtins.property
    def site_config(self) -> typing.Optional[typing.List["AppServiceSlotSiteConfig"]]:
        """site_config block."""
        result = self._values.get("site_config")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceSlotTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotConnectionString",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "type": "type", "value": "value"},
)
class AppServiceSlotConnectionString:
    def __init__(
        self,
        *,
        name: builtins.str,
        type: builtins.str,
        value: builtins.str,
    ) -> None:
        """
        :param name: -
        :param type: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "type": type,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotConnectionString(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class AppServiceSlotIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotLogs",
    jsii_struct_bases=[],
    name_mapping={"application_logs": "applicationLogs", "http_logs": "httpLogs"},
)
class AppServiceSlotLogs:
    def __init__(
        self,
        *,
        application_logs: typing.Optional[typing.List["AppServiceSlotLogsApplicationLogs"]] = None,
        http_logs: typing.Optional[typing.List["AppServiceSlotLogsHttpLogs"]] = None,
    ) -> None:
        """
        :param application_logs: application_logs block.
        :param http_logs: http_logs block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if application_logs is not None:
            self._values["application_logs"] = application_logs
        if http_logs is not None:
            self._values["http_logs"] = http_logs

    @builtins.property
    def application_logs(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotLogsApplicationLogs"]]:
        """application_logs block."""
        result = self._values.get("application_logs")
        return result

    @builtins.property
    def http_logs(self) -> typing.Optional[typing.List["AppServiceSlotLogsHttpLogs"]]:
        """http_logs block."""
        result = self._values.get("http_logs")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotLogs(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotLogsApplicationLogs",
    jsii_struct_bases=[],
    name_mapping={
        "azure_blob_storage": "azureBlobStorage",
        "file_system_level": "fileSystemLevel",
    },
)
class AppServiceSlotLogsApplicationLogs:
    def __init__(
        self,
        *,
        azure_blob_storage: typing.Optional[typing.List["AppServiceSlotLogsApplicationLogsAzureBlobStorage"]] = None,
        file_system_level: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param azure_blob_storage: azure_blob_storage block.
        :param file_system_level: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if azure_blob_storage is not None:
            self._values["azure_blob_storage"] = azure_blob_storage
        if file_system_level is not None:
            self._values["file_system_level"] = file_system_level

    @builtins.property
    def azure_blob_storage(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotLogsApplicationLogsAzureBlobStorage"]]:
        """azure_blob_storage block."""
        result = self._values.get("azure_blob_storage")
        return result

    @builtins.property
    def file_system_level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_system_level")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotLogsApplicationLogs(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotLogsApplicationLogsAzureBlobStorage",
    jsii_struct_bases=[],
    name_mapping={
        "level": "level",
        "retention_in_days": "retentionInDays",
        "sas_url": "sasUrl",
    },
)
class AppServiceSlotLogsApplicationLogsAzureBlobStorage:
    def __init__(
        self,
        *,
        level: builtins.str,
        retention_in_days: jsii.Number,
        sas_url: builtins.str,
    ) -> None:
        """
        :param level: -
        :param retention_in_days: -
        :param sas_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "level": level,
            "retention_in_days": retention_in_days,
            "sas_url": sas_url,
        }

    @builtins.property
    def level(self) -> builtins.str:
        result = self._values.get("level")
        assert result is not None, "Required property 'level' is missing"
        return result

    @builtins.property
    def retention_in_days(self) -> jsii.Number:
        result = self._values.get("retention_in_days")
        assert result is not None, "Required property 'retention_in_days' is missing"
        return result

    @builtins.property
    def sas_url(self) -> builtins.str:
        result = self._values.get("sas_url")
        assert result is not None, "Required property 'sas_url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotLogsApplicationLogsAzureBlobStorage(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotLogsHttpLogs",
    jsii_struct_bases=[],
    name_mapping={
        "azure_blob_storage": "azureBlobStorage",
        "file_system": "fileSystem",
    },
)
class AppServiceSlotLogsHttpLogs:
    def __init__(
        self,
        *,
        azure_blob_storage: typing.Optional[typing.List["AppServiceSlotLogsHttpLogsAzureBlobStorage"]] = None,
        file_system: typing.Optional[typing.List["AppServiceSlotLogsHttpLogsFileSystem"]] = None,
    ) -> None:
        """
        :param azure_blob_storage: azure_blob_storage block.
        :param file_system: file_system block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if azure_blob_storage is not None:
            self._values["azure_blob_storage"] = azure_blob_storage
        if file_system is not None:
            self._values["file_system"] = file_system

    @builtins.property
    def azure_blob_storage(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotLogsHttpLogsAzureBlobStorage"]]:
        """azure_blob_storage block."""
        result = self._values.get("azure_blob_storage")
        return result

    @builtins.property
    def file_system(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotLogsHttpLogsFileSystem"]]:
        """file_system block."""
        result = self._values.get("file_system")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotLogsHttpLogs(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotLogsHttpLogsAzureBlobStorage",
    jsii_struct_bases=[],
    name_mapping={"retention_in_days": "retentionInDays", "sas_url": "sasUrl"},
)
class AppServiceSlotLogsHttpLogsAzureBlobStorage:
    def __init__(
        self,
        *,
        retention_in_days: jsii.Number,
        sas_url: builtins.str,
    ) -> None:
        """
        :param retention_in_days: -
        :param sas_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "retention_in_days": retention_in_days,
            "sas_url": sas_url,
        }

    @builtins.property
    def retention_in_days(self) -> jsii.Number:
        result = self._values.get("retention_in_days")
        assert result is not None, "Required property 'retention_in_days' is missing"
        return result

    @builtins.property
    def sas_url(self) -> builtins.str:
        result = self._values.get("sas_url")
        assert result is not None, "Required property 'sas_url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotLogsHttpLogsAzureBlobStorage(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotLogsHttpLogsFileSystem",
    jsii_struct_bases=[],
    name_mapping={
        "retention_in_days": "retentionInDays",
        "retention_in_mb": "retentionInMb",
    },
)
class AppServiceSlotLogsHttpLogsFileSystem:
    def __init__(
        self,
        *,
        retention_in_days: jsii.Number,
        retention_in_mb: jsii.Number,
    ) -> None:
        """
        :param retention_in_days: -
        :param retention_in_mb: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "retention_in_days": retention_in_days,
            "retention_in_mb": retention_in_mb,
        }

    @builtins.property
    def retention_in_days(self) -> jsii.Number:
        result = self._values.get("retention_in_days")
        assert result is not None, "Required property 'retention_in_days' is missing"
        return result

    @builtins.property
    def retention_in_mb(self) -> jsii.Number:
        result = self._values.get("retention_in_mb")
        assert result is not None, "Required property 'retention_in_mb' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotLogsHttpLogsFileSystem(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotSiteConfig",
    jsii_struct_bases=[],
    name_mapping={
        "always_on": "alwaysOn",
        "app_command_line": "appCommandLine",
        "auto_swap_slot_name": "autoSwapSlotName",
        "cors": "cors",
        "default_documents": "defaultDocuments",
        "dotnet_framework_version": "dotnetFrameworkVersion",
        "ftps_state": "ftpsState",
        "health_check_path": "healthCheckPath",
        "http2_enabled": "http2Enabled",
        "ip_restriction": "ipRestriction",
        "java_container": "javaContainer",
        "java_container_version": "javaContainerVersion",
        "java_version": "javaVersion",
        "linux_fx_version": "linuxFxVersion",
        "local_mysql_enabled": "localMysqlEnabled",
        "managed_pipeline_mode": "managedPipelineMode",
        "min_tls_version": "minTlsVersion",
        "php_version": "phpVersion",
        "python_version": "pythonVersion",
        "remote_debugging_enabled": "remoteDebuggingEnabled",
        "remote_debugging_version": "remoteDebuggingVersion",
        "scm_ip_restriction": "scmIpRestriction",
        "scm_type": "scmType",
        "scm_use_main_ip_restriction": "scmUseMainIpRestriction",
        "use32_bit_worker_process": "use32BitWorkerProcess",
        "websockets_enabled": "websocketsEnabled",
        "windows_fx_version": "windowsFxVersion",
    },
)
class AppServiceSlotSiteConfig:
    def __init__(
        self,
        *,
        always_on: typing.Optional[builtins.bool] = None,
        app_command_line: typing.Optional[builtins.str] = None,
        auto_swap_slot_name: typing.Optional[builtins.str] = None,
        cors: typing.Optional[typing.List["AppServiceSlotSiteConfigCors"]] = None,
        default_documents: typing.Optional[typing.List[builtins.str]] = None,
        dotnet_framework_version: typing.Optional[builtins.str] = None,
        ftps_state: typing.Optional[builtins.str] = None,
        health_check_path: typing.Optional[builtins.str] = None,
        http2_enabled: typing.Optional[builtins.bool] = None,
        ip_restriction: typing.Optional[typing.List["AppServiceSlotSiteConfigIpRestriction"]] = None,
        java_container: typing.Optional[builtins.str] = None,
        java_container_version: typing.Optional[builtins.str] = None,
        java_version: typing.Optional[builtins.str] = None,
        linux_fx_version: typing.Optional[builtins.str] = None,
        local_mysql_enabled: typing.Optional[builtins.bool] = None,
        managed_pipeline_mode: typing.Optional[builtins.str] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        php_version: typing.Optional[builtins.str] = None,
        python_version: typing.Optional[builtins.str] = None,
        remote_debugging_enabled: typing.Optional[builtins.bool] = None,
        remote_debugging_version: typing.Optional[builtins.str] = None,
        scm_ip_restriction: typing.Optional[typing.List["AppServiceSlotSiteConfigScmIpRestriction"]] = None,
        scm_type: typing.Optional[builtins.str] = None,
        scm_use_main_ip_restriction: typing.Optional[builtins.bool] = None,
        use32_bit_worker_process: typing.Optional[builtins.bool] = None,
        websockets_enabled: typing.Optional[builtins.bool] = None,
        windows_fx_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param always_on: -
        :param app_command_line: -
        :param auto_swap_slot_name: -
        :param cors: cors block.
        :param default_documents: -
        :param dotnet_framework_version: -
        :param ftps_state: -
        :param health_check_path: -
        :param http2_enabled: -
        :param ip_restriction: -
        :param java_container: -
        :param java_container_version: -
        :param java_version: -
        :param linux_fx_version: -
        :param local_mysql_enabled: -
        :param managed_pipeline_mode: -
        :param min_tls_version: -
        :param php_version: -
        :param python_version: -
        :param remote_debugging_enabled: -
        :param remote_debugging_version: -
        :param scm_ip_restriction: -
        :param scm_type: -
        :param scm_use_main_ip_restriction: -
        :param use32_bit_worker_process: -
        :param websockets_enabled: -
        :param windows_fx_version: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if always_on is not None:
            self._values["always_on"] = always_on
        if app_command_line is not None:
            self._values["app_command_line"] = app_command_line
        if auto_swap_slot_name is not None:
            self._values["auto_swap_slot_name"] = auto_swap_slot_name
        if cors is not None:
            self._values["cors"] = cors
        if default_documents is not None:
            self._values["default_documents"] = default_documents
        if dotnet_framework_version is not None:
            self._values["dotnet_framework_version"] = dotnet_framework_version
        if ftps_state is not None:
            self._values["ftps_state"] = ftps_state
        if health_check_path is not None:
            self._values["health_check_path"] = health_check_path
        if http2_enabled is not None:
            self._values["http2_enabled"] = http2_enabled
        if ip_restriction is not None:
            self._values["ip_restriction"] = ip_restriction
        if java_container is not None:
            self._values["java_container"] = java_container
        if java_container_version is not None:
            self._values["java_container_version"] = java_container_version
        if java_version is not None:
            self._values["java_version"] = java_version
        if linux_fx_version is not None:
            self._values["linux_fx_version"] = linux_fx_version
        if local_mysql_enabled is not None:
            self._values["local_mysql_enabled"] = local_mysql_enabled
        if managed_pipeline_mode is not None:
            self._values["managed_pipeline_mode"] = managed_pipeline_mode
        if min_tls_version is not None:
            self._values["min_tls_version"] = min_tls_version
        if php_version is not None:
            self._values["php_version"] = php_version
        if python_version is not None:
            self._values["python_version"] = python_version
        if remote_debugging_enabled is not None:
            self._values["remote_debugging_enabled"] = remote_debugging_enabled
        if remote_debugging_version is not None:
            self._values["remote_debugging_version"] = remote_debugging_version
        if scm_ip_restriction is not None:
            self._values["scm_ip_restriction"] = scm_ip_restriction
        if scm_type is not None:
            self._values["scm_type"] = scm_type
        if scm_use_main_ip_restriction is not None:
            self._values["scm_use_main_ip_restriction"] = scm_use_main_ip_restriction
        if use32_bit_worker_process is not None:
            self._values["use32_bit_worker_process"] = use32_bit_worker_process
        if websockets_enabled is not None:
            self._values["websockets_enabled"] = websockets_enabled
        if windows_fx_version is not None:
            self._values["windows_fx_version"] = windows_fx_version

    @builtins.property
    def always_on(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("always_on")
        return result

    @builtins.property
    def app_command_line(self) -> typing.Optional[builtins.str]:
        result = self._values.get("app_command_line")
        return result

    @builtins.property
    def auto_swap_slot_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_swap_slot_name")
        return result

    @builtins.property
    def cors(self) -> typing.Optional[typing.List["AppServiceSlotSiteConfigCors"]]:
        """cors block."""
        result = self._values.get("cors")
        return result

    @builtins.property
    def default_documents(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("default_documents")
        return result

    @builtins.property
    def dotnet_framework_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dotnet_framework_version")
        return result

    @builtins.property
    def ftps_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ftps_state")
        return result

    @builtins.property
    def health_check_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("health_check_path")
        return result

    @builtins.property
    def http2_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("http2_enabled")
        return result

    @builtins.property
    def ip_restriction(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotSiteConfigIpRestriction"]]:
        result = self._values.get("ip_restriction")
        return result

    @builtins.property
    def java_container(self) -> typing.Optional[builtins.str]:
        result = self._values.get("java_container")
        return result

    @builtins.property
    def java_container_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("java_container_version")
        return result

    @builtins.property
    def java_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("java_version")
        return result

    @builtins.property
    def linux_fx_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("linux_fx_version")
        return result

    @builtins.property
    def local_mysql_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("local_mysql_enabled")
        return result

    @builtins.property
    def managed_pipeline_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_pipeline_mode")
        return result

    @builtins.property
    def min_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_tls_version")
        return result

    @builtins.property
    def php_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("php_version")
        return result

    @builtins.property
    def python_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("python_version")
        return result

    @builtins.property
    def remote_debugging_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("remote_debugging_enabled")
        return result

    @builtins.property
    def remote_debugging_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("remote_debugging_version")
        return result

    @builtins.property
    def scm_ip_restriction(
        self,
    ) -> typing.Optional[typing.List["AppServiceSlotSiteConfigScmIpRestriction"]]:
        result = self._values.get("scm_ip_restriction")
        return result

    @builtins.property
    def scm_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scm_type")
        return result

    @builtins.property
    def scm_use_main_ip_restriction(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("scm_use_main_ip_restriction")
        return result

    @builtins.property
    def use32_bit_worker_process(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use32_bit_worker_process")
        return result

    @builtins.property
    def websockets_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("websockets_enabled")
        return result

    @builtins.property
    def windows_fx_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("windows_fx_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotSiteConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotSiteConfigCors",
    jsii_struct_bases=[],
    name_mapping={
        "allowed_origins": "allowedOrigins",
        "support_credentials": "supportCredentials",
    },
)
class AppServiceSlotSiteConfigCors:
    def __init__(
        self,
        *,
        allowed_origins: typing.List[builtins.str],
        support_credentials: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param allowed_origins: -
        :param support_credentials: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_origins": allowed_origins,
        }
        if support_credentials is not None:
            self._values["support_credentials"] = support_credentials

    @builtins.property
    def allowed_origins(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_origins")
        assert result is not None, "Required property 'allowed_origins' is missing"
        return result

    @builtins.property
    def support_credentials(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("support_credentials")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotSiteConfigCors(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotSiteConfigIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class AppServiceSlotSiteConfigIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotSiteConfigIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotSiteConfigScmIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class AppServiceSlotSiteConfigScmIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotSiteConfigScmIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceSlotSiteCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceSlotSiteCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(AppServiceSlotSiteCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceSlotTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceSlotVirtualNetworkSwiftConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceSlotVirtualNetworkSwiftConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_id: builtins.str,
        slot_name: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["AppServiceSlotVirtualNetworkSwiftConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_id: -
        :param slot_name: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceSlotVirtualNetworkSwiftConnectionConfig(
            app_service_id=app_service_id,
            slot_name=slot_name,
            subnet_id=subnet_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceSlotVirtualNetworkSwiftConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceIdInput")
    def app_service_id_input(self) -> builtins.str:
        return jsii.get(self, "appServiceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="slotNameInput")
    def slot_name_input(self) -> builtins.str:
        return jsii.get(self, "slotNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["AppServiceSlotVirtualNetworkSwiftConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceId")
    def app_service_id(self) -> builtins.str:
        return jsii.get(self, "appServiceId")

    @app_service_id.setter # type: ignore
    def app_service_id(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="slotName")
    def slot_name(self) -> builtins.str:
        return jsii.get(self, "slotName")

    @slot_name.setter # type: ignore
    def slot_name(self, value: builtins.str) -> None:
        jsii.set(self, "slotName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceSlotVirtualNetworkSwiftConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "AppServiceSlotVirtualNetworkSwiftConnectionTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotVirtualNetworkSwiftConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_id": "appServiceId",
        "slot_name": "slotName",
        "subnet_id": "subnetId",
        "timeouts": "timeouts",
    },
)
class AppServiceSlotVirtualNetworkSwiftConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_id: builtins.str,
        slot_name: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["AppServiceSlotVirtualNetworkSwiftConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_id: -
        :param slot_name: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceSlotVirtualNetworkSwiftConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_id": app_service_id,
            "slot_name": slot_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_id(self) -> builtins.str:
        result = self._values.get("app_service_id")
        assert result is not None, "Required property 'app_service_id' is missing"
        return result

    @builtins.property
    def slot_name(self) -> builtins.str:
        result = self._values.get("slot_name")
        assert result is not None, "Required property 'slot_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["AppServiceSlotVirtualNetworkSwiftConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotVirtualNetworkSwiftConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSlotVirtualNetworkSwiftConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceSlotVirtualNetworkSwiftConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSlotVirtualNetworkSwiftConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSourceControl",
    jsii_struct_bases=[],
    name_mapping={
        "branch": "branch",
        "manual_integration": "manualIntegration",
        "repo_url": "repoUrl",
        "rollback_enabled": "rollbackEnabled",
        "use_mercurial": "useMercurial",
    },
)
class AppServiceSourceControl:
    def __init__(
        self,
        *,
        branch: typing.Optional[builtins.str] = None,
        manual_integration: typing.Optional[builtins.bool] = None,
        repo_url: typing.Optional[builtins.str] = None,
        rollback_enabled: typing.Optional[builtins.bool] = None,
        use_mercurial: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param branch: -
        :param manual_integration: -
        :param repo_url: -
        :param rollback_enabled: -
        :param use_mercurial: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if branch is not None:
            self._values["branch"] = branch
        if manual_integration is not None:
            self._values["manual_integration"] = manual_integration
        if repo_url is not None:
            self._values["repo_url"] = repo_url
        if rollback_enabled is not None:
            self._values["rollback_enabled"] = rollback_enabled
        if use_mercurial is not None:
            self._values["use_mercurial"] = use_mercurial

    @builtins.property
    def branch(self) -> typing.Optional[builtins.str]:
        result = self._values.get("branch")
        return result

    @builtins.property
    def manual_integration(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manual_integration")
        return result

    @builtins.property
    def repo_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("repo_url")
        return result

    @builtins.property
    def rollback_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("rollback_enabled")
        return result

    @builtins.property
    def use_mercurial(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_mercurial")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSourceControl(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceSourceControlToken(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceSourceControlToken",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        token: builtins.str,
        type: builtins.str,
        timeouts: typing.Optional["AppServiceSourceControlTokenTimeouts"] = None,
        token_secret: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param token: -
        :param type: -
        :param timeouts: timeouts block.
        :param token_secret: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceSourceControlTokenConfig(
            token=token,
            type=type,
            timeouts=timeouts,
            token_secret=token_secret,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceSourceControlToken, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTokenSecret")
    def reset_token_secret(self) -> None:
        return jsii.invoke(self, "resetTokenSecret", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tokenInput")
    def token_input(self) -> builtins.str:
        return jsii.get(self, "tokenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AppServiceSourceControlTokenTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tokenSecretInput")
    def token_secret_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tokenSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceSourceControlTokenTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AppServiceSourceControlTokenTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="token")
    def token(self) -> builtins.str:
        return jsii.get(self, "token")

    @token.setter # type: ignore
    def token(self, value: builtins.str) -> None:
        jsii.set(self, "token", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tokenSecret")
    def token_secret(self) -> builtins.str:
        return jsii.get(self, "tokenSecret")

    @token_secret.setter # type: ignore
    def token_secret(self, value: builtins.str) -> None:
        jsii.set(self, "tokenSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceSourceControlTokenConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "token": "token",
        "type": "type",
        "timeouts": "timeouts",
        "token_secret": "tokenSecret",
    },
)
class AppServiceSourceControlTokenConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        token: builtins.str,
        type: builtins.str,
        timeouts: typing.Optional["AppServiceSourceControlTokenTimeouts"] = None,
        token_secret: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param token: -
        :param type: -
        :param timeouts: timeouts block.
        :param token_secret: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceSourceControlTokenTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "token": token,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if token_secret is not None:
            self._values["token_secret"] = token_secret

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def token(self) -> builtins.str:
        result = self._values.get("token")
        assert result is not None, "Required property 'token' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AppServiceSourceControlTokenTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def token_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("token_secret")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSourceControlTokenConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceSourceControlTokenTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceSourceControlTokenTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceSourceControlTokenTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "access_key": "accessKey",
        "account_name": "accountName",
        "name": "name",
        "share_name": "shareName",
        "type": "type",
        "mount_path": "mountPath",
    },
)
class AppServiceStorageAccount:
    def __init__(
        self,
        *,
        access_key: builtins.str,
        account_name: builtins.str,
        name: builtins.str,
        share_name: builtins.str,
        type: builtins.str,
        mount_path: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param access_key: -
        :param account_name: -
        :param name: -
        :param share_name: -
        :param type: -
        :param mount_path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "access_key": access_key,
            "account_name": account_name,
            "name": name,
            "share_name": share_name,
            "type": type,
        }
        if mount_path is not None:
            self._values["mount_path"] = mount_path

    @builtins.property
    def access_key(self) -> builtins.str:
        result = self._values.get("access_key")
        assert result is not None, "Required property 'access_key' is missing"
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_name(self) -> builtins.str:
        result = self._values.get("share_name")
        assert result is not None, "Required property 'share_name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def mount_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("mount_path")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AppServiceVirtualNetworkSwiftConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AppServiceVirtualNetworkSwiftConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["AppServiceVirtualNetworkSwiftConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppServiceVirtualNetworkSwiftConnectionConfig(
            app_service_id=app_service_id,
            subnet_id=subnet_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AppServiceVirtualNetworkSwiftConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceIdInput")
    def app_service_id_input(self) -> builtins.str:
        return jsii.get(self, "appServiceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["AppServiceVirtualNetworkSwiftConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceId")
    def app_service_id(self) -> builtins.str:
        return jsii.get(self, "appServiceId")

    @app_service_id.setter # type: ignore
    def app_service_id(self, value: builtins.str) -> None:
        jsii.set(self, "appServiceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AppServiceVirtualNetworkSwiftConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "AppServiceVirtualNetworkSwiftConnectionTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AppServiceVirtualNetworkSwiftConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_id": "appServiceId",
        "subnet_id": "subnetId",
        "timeouts": "timeouts",
    },
)
class AppServiceVirtualNetworkSwiftConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["AppServiceVirtualNetworkSwiftConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AppServiceVirtualNetworkSwiftConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_id": app_service_id,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_id(self) -> builtins.str:
        result = self._values.get("app_service_id")
        assert result is not None, "Required property 'app_service_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["AppServiceVirtualNetworkSwiftConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceVirtualNetworkSwiftConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AppServiceVirtualNetworkSwiftConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AppServiceVirtualNetworkSwiftConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AppServiceVirtualNetworkSwiftConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApplicationGateway(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApplicationGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_address_pool: typing.List["ApplicationGatewayBackendAddressPool"],
        backend_http_settings: typing.List["ApplicationGatewayBackendHttpSettings"],
        frontend_ip_configuration: typing.List["ApplicationGatewayFrontendIpConfiguration"],
        frontend_port: typing.List["ApplicationGatewayFrontendPort"],
        gateway_ip_configuration: typing.List["ApplicationGatewayGatewayIpConfiguration"],
        http_listener: typing.List["ApplicationGatewayHttpListener"],
        location: builtins.str,
        name: builtins.str,
        request_routing_rule: typing.List["ApplicationGatewayRequestRoutingRule"],
        resource_group_name: builtins.str,
        sku: typing.List["ApplicationGatewaySku"],
        authentication_certificate: typing.Optional[typing.List["ApplicationGatewayAuthenticationCertificate"]] = None,
        autoscale_configuration: typing.Optional[typing.List["ApplicationGatewayAutoscaleConfiguration"]] = None,
        custom_error_configuration: typing.Optional[typing.List["ApplicationGatewayCustomErrorConfiguration"]] = None,
        enable_http2: typing.Optional[builtins.bool] = None,
        firewall_policy_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["ApplicationGatewayIdentity"]] = None,
        probe: typing.Optional[typing.List["ApplicationGatewayProbe"]] = None,
        redirect_configuration: typing.Optional[typing.List["ApplicationGatewayRedirectConfiguration"]] = None,
        rewrite_rule_set: typing.Optional[typing.List["ApplicationGatewayRewriteRuleSet"]] = None,
        ssl_certificate: typing.Optional[typing.List["ApplicationGatewaySslCertificate"]] = None,
        ssl_policy: typing.Optional[typing.List["ApplicationGatewaySslPolicy"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApplicationGatewayTimeouts"] = None,
        trusted_root_certificate: typing.Optional[typing.List["ApplicationGatewayTrustedRootCertificate"]] = None,
        url_path_map: typing.Optional[typing.List["ApplicationGatewayUrlPathMap"]] = None,
        waf_configuration: typing.Optional[typing.List["ApplicationGatewayWafConfiguration"]] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_address_pool: backend_address_pool block.
        :param backend_http_settings: backend_http_settings block.
        :param frontend_ip_configuration: frontend_ip_configuration block.
        :param frontend_port: frontend_port block.
        :param gateway_ip_configuration: gateway_ip_configuration block.
        :param http_listener: http_listener block.
        :param location: -
        :param name: -
        :param request_routing_rule: request_routing_rule block.
        :param resource_group_name: -
        :param sku: sku block.
        :param authentication_certificate: authentication_certificate block.
        :param autoscale_configuration: autoscale_configuration block.
        :param custom_error_configuration: custom_error_configuration block.
        :param enable_http2: -
        :param firewall_policy_id: -
        :param identity: identity block.
        :param probe: probe block.
        :param redirect_configuration: redirect_configuration block.
        :param rewrite_rule_set: rewrite_rule_set block.
        :param ssl_certificate: ssl_certificate block.
        :param ssl_policy: ssl_policy block.
        :param tags: -
        :param timeouts: timeouts block.
        :param trusted_root_certificate: trusted_root_certificate block.
        :param url_path_map: url_path_map block.
        :param waf_configuration: waf_configuration block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApplicationGatewayConfig(
            backend_address_pool=backend_address_pool,
            backend_http_settings=backend_http_settings,
            frontend_ip_configuration=frontend_ip_configuration,
            frontend_port=frontend_port,
            gateway_ip_configuration=gateway_ip_configuration,
            http_listener=http_listener,
            location=location,
            name=name,
            request_routing_rule=request_routing_rule,
            resource_group_name=resource_group_name,
            sku=sku,
            authentication_certificate=authentication_certificate,
            autoscale_configuration=autoscale_configuration,
            custom_error_configuration=custom_error_configuration,
            enable_http2=enable_http2,
            firewall_policy_id=firewall_policy_id,
            identity=identity,
            probe=probe,
            redirect_configuration=redirect_configuration,
            rewrite_rule_set=rewrite_rule_set,
            ssl_certificate=ssl_certificate,
            ssl_policy=ssl_policy,
            tags=tags,
            timeouts=timeouts,
            trusted_root_certificate=trusted_root_certificate,
            url_path_map=url_path_map,
            waf_configuration=waf_configuration,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApplicationGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetAuthenticationCertificate")
    def reset_authentication_certificate(self) -> None:
        return jsii.invoke(self, "resetAuthenticationCertificate", [])

    @jsii.member(jsii_name="resetAutoscaleConfiguration")
    def reset_autoscale_configuration(self) -> None:
        return jsii.invoke(self, "resetAutoscaleConfiguration", [])

    @jsii.member(jsii_name="resetCustomErrorConfiguration")
    def reset_custom_error_configuration(self) -> None:
        return jsii.invoke(self, "resetCustomErrorConfiguration", [])

    @jsii.member(jsii_name="resetEnableHttp2")
    def reset_enable_http2(self) -> None:
        return jsii.invoke(self, "resetEnableHttp2", [])

    @jsii.member(jsii_name="resetFirewallPolicyId")
    def reset_firewall_policy_id(self) -> None:
        return jsii.invoke(self, "resetFirewallPolicyId", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetProbe")
    def reset_probe(self) -> None:
        return jsii.invoke(self, "resetProbe", [])

    @jsii.member(jsii_name="resetRedirectConfiguration")
    def reset_redirect_configuration(self) -> None:
        return jsii.invoke(self, "resetRedirectConfiguration", [])

    @jsii.member(jsii_name="resetRewriteRuleSet")
    def reset_rewrite_rule_set(self) -> None:
        return jsii.invoke(self, "resetRewriteRuleSet", [])

    @jsii.member(jsii_name="resetSslCertificate")
    def reset_ssl_certificate(self) -> None:
        return jsii.invoke(self, "resetSslCertificate", [])

    @jsii.member(jsii_name="resetSslPolicy")
    def reset_ssl_policy(self) -> None:
        return jsii.invoke(self, "resetSslPolicy", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTrustedRootCertificate")
    def reset_trusted_root_certificate(self) -> None:
        return jsii.invoke(self, "resetTrustedRootCertificate", [])

    @jsii.member(jsii_name="resetUrlPathMap")
    def reset_url_path_map(self) -> None:
        return jsii.invoke(self, "resetUrlPathMap", [])

    @jsii.member(jsii_name="resetWafConfiguration")
    def reset_waf_configuration(self) -> None:
        return jsii.invoke(self, "resetWafConfiguration", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolInput")
    def backend_address_pool_input(
        self,
    ) -> typing.List["ApplicationGatewayBackendAddressPool"]:
        return jsii.get(self, "backendAddressPoolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendHttpSettingsInput")
    def backend_http_settings_input(
        self,
    ) -> typing.List["ApplicationGatewayBackendHttpSettings"]:
        return jsii.get(self, "backendHttpSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationInput")
    def frontend_ip_configuration_input(
        self,
    ) -> typing.List["ApplicationGatewayFrontendIpConfiguration"]:
        return jsii.get(self, "frontendIpConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPortInput")
    def frontend_port_input(self) -> typing.List["ApplicationGatewayFrontendPort"]:
        return jsii.get(self, "frontendPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayIpConfigurationInput")
    def gateway_ip_configuration_input(
        self,
    ) -> typing.List["ApplicationGatewayGatewayIpConfiguration"]:
        return jsii.get(self, "gatewayIpConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpListenerInput")
    def http_listener_input(self) -> typing.List["ApplicationGatewayHttpListener"]:
        return jsii.get(self, "httpListenerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestRoutingRuleInput")
    def request_routing_rule_input(
        self,
    ) -> typing.List["ApplicationGatewayRequestRoutingRule"]:
        return jsii.get(self, "requestRoutingRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["ApplicationGatewaySku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationCertificateInput")
    def authentication_certificate_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayAuthenticationCertificate"]]:
        return jsii.get(self, "authenticationCertificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleConfigurationInput")
    def autoscale_configuration_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayAutoscaleConfiguration"]]:
        return jsii.get(self, "autoscaleConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customErrorConfigurationInput")
    def custom_error_configuration_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayCustomErrorConfiguration"]]:
        return jsii.get(self, "customErrorConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableHttp2Input")
    def enable_http2_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableHttp2Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallPolicyIdInput")
    def firewall_policy_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "firewallPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="probeInput")
    def probe_input(self) -> typing.Optional[typing.List["ApplicationGatewayProbe"]]:
        return jsii.get(self, "probeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redirectConfigurationInput")
    def redirect_configuration_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRedirectConfiguration"]]:
        return jsii.get(self, "redirectConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rewriteRuleSetInput")
    def rewrite_rule_set_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRewriteRuleSet"]]:
        return jsii.get(self, "rewriteRuleSetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslCertificateInput")
    def ssl_certificate_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewaySslCertificate"]]:
        return jsii.get(self, "sslCertificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslPolicyInput")
    def ssl_policy_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewaySslPolicy"]]:
        return jsii.get(self, "sslPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApplicationGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustedRootCertificateInput")
    def trusted_root_certificate_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayTrustedRootCertificate"]]:
        return jsii.get(self, "trustedRootCertificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlPathMapInput")
    def url_path_map_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayUrlPathMap"]]:
        return jsii.get(self, "urlPathMapInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="wafConfigurationInput")
    def waf_configuration_input(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayWafConfiguration"]]:
        return jsii.get(self, "wafConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationCertificate")
    def authentication_certificate(
        self,
    ) -> typing.List["ApplicationGatewayAuthenticationCertificate"]:
        return jsii.get(self, "authenticationCertificate")

    @authentication_certificate.setter # type: ignore
    def authentication_certificate(
        self,
        value: typing.List["ApplicationGatewayAuthenticationCertificate"],
    ) -> None:
        jsii.set(self, "authenticationCertificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleConfiguration")
    def autoscale_configuration(
        self,
    ) -> typing.List["ApplicationGatewayAutoscaleConfiguration"]:
        return jsii.get(self, "autoscaleConfiguration")

    @autoscale_configuration.setter # type: ignore
    def autoscale_configuration(
        self,
        value: typing.List["ApplicationGatewayAutoscaleConfiguration"],
    ) -> None:
        jsii.set(self, "autoscaleConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPool")
    def backend_address_pool(
        self,
    ) -> typing.List["ApplicationGatewayBackendAddressPool"]:
        return jsii.get(self, "backendAddressPool")

    @backend_address_pool.setter # type: ignore
    def backend_address_pool(
        self,
        value: typing.List["ApplicationGatewayBackendAddressPool"],
    ) -> None:
        jsii.set(self, "backendAddressPool", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendHttpSettings")
    def backend_http_settings(
        self,
    ) -> typing.List["ApplicationGatewayBackendHttpSettings"]:
        return jsii.get(self, "backendHttpSettings")

    @backend_http_settings.setter # type: ignore
    def backend_http_settings(
        self,
        value: typing.List["ApplicationGatewayBackendHttpSettings"],
    ) -> None:
        jsii.set(self, "backendHttpSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customErrorConfiguration")
    def custom_error_configuration(
        self,
    ) -> typing.List["ApplicationGatewayCustomErrorConfiguration"]:
        return jsii.get(self, "customErrorConfiguration")

    @custom_error_configuration.setter # type: ignore
    def custom_error_configuration(
        self,
        value: typing.List["ApplicationGatewayCustomErrorConfiguration"],
    ) -> None:
        jsii.set(self, "customErrorConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableHttp2")
    def enable_http2(self) -> builtins.bool:
        return jsii.get(self, "enableHttp2")

    @enable_http2.setter # type: ignore
    def enable_http2(self, value: builtins.bool) -> None:
        jsii.set(self, "enableHttp2", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallPolicyId")
    def firewall_policy_id(self) -> builtins.str:
        return jsii.get(self, "firewallPolicyId")

    @firewall_policy_id.setter # type: ignore
    def firewall_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "firewallPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfiguration")
    def frontend_ip_configuration(
        self,
    ) -> typing.List["ApplicationGatewayFrontendIpConfiguration"]:
        return jsii.get(self, "frontendIpConfiguration")

    @frontend_ip_configuration.setter # type: ignore
    def frontend_ip_configuration(
        self,
        value: typing.List["ApplicationGatewayFrontendIpConfiguration"],
    ) -> None:
        jsii.set(self, "frontendIpConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPort")
    def frontend_port(self) -> typing.List["ApplicationGatewayFrontendPort"]:
        return jsii.get(self, "frontendPort")

    @frontend_port.setter # type: ignore
    def frontend_port(
        self,
        value: typing.List["ApplicationGatewayFrontendPort"],
    ) -> None:
        jsii.set(self, "frontendPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayIpConfiguration")
    def gateway_ip_configuration(
        self,
    ) -> typing.List["ApplicationGatewayGatewayIpConfiguration"]:
        return jsii.get(self, "gatewayIpConfiguration")

    @gateway_ip_configuration.setter # type: ignore
    def gateway_ip_configuration(
        self,
        value: typing.List["ApplicationGatewayGatewayIpConfiguration"],
    ) -> None:
        jsii.set(self, "gatewayIpConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpListener")
    def http_listener(self) -> typing.List["ApplicationGatewayHttpListener"]:
        return jsii.get(self, "httpListener")

    @http_listener.setter # type: ignore
    def http_listener(
        self,
        value: typing.List["ApplicationGatewayHttpListener"],
    ) -> None:
        jsii.set(self, "httpListener", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["ApplicationGatewayIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["ApplicationGatewayIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="probe")
    def probe(self) -> typing.List["ApplicationGatewayProbe"]:
        return jsii.get(self, "probe")

    @probe.setter # type: ignore
    def probe(self, value: typing.List["ApplicationGatewayProbe"]) -> None:
        jsii.set(self, "probe", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redirectConfiguration")
    def redirect_configuration(
        self,
    ) -> typing.List["ApplicationGatewayRedirectConfiguration"]:
        return jsii.get(self, "redirectConfiguration")

    @redirect_configuration.setter # type: ignore
    def redirect_configuration(
        self,
        value: typing.List["ApplicationGatewayRedirectConfiguration"],
    ) -> None:
        jsii.set(self, "redirectConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestRoutingRule")
    def request_routing_rule(
        self,
    ) -> typing.List["ApplicationGatewayRequestRoutingRule"]:
        return jsii.get(self, "requestRoutingRule")

    @request_routing_rule.setter # type: ignore
    def request_routing_rule(
        self,
        value: typing.List["ApplicationGatewayRequestRoutingRule"],
    ) -> None:
        jsii.set(self, "requestRoutingRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rewriteRuleSet")
    def rewrite_rule_set(self) -> typing.List["ApplicationGatewayRewriteRuleSet"]:
        return jsii.get(self, "rewriteRuleSet")

    @rewrite_rule_set.setter # type: ignore
    def rewrite_rule_set(
        self,
        value: typing.List["ApplicationGatewayRewriteRuleSet"],
    ) -> None:
        jsii.set(self, "rewriteRuleSet", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["ApplicationGatewaySku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["ApplicationGatewaySku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslCertificate")
    def ssl_certificate(self) -> typing.List["ApplicationGatewaySslCertificate"]:
        return jsii.get(self, "sslCertificate")

    @ssl_certificate.setter # type: ignore
    def ssl_certificate(
        self,
        value: typing.List["ApplicationGatewaySslCertificate"],
    ) -> None:
        jsii.set(self, "sslCertificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslPolicy")
    def ssl_policy(self) -> typing.List["ApplicationGatewaySslPolicy"]:
        return jsii.get(self, "sslPolicy")

    @ssl_policy.setter # type: ignore
    def ssl_policy(self, value: typing.List["ApplicationGatewaySslPolicy"]) -> None:
        jsii.set(self, "sslPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApplicationGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApplicationGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustedRootCertificate")
    def trusted_root_certificate(
        self,
    ) -> typing.List["ApplicationGatewayTrustedRootCertificate"]:
        return jsii.get(self, "trustedRootCertificate")

    @trusted_root_certificate.setter # type: ignore
    def trusted_root_certificate(
        self,
        value: typing.List["ApplicationGatewayTrustedRootCertificate"],
    ) -> None:
        jsii.set(self, "trustedRootCertificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlPathMap")
    def url_path_map(self) -> typing.List["ApplicationGatewayUrlPathMap"]:
        return jsii.get(self, "urlPathMap")

    @url_path_map.setter # type: ignore
    def url_path_map(self, value: typing.List["ApplicationGatewayUrlPathMap"]) -> None:
        jsii.set(self, "urlPathMap", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="wafConfiguration")
    def waf_configuration(self) -> typing.List["ApplicationGatewayWafConfiguration"]:
        return jsii.get(self, "wafConfiguration")

    @waf_configuration.setter # type: ignore
    def waf_configuration(
        self,
        value: typing.List["ApplicationGatewayWafConfiguration"],
    ) -> None:
        jsii.set(self, "wafConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayAuthenticationCertificate",
    jsii_struct_bases=[],
    name_mapping={"data": "data", "name": "name"},
)
class ApplicationGatewayAuthenticationCertificate:
    def __init__(self, *, data: builtins.str, name: builtins.str) -> None:
        """
        :param data: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "data": data,
            "name": name,
        }

    @builtins.property
    def data(self) -> builtins.str:
        result = self._values.get("data")
        assert result is not None, "Required property 'data' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayAuthenticationCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayAutoscaleConfiguration",
    jsii_struct_bases=[],
    name_mapping={"min_capacity": "minCapacity", "max_capacity": "maxCapacity"},
)
class ApplicationGatewayAutoscaleConfiguration:
    def __init__(
        self,
        *,
        min_capacity: jsii.Number,
        max_capacity: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param min_capacity: -
        :param max_capacity: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "min_capacity": min_capacity,
        }
        if max_capacity is not None:
            self._values["max_capacity"] = max_capacity

    @builtins.property
    def min_capacity(self) -> jsii.Number:
        result = self._values.get("min_capacity")
        assert result is not None, "Required property 'min_capacity' is missing"
        return result

    @builtins.property
    def max_capacity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_capacity")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayAutoscaleConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayBackendAddressPool",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "fqdns": "fqdns", "ip_addresses": "ipAddresses"},
)
class ApplicationGatewayBackendAddressPool:
    def __init__(
        self,
        *,
        name: builtins.str,
        fqdns: typing.Optional[typing.List[builtins.str]] = None,
        ip_addresses: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param fqdns: -
        :param ip_addresses: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if fqdns is not None:
            self._values["fqdns"] = fqdns
        if ip_addresses is not None:
            self._values["ip_addresses"] = ip_addresses

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def fqdns(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("fqdns")
        return result

    @builtins.property
    def ip_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ip_addresses")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayBackendAddressPool(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayBackendHttpSettings",
    jsii_struct_bases=[],
    name_mapping={
        "cookie_based_affinity": "cookieBasedAffinity",
        "name": "name",
        "port": "port",
        "protocol": "protocol",
        "affinity_cookie_name": "affinityCookieName",
        "authentication_certificate": "authenticationCertificate",
        "connection_draining": "connectionDraining",
        "host_name": "hostName",
        "path": "path",
        "pick_host_name_from_backend_address": "pickHostNameFromBackendAddress",
        "probe_name": "probeName",
        "request_timeout": "requestTimeout",
        "trusted_root_certificate_names": "trustedRootCertificateNames",
    },
)
class ApplicationGatewayBackendHttpSettings:
    def __init__(
        self,
        *,
        cookie_based_affinity: builtins.str,
        name: builtins.str,
        port: jsii.Number,
        protocol: builtins.str,
        affinity_cookie_name: typing.Optional[builtins.str] = None,
        authentication_certificate: typing.Optional[typing.List["ApplicationGatewayBackendHttpSettingsAuthenticationCertificate"]] = None,
        connection_draining: typing.Optional[typing.List["ApplicationGatewayBackendHttpSettingsConnectionDraining"]] = None,
        host_name: typing.Optional[builtins.str] = None,
        path: typing.Optional[builtins.str] = None,
        pick_host_name_from_backend_address: typing.Optional[builtins.bool] = None,
        probe_name: typing.Optional[builtins.str] = None,
        request_timeout: typing.Optional[jsii.Number] = None,
        trusted_root_certificate_names: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param cookie_based_affinity: -
        :param name: -
        :param port: -
        :param protocol: -
        :param affinity_cookie_name: -
        :param authentication_certificate: authentication_certificate block.
        :param connection_draining: connection_draining block.
        :param host_name: -
        :param path: -
        :param pick_host_name_from_backend_address: -
        :param probe_name: -
        :param request_timeout: -
        :param trusted_root_certificate_names: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "cookie_based_affinity": cookie_based_affinity,
            "name": name,
            "port": port,
            "protocol": protocol,
        }
        if affinity_cookie_name is not None:
            self._values["affinity_cookie_name"] = affinity_cookie_name
        if authentication_certificate is not None:
            self._values["authentication_certificate"] = authentication_certificate
        if connection_draining is not None:
            self._values["connection_draining"] = connection_draining
        if host_name is not None:
            self._values["host_name"] = host_name
        if path is not None:
            self._values["path"] = path
        if pick_host_name_from_backend_address is not None:
            self._values["pick_host_name_from_backend_address"] = pick_host_name_from_backend_address
        if probe_name is not None:
            self._values["probe_name"] = probe_name
        if request_timeout is not None:
            self._values["request_timeout"] = request_timeout
        if trusted_root_certificate_names is not None:
            self._values["trusted_root_certificate_names"] = trusted_root_certificate_names

    @builtins.property
    def cookie_based_affinity(self) -> builtins.str:
        result = self._values.get("cookie_based_affinity")
        assert result is not None, "Required property 'cookie_based_affinity' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def affinity_cookie_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("affinity_cookie_name")
        return result

    @builtins.property
    def authentication_certificate(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayBackendHttpSettingsAuthenticationCertificate"]]:
        """authentication_certificate block."""
        result = self._values.get("authentication_certificate")
        return result

    @builtins.property
    def connection_draining(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayBackendHttpSettingsConnectionDraining"]]:
        """connection_draining block."""
        result = self._values.get("connection_draining")
        return result

    @builtins.property
    def host_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host_name")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def pick_host_name_from_backend_address(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("pick_host_name_from_backend_address")
        return result

    @builtins.property
    def probe_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("probe_name")
        return result

    @builtins.property
    def request_timeout(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("request_timeout")
        return result

    @builtins.property
    def trusted_root_certificate_names(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("trusted_root_certificate_names")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayBackendHttpSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayBackendHttpSettingsAuthenticationCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name"},
)
class ApplicationGatewayBackendHttpSettingsAuthenticationCertificate:
    def __init__(self, *, name: builtins.str) -> None:
        """
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayBackendHttpSettingsAuthenticationCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayBackendHttpSettingsConnectionDraining",
    jsii_struct_bases=[],
    name_mapping={"drain_timeout_sec": "drainTimeoutSec", "enabled": "enabled"},
)
class ApplicationGatewayBackendHttpSettingsConnectionDraining:
    def __init__(
        self,
        *,
        drain_timeout_sec: jsii.Number,
        enabled: builtins.bool,
    ) -> None:
        """
        :param drain_timeout_sec: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "drain_timeout_sec": drain_timeout_sec,
            "enabled": enabled,
        }

    @builtins.property
    def drain_timeout_sec(self) -> jsii.Number:
        result = self._values.get("drain_timeout_sec")
        assert result is not None, "Required property 'drain_timeout_sec' is missing"
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayBackendHttpSettingsConnectionDraining(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_address_pool": "backendAddressPool",
        "backend_http_settings": "backendHttpSettings",
        "frontend_ip_configuration": "frontendIpConfiguration",
        "frontend_port": "frontendPort",
        "gateway_ip_configuration": "gatewayIpConfiguration",
        "http_listener": "httpListener",
        "location": "location",
        "name": "name",
        "request_routing_rule": "requestRoutingRule",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "authentication_certificate": "authenticationCertificate",
        "autoscale_configuration": "autoscaleConfiguration",
        "custom_error_configuration": "customErrorConfiguration",
        "enable_http2": "enableHttp2",
        "firewall_policy_id": "firewallPolicyId",
        "identity": "identity",
        "probe": "probe",
        "redirect_configuration": "redirectConfiguration",
        "rewrite_rule_set": "rewriteRuleSet",
        "ssl_certificate": "sslCertificate",
        "ssl_policy": "sslPolicy",
        "tags": "tags",
        "timeouts": "timeouts",
        "trusted_root_certificate": "trustedRootCertificate",
        "url_path_map": "urlPathMap",
        "waf_configuration": "wafConfiguration",
        "zones": "zones",
    },
)
class ApplicationGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_address_pool: typing.List[ApplicationGatewayBackendAddressPool],
        backend_http_settings: typing.List[ApplicationGatewayBackendHttpSettings],
        frontend_ip_configuration: typing.List["ApplicationGatewayFrontendIpConfiguration"],
        frontend_port: typing.List["ApplicationGatewayFrontendPort"],
        gateway_ip_configuration: typing.List["ApplicationGatewayGatewayIpConfiguration"],
        http_listener: typing.List["ApplicationGatewayHttpListener"],
        location: builtins.str,
        name: builtins.str,
        request_routing_rule: typing.List["ApplicationGatewayRequestRoutingRule"],
        resource_group_name: builtins.str,
        sku: typing.List["ApplicationGatewaySku"],
        authentication_certificate: typing.Optional[typing.List[ApplicationGatewayAuthenticationCertificate]] = None,
        autoscale_configuration: typing.Optional[typing.List[ApplicationGatewayAutoscaleConfiguration]] = None,
        custom_error_configuration: typing.Optional[typing.List["ApplicationGatewayCustomErrorConfiguration"]] = None,
        enable_http2: typing.Optional[builtins.bool] = None,
        firewall_policy_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["ApplicationGatewayIdentity"]] = None,
        probe: typing.Optional[typing.List["ApplicationGatewayProbe"]] = None,
        redirect_configuration: typing.Optional[typing.List["ApplicationGatewayRedirectConfiguration"]] = None,
        rewrite_rule_set: typing.Optional[typing.List["ApplicationGatewayRewriteRuleSet"]] = None,
        ssl_certificate: typing.Optional[typing.List["ApplicationGatewaySslCertificate"]] = None,
        ssl_policy: typing.Optional[typing.List["ApplicationGatewaySslPolicy"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApplicationGatewayTimeouts"] = None,
        trusted_root_certificate: typing.Optional[typing.List["ApplicationGatewayTrustedRootCertificate"]] = None,
        url_path_map: typing.Optional[typing.List["ApplicationGatewayUrlPathMap"]] = None,
        waf_configuration: typing.Optional[typing.List["ApplicationGatewayWafConfiguration"]] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_address_pool: backend_address_pool block.
        :param backend_http_settings: backend_http_settings block.
        :param frontend_ip_configuration: frontend_ip_configuration block.
        :param frontend_port: frontend_port block.
        :param gateway_ip_configuration: gateway_ip_configuration block.
        :param http_listener: http_listener block.
        :param location: -
        :param name: -
        :param request_routing_rule: request_routing_rule block.
        :param resource_group_name: -
        :param sku: sku block.
        :param authentication_certificate: authentication_certificate block.
        :param autoscale_configuration: autoscale_configuration block.
        :param custom_error_configuration: custom_error_configuration block.
        :param enable_http2: -
        :param firewall_policy_id: -
        :param identity: identity block.
        :param probe: probe block.
        :param redirect_configuration: redirect_configuration block.
        :param rewrite_rule_set: rewrite_rule_set block.
        :param ssl_certificate: ssl_certificate block.
        :param ssl_policy: ssl_policy block.
        :param tags: -
        :param timeouts: timeouts block.
        :param trusted_root_certificate: trusted_root_certificate block.
        :param url_path_map: url_path_map block.
        :param waf_configuration: waf_configuration block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApplicationGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_address_pool": backend_address_pool,
            "backend_http_settings": backend_http_settings,
            "frontend_ip_configuration": frontend_ip_configuration,
            "frontend_port": frontend_port,
            "gateway_ip_configuration": gateway_ip_configuration,
            "http_listener": http_listener,
            "location": location,
            "name": name,
            "request_routing_rule": request_routing_rule,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if authentication_certificate is not None:
            self._values["authentication_certificate"] = authentication_certificate
        if autoscale_configuration is not None:
            self._values["autoscale_configuration"] = autoscale_configuration
        if custom_error_configuration is not None:
            self._values["custom_error_configuration"] = custom_error_configuration
        if enable_http2 is not None:
            self._values["enable_http2"] = enable_http2
        if firewall_policy_id is not None:
            self._values["firewall_policy_id"] = firewall_policy_id
        if identity is not None:
            self._values["identity"] = identity
        if probe is not None:
            self._values["probe"] = probe
        if redirect_configuration is not None:
            self._values["redirect_configuration"] = redirect_configuration
        if rewrite_rule_set is not None:
            self._values["rewrite_rule_set"] = rewrite_rule_set
        if ssl_certificate is not None:
            self._values["ssl_certificate"] = ssl_certificate
        if ssl_policy is not None:
            self._values["ssl_policy"] = ssl_policy
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if trusted_root_certificate is not None:
            self._values["trusted_root_certificate"] = trusted_root_certificate
        if url_path_map is not None:
            self._values["url_path_map"] = url_path_map
        if waf_configuration is not None:
            self._values["waf_configuration"] = waf_configuration
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_address_pool(self) -> typing.List[ApplicationGatewayBackendAddressPool]:
        """backend_address_pool block."""
        result = self._values.get("backend_address_pool")
        assert result is not None, "Required property 'backend_address_pool' is missing"
        return result

    @builtins.property
    def backend_http_settings(
        self,
    ) -> typing.List[ApplicationGatewayBackendHttpSettings]:
        """backend_http_settings block."""
        result = self._values.get("backend_http_settings")
        assert result is not None, "Required property 'backend_http_settings' is missing"
        return result

    @builtins.property
    def frontend_ip_configuration(
        self,
    ) -> typing.List["ApplicationGatewayFrontendIpConfiguration"]:
        """frontend_ip_configuration block."""
        result = self._values.get("frontend_ip_configuration")
        assert result is not None, "Required property 'frontend_ip_configuration' is missing"
        return result

    @builtins.property
    def frontend_port(self) -> typing.List["ApplicationGatewayFrontendPort"]:
        """frontend_port block."""
        result = self._values.get("frontend_port")
        assert result is not None, "Required property 'frontend_port' is missing"
        return result

    @builtins.property
    def gateway_ip_configuration(
        self,
    ) -> typing.List["ApplicationGatewayGatewayIpConfiguration"]:
        """gateway_ip_configuration block."""
        result = self._values.get("gateway_ip_configuration")
        assert result is not None, "Required property 'gateway_ip_configuration' is missing"
        return result

    @builtins.property
    def http_listener(self) -> typing.List["ApplicationGatewayHttpListener"]:
        """http_listener block."""
        result = self._values.get("http_listener")
        assert result is not None, "Required property 'http_listener' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def request_routing_rule(
        self,
    ) -> typing.List["ApplicationGatewayRequestRoutingRule"]:
        """request_routing_rule block."""
        result = self._values.get("request_routing_rule")
        assert result is not None, "Required property 'request_routing_rule' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["ApplicationGatewaySku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def authentication_certificate(
        self,
    ) -> typing.Optional[typing.List[ApplicationGatewayAuthenticationCertificate]]:
        """authentication_certificate block."""
        result = self._values.get("authentication_certificate")
        return result

    @builtins.property
    def autoscale_configuration(
        self,
    ) -> typing.Optional[typing.List[ApplicationGatewayAutoscaleConfiguration]]:
        """autoscale_configuration block."""
        result = self._values.get("autoscale_configuration")
        return result

    @builtins.property
    def custom_error_configuration(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayCustomErrorConfiguration"]]:
        """custom_error_configuration block."""
        result = self._values.get("custom_error_configuration")
        return result

    @builtins.property
    def enable_http2(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_http2")
        return result

    @builtins.property
    def firewall_policy_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("firewall_policy_id")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["ApplicationGatewayIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def probe(self) -> typing.Optional[typing.List["ApplicationGatewayProbe"]]:
        """probe block."""
        result = self._values.get("probe")
        return result

    @builtins.property
    def redirect_configuration(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRedirectConfiguration"]]:
        """redirect_configuration block."""
        result = self._values.get("redirect_configuration")
        return result

    @builtins.property
    def rewrite_rule_set(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRewriteRuleSet"]]:
        """rewrite_rule_set block."""
        result = self._values.get("rewrite_rule_set")
        return result

    @builtins.property
    def ssl_certificate(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewaySslCertificate"]]:
        """ssl_certificate block."""
        result = self._values.get("ssl_certificate")
        return result

    @builtins.property
    def ssl_policy(self) -> typing.Optional[typing.List["ApplicationGatewaySslPolicy"]]:
        """ssl_policy block."""
        result = self._values.get("ssl_policy")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApplicationGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def trusted_root_certificate(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayTrustedRootCertificate"]]:
        """trusted_root_certificate block."""
        result = self._values.get("trusted_root_certificate")
        return result

    @builtins.property
    def url_path_map(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayUrlPathMap"]]:
        """url_path_map block."""
        result = self._values.get("url_path_map")
        return result

    @builtins.property
    def waf_configuration(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayWafConfiguration"]]:
        """waf_configuration block."""
        result = self._values.get("waf_configuration")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayCustomErrorConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "custom_error_page_url": "customErrorPageUrl",
        "status_code": "statusCode",
    },
)
class ApplicationGatewayCustomErrorConfiguration:
    def __init__(
        self,
        *,
        custom_error_page_url: builtins.str,
        status_code: builtins.str,
    ) -> None:
        """
        :param custom_error_page_url: -
        :param status_code: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "custom_error_page_url": custom_error_page_url,
            "status_code": status_code,
        }

    @builtins.property
    def custom_error_page_url(self) -> builtins.str:
        result = self._values.get("custom_error_page_url")
        assert result is not None, "Required property 'custom_error_page_url' is missing"
        return result

    @builtins.property
    def status_code(self) -> builtins.str:
        result = self._values.get("status_code")
        assert result is not None, "Required property 'status_code' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayCustomErrorConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayFrontendIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "private_ip_address": "privateIpAddress",
        "private_ip_address_allocation": "privateIpAddressAllocation",
        "public_ip_address_id": "publicIpAddressId",
        "subnet_id": "subnetId",
    },
)
class ApplicationGatewayFrontendIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        private_ip_address: typing.Optional[builtins.str] = None,
        private_ip_address_allocation: typing.Optional[builtins.str] = None,
        public_ip_address_id: typing.Optional[builtins.str] = None,
        subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param private_ip_address: -
        :param private_ip_address_allocation: -
        :param public_ip_address_id: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if private_ip_address is not None:
            self._values["private_ip_address"] = private_ip_address
        if private_ip_address_allocation is not None:
            self._values["private_ip_address_allocation"] = private_ip_address_allocation
        if public_ip_address_id is not None:
            self._values["public_ip_address_id"] = public_ip_address_id
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def private_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address")
        return result

    @builtins.property
    def private_ip_address_allocation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address_allocation")
        return result

    @builtins.property
    def public_ip_address_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_address_id")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayFrontendIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayFrontendPort",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "port": "port"},
)
class ApplicationGatewayFrontendPort:
    def __init__(self, *, name: builtins.str, port: jsii.Number) -> None:
        """
        :param name: -
        :param port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "port": port,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayFrontendPort(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayGatewayIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "subnet_id": "subnetId"},
)
class ApplicationGatewayGatewayIpConfiguration:
    def __init__(self, *, name: builtins.str, subnet_id: builtins.str) -> None:
        """
        :param name: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "subnet_id": subnet_id,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayGatewayIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayHttpListener",
    jsii_struct_bases=[],
    name_mapping={
        "frontend_ip_configuration_name": "frontendIpConfigurationName",
        "frontend_port_name": "frontendPortName",
        "name": "name",
        "protocol": "protocol",
        "custom_error_configuration": "customErrorConfiguration",
        "firewall_policy_id": "firewallPolicyId",
        "host_name": "hostName",
        "host_names": "hostNames",
        "require_sni": "requireSni",
        "ssl_certificate_name": "sslCertificateName",
    },
)
class ApplicationGatewayHttpListener:
    def __init__(
        self,
        *,
        frontend_ip_configuration_name: builtins.str,
        frontend_port_name: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        custom_error_configuration: typing.Optional[typing.List["ApplicationGatewayHttpListenerCustomErrorConfiguration"]] = None,
        firewall_policy_id: typing.Optional[builtins.str] = None,
        host_name: typing.Optional[builtins.str] = None,
        host_names: typing.Optional[typing.List[builtins.str]] = None,
        require_sni: typing.Optional[builtins.bool] = None,
        ssl_certificate_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param frontend_ip_configuration_name: -
        :param frontend_port_name: -
        :param name: -
        :param protocol: -
        :param custom_error_configuration: custom_error_configuration block.
        :param firewall_policy_id: -
        :param host_name: -
        :param host_names: -
        :param require_sni: -
        :param ssl_certificate_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "frontend_ip_configuration_name": frontend_ip_configuration_name,
            "frontend_port_name": frontend_port_name,
            "name": name,
            "protocol": protocol,
        }
        if custom_error_configuration is not None:
            self._values["custom_error_configuration"] = custom_error_configuration
        if firewall_policy_id is not None:
            self._values["firewall_policy_id"] = firewall_policy_id
        if host_name is not None:
            self._values["host_name"] = host_name
        if host_names is not None:
            self._values["host_names"] = host_names
        if require_sni is not None:
            self._values["require_sni"] = require_sni
        if ssl_certificate_name is not None:
            self._values["ssl_certificate_name"] = ssl_certificate_name

    @builtins.property
    def frontend_ip_configuration_name(self) -> builtins.str:
        result = self._values.get("frontend_ip_configuration_name")
        assert result is not None, "Required property 'frontend_ip_configuration_name' is missing"
        return result

    @builtins.property
    def frontend_port_name(self) -> builtins.str:
        result = self._values.get("frontend_port_name")
        assert result is not None, "Required property 'frontend_port_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def custom_error_configuration(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayHttpListenerCustomErrorConfiguration"]]:
        """custom_error_configuration block."""
        result = self._values.get("custom_error_configuration")
        return result

    @builtins.property
    def firewall_policy_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("firewall_policy_id")
        return result

    @builtins.property
    def host_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host_name")
        return result

    @builtins.property
    def host_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("host_names")
        return result

    @builtins.property
    def require_sni(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("require_sni")
        return result

    @builtins.property
    def ssl_certificate_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssl_certificate_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayHttpListener(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayHttpListenerCustomErrorConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "custom_error_page_url": "customErrorPageUrl",
        "status_code": "statusCode",
    },
)
class ApplicationGatewayHttpListenerCustomErrorConfiguration:
    def __init__(
        self,
        *,
        custom_error_page_url: builtins.str,
        status_code: builtins.str,
    ) -> None:
        """
        :param custom_error_page_url: -
        :param status_code: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "custom_error_page_url": custom_error_page_url,
            "status_code": status_code,
        }

    @builtins.property
    def custom_error_page_url(self) -> builtins.str:
        result = self._values.get("custom_error_page_url")
        assert result is not None, "Required property 'custom_error_page_url' is missing"
        return result

    @builtins.property
    def status_code(self) -> builtins.str:
        result = self._values.get("status_code")
        assert result is not None, "Required property 'status_code' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayHttpListenerCustomErrorConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayIdentity",
    jsii_struct_bases=[],
    name_mapping={"identity_ids": "identityIds", "type": "type"},
)
class ApplicationGatewayIdentity:
    def __init__(
        self,
        *,
        identity_ids: typing.List[builtins.str],
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param identity_ids: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "identity_ids": identity_ids,
        }
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def identity_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("identity_ids")
        assert result is not None, "Required property 'identity_ids' is missing"
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayProbe",
    jsii_struct_bases=[],
    name_mapping={
        "interval": "interval",
        "name": "name",
        "path": "path",
        "protocol": "protocol",
        "timeout": "timeout",
        "unhealthy_threshold": "unhealthyThreshold",
        "host": "host",
        "match": "match",
        "minimum_servers": "minimumServers",
        "pick_host_name_from_backend_http_settings": "pickHostNameFromBackendHttpSettings",
        "port": "port",
    },
)
class ApplicationGatewayProbe:
    def __init__(
        self,
        *,
        interval: jsii.Number,
        name: builtins.str,
        path: builtins.str,
        protocol: builtins.str,
        timeout: jsii.Number,
        unhealthy_threshold: jsii.Number,
        host: typing.Optional[builtins.str] = None,
        match: typing.Optional[typing.List["ApplicationGatewayProbeMatch"]] = None,
        minimum_servers: typing.Optional[jsii.Number] = None,
        pick_host_name_from_backend_http_settings: typing.Optional[builtins.bool] = None,
        port: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param interval: -
        :param name: -
        :param path: -
        :param protocol: -
        :param timeout: -
        :param unhealthy_threshold: -
        :param host: -
        :param match: match block.
        :param minimum_servers: -
        :param pick_host_name_from_backend_http_settings: -
        :param port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "interval": interval,
            "name": name,
            "path": path,
            "protocol": protocol,
            "timeout": timeout,
            "unhealthy_threshold": unhealthy_threshold,
        }
        if host is not None:
            self._values["host"] = host
        if match is not None:
            self._values["match"] = match
        if minimum_servers is not None:
            self._values["minimum_servers"] = minimum_servers
        if pick_host_name_from_backend_http_settings is not None:
            self._values["pick_host_name_from_backend_http_settings"] = pick_host_name_from_backend_http_settings
        if port is not None:
            self._values["port"] = port

    @builtins.property
    def interval(self) -> jsii.Number:
        result = self._values.get("interval")
        assert result is not None, "Required property 'interval' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def timeout(self) -> jsii.Number:
        result = self._values.get("timeout")
        assert result is not None, "Required property 'timeout' is missing"
        return result

    @builtins.property
    def unhealthy_threshold(self) -> jsii.Number:
        result = self._values.get("unhealthy_threshold")
        assert result is not None, "Required property 'unhealthy_threshold' is missing"
        return result

    @builtins.property
    def host(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host")
        return result

    @builtins.property
    def match(self) -> typing.Optional[typing.List["ApplicationGatewayProbeMatch"]]:
        """match block."""
        result = self._values.get("match")
        return result

    @builtins.property
    def minimum_servers(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("minimum_servers")
        return result

    @builtins.property
    def pick_host_name_from_backend_http_settings(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("pick_host_name_from_backend_http_settings")
        return result

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayProbe(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayProbeMatch",
    jsii_struct_bases=[],
    name_mapping={"body": "body", "status_code": "statusCode"},
)
class ApplicationGatewayProbeMatch:
    def __init__(
        self,
        *,
        body: typing.Optional[builtins.str] = None,
        status_code: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param body: -
        :param status_code: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if body is not None:
            self._values["body"] = body
        if status_code is not None:
            self._values["status_code"] = status_code

    @builtins.property
    def body(self) -> typing.Optional[builtins.str]:
        result = self._values.get("body")
        return result

    @builtins.property
    def status_code(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("status_code")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayProbeMatch(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayRedirectConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "redirect_type": "redirectType",
        "include_path": "includePath",
        "include_query_string": "includeQueryString",
        "target_listener_name": "targetListenerName",
        "target_url": "targetUrl",
    },
)
class ApplicationGatewayRedirectConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        redirect_type: builtins.str,
        include_path: typing.Optional[builtins.bool] = None,
        include_query_string: typing.Optional[builtins.bool] = None,
        target_listener_name: typing.Optional[builtins.str] = None,
        target_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param redirect_type: -
        :param include_path: -
        :param include_query_string: -
        :param target_listener_name: -
        :param target_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "redirect_type": redirect_type,
        }
        if include_path is not None:
            self._values["include_path"] = include_path
        if include_query_string is not None:
            self._values["include_query_string"] = include_query_string
        if target_listener_name is not None:
            self._values["target_listener_name"] = target_listener_name
        if target_url is not None:
            self._values["target_url"] = target_url

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def redirect_type(self) -> builtins.str:
        result = self._values.get("redirect_type")
        assert result is not None, "Required property 'redirect_type' is missing"
        return result

    @builtins.property
    def include_path(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("include_path")
        return result

    @builtins.property
    def include_query_string(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("include_query_string")
        return result

    @builtins.property
    def target_listener_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_listener_name")
        return result

    @builtins.property
    def target_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayRedirectConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayRequestRoutingRule",
    jsii_struct_bases=[],
    name_mapping={
        "http_listener_name": "httpListenerName",
        "name": "name",
        "rule_type": "ruleType",
        "backend_address_pool_name": "backendAddressPoolName",
        "backend_http_settings_name": "backendHttpSettingsName",
        "redirect_configuration_name": "redirectConfigurationName",
        "rewrite_rule_set_name": "rewriteRuleSetName",
        "url_path_map_name": "urlPathMapName",
    },
)
class ApplicationGatewayRequestRoutingRule:
    def __init__(
        self,
        *,
        http_listener_name: builtins.str,
        name: builtins.str,
        rule_type: builtins.str,
        backend_address_pool_name: typing.Optional[builtins.str] = None,
        backend_http_settings_name: typing.Optional[builtins.str] = None,
        redirect_configuration_name: typing.Optional[builtins.str] = None,
        rewrite_rule_set_name: typing.Optional[builtins.str] = None,
        url_path_map_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param http_listener_name: -
        :param name: -
        :param rule_type: -
        :param backend_address_pool_name: -
        :param backend_http_settings_name: -
        :param redirect_configuration_name: -
        :param rewrite_rule_set_name: -
        :param url_path_map_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "http_listener_name": http_listener_name,
            "name": name,
            "rule_type": rule_type,
        }
        if backend_address_pool_name is not None:
            self._values["backend_address_pool_name"] = backend_address_pool_name
        if backend_http_settings_name is not None:
            self._values["backend_http_settings_name"] = backend_http_settings_name
        if redirect_configuration_name is not None:
            self._values["redirect_configuration_name"] = redirect_configuration_name
        if rewrite_rule_set_name is not None:
            self._values["rewrite_rule_set_name"] = rewrite_rule_set_name
        if url_path_map_name is not None:
            self._values["url_path_map_name"] = url_path_map_name

    @builtins.property
    def http_listener_name(self) -> builtins.str:
        result = self._values.get("http_listener_name")
        assert result is not None, "Required property 'http_listener_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def rule_type(self) -> builtins.str:
        result = self._values.get("rule_type")
        assert result is not None, "Required property 'rule_type' is missing"
        return result

    @builtins.property
    def backend_address_pool_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("backend_address_pool_name")
        return result

    @builtins.property
    def backend_http_settings_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("backend_http_settings_name")
        return result

    @builtins.property
    def redirect_configuration_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("redirect_configuration_name")
        return result

    @builtins.property
    def rewrite_rule_set_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("rewrite_rule_set_name")
        return result

    @builtins.property
    def url_path_map_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("url_path_map_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayRequestRoutingRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayRewriteRuleSet",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "rewrite_rule": "rewriteRule"},
)
class ApplicationGatewayRewriteRuleSet:
    def __init__(
        self,
        *,
        name: builtins.str,
        rewrite_rule: typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRule"]] = None,
    ) -> None:
        """
        :param name: -
        :param rewrite_rule: rewrite_rule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if rewrite_rule is not None:
            self._values["rewrite_rule"] = rewrite_rule

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def rewrite_rule(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRule"]]:
        """rewrite_rule block."""
        result = self._values.get("rewrite_rule")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayRewriteRuleSet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayRewriteRuleSetRewriteRule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "rule_sequence": "ruleSequence",
        "condition": "condition",
        "request_header_configuration": "requestHeaderConfiguration",
        "response_header_configuration": "responseHeaderConfiguration",
    },
)
class ApplicationGatewayRewriteRuleSetRewriteRule:
    def __init__(
        self,
        *,
        name: builtins.str,
        rule_sequence: jsii.Number,
        condition: typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRuleCondition"]] = None,
        request_header_configuration: typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRuleRequestHeaderConfiguration"]] = None,
        response_header_configuration: typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRuleResponseHeaderConfiguration"]] = None,
    ) -> None:
        """
        :param name: -
        :param rule_sequence: -
        :param condition: condition block.
        :param request_header_configuration: request_header_configuration block.
        :param response_header_configuration: response_header_configuration block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "rule_sequence": rule_sequence,
        }
        if condition is not None:
            self._values["condition"] = condition
        if request_header_configuration is not None:
            self._values["request_header_configuration"] = request_header_configuration
        if response_header_configuration is not None:
            self._values["response_header_configuration"] = response_header_configuration

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def rule_sequence(self) -> jsii.Number:
        result = self._values.get("rule_sequence")
        assert result is not None, "Required property 'rule_sequence' is missing"
        return result

    @builtins.property
    def condition(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRuleCondition"]]:
        """condition block."""
        result = self._values.get("condition")
        return result

    @builtins.property
    def request_header_configuration(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRuleRequestHeaderConfiguration"]]:
        """request_header_configuration block."""
        result = self._values.get("request_header_configuration")
        return result

    @builtins.property
    def response_header_configuration(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayRewriteRuleSetRewriteRuleResponseHeaderConfiguration"]]:
        """response_header_configuration block."""
        result = self._values.get("response_header_configuration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayRewriteRuleSetRewriteRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayRewriteRuleSetRewriteRuleCondition",
    jsii_struct_bases=[],
    name_mapping={
        "pattern": "pattern",
        "variable": "variable",
        "ignore_case": "ignoreCase",
        "negate": "negate",
    },
)
class ApplicationGatewayRewriteRuleSetRewriteRuleCondition:
    def __init__(
        self,
        *,
        pattern: builtins.str,
        variable: builtins.str,
        ignore_case: typing.Optional[builtins.bool] = None,
        negate: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param pattern: -
        :param variable: -
        :param ignore_case: -
        :param negate: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "pattern": pattern,
            "variable": variable,
        }
        if ignore_case is not None:
            self._values["ignore_case"] = ignore_case
        if negate is not None:
            self._values["negate"] = negate

    @builtins.property
    def pattern(self) -> builtins.str:
        result = self._values.get("pattern")
        assert result is not None, "Required property 'pattern' is missing"
        return result

    @builtins.property
    def variable(self) -> builtins.str:
        result = self._values.get("variable")
        assert result is not None, "Required property 'variable' is missing"
        return result

    @builtins.property
    def ignore_case(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ignore_case")
        return result

    @builtins.property
    def negate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayRewriteRuleSetRewriteRuleCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayRewriteRuleSetRewriteRuleRequestHeaderConfiguration",
    jsii_struct_bases=[],
    name_mapping={"header_name": "headerName", "header_value": "headerValue"},
)
class ApplicationGatewayRewriteRuleSetRewriteRuleRequestHeaderConfiguration:
    def __init__(
        self,
        *,
        header_name: builtins.str,
        header_value: builtins.str,
    ) -> None:
        """
        :param header_name: -
        :param header_value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "header_name": header_name,
            "header_value": header_value,
        }

    @builtins.property
    def header_name(self) -> builtins.str:
        result = self._values.get("header_name")
        assert result is not None, "Required property 'header_name' is missing"
        return result

    @builtins.property
    def header_value(self) -> builtins.str:
        result = self._values.get("header_value")
        assert result is not None, "Required property 'header_value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayRewriteRuleSetRewriteRuleRequestHeaderConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayRewriteRuleSetRewriteRuleResponseHeaderConfiguration",
    jsii_struct_bases=[],
    name_mapping={"header_name": "headerName", "header_value": "headerValue"},
)
class ApplicationGatewayRewriteRuleSetRewriteRuleResponseHeaderConfiguration:
    def __init__(
        self,
        *,
        header_name: builtins.str,
        header_value: builtins.str,
    ) -> None:
        """
        :param header_name: -
        :param header_value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "header_name": header_name,
            "header_value": header_value,
        }

    @builtins.property
    def header_name(self) -> builtins.str:
        result = self._values.get("header_name")
        assert result is not None, "Required property 'header_name' is missing"
        return result

    @builtins.property
    def header_value(self) -> builtins.str:
        result = self._values.get("header_value")
        assert result is not None, "Required property 'header_value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayRewriteRuleSetRewriteRuleResponseHeaderConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewaySku",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "tier": "tier", "capacity": "capacity"},
)
class ApplicationGatewaySku:
    def __init__(
        self,
        *,
        name: builtins.str,
        tier: builtins.str,
        capacity: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param name: -
        :param tier: -
        :param capacity: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "tier": tier,
        }
        if capacity is not None:
            self._values["capacity"] = capacity

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def capacity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("capacity")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewaySku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewaySslCertificate",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "data": "data",
        "key_vault_secret_id": "keyVaultSecretId",
        "password": "password",
    },
)
class ApplicationGatewaySslCertificate:
    def __init__(
        self,
        *,
        name: builtins.str,
        data: typing.Optional[builtins.str] = None,
        key_vault_secret_id: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param data: -
        :param key_vault_secret_id: -
        :param password: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if data is not None:
            self._values["data"] = data
        if key_vault_secret_id is not None:
            self._values["key_vault_secret_id"] = key_vault_secret_id
        if password is not None:
            self._values["password"] = password

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data")
        return result

    @builtins.property
    def key_vault_secret_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_secret_id")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewaySslCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewaySslPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "cipher_suites": "cipherSuites",
        "disabled_protocols": "disabledProtocols",
        "min_protocol_version": "minProtocolVersion",
        "policy_name": "policyName",
        "policy_type": "policyType",
    },
)
class ApplicationGatewaySslPolicy:
    def __init__(
        self,
        *,
        cipher_suites: typing.Optional[typing.List[builtins.str]] = None,
        disabled_protocols: typing.Optional[typing.List[builtins.str]] = None,
        min_protocol_version: typing.Optional[builtins.str] = None,
        policy_name: typing.Optional[builtins.str] = None,
        policy_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param cipher_suites: -
        :param disabled_protocols: -
        :param min_protocol_version: -
        :param policy_name: -
        :param policy_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if cipher_suites is not None:
            self._values["cipher_suites"] = cipher_suites
        if disabled_protocols is not None:
            self._values["disabled_protocols"] = disabled_protocols
        if min_protocol_version is not None:
            self._values["min_protocol_version"] = min_protocol_version
        if policy_name is not None:
            self._values["policy_name"] = policy_name
        if policy_type is not None:
            self._values["policy_type"] = policy_type

    @builtins.property
    def cipher_suites(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("cipher_suites")
        return result

    @builtins.property
    def disabled_protocols(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("disabled_protocols")
        return result

    @builtins.property
    def min_protocol_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_protocol_version")
        return result

    @builtins.property
    def policy_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("policy_name")
        return result

    @builtins.property
    def policy_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("policy_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewaySslPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApplicationGatewayTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayTrustedRootCertificate",
    jsii_struct_bases=[],
    name_mapping={"data": "data", "name": "name"},
)
class ApplicationGatewayTrustedRootCertificate:
    def __init__(self, *, data: builtins.str, name: builtins.str) -> None:
        """
        :param data: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "data": data,
            "name": name,
        }

    @builtins.property
    def data(self) -> builtins.str:
        result = self._values.get("data")
        assert result is not None, "Required property 'data' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayTrustedRootCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayUrlPathMap",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "path_rule": "pathRule",
        "default_backend_address_pool_name": "defaultBackendAddressPoolName",
        "default_backend_http_settings_name": "defaultBackendHttpSettingsName",
        "default_redirect_configuration_name": "defaultRedirectConfigurationName",
        "default_rewrite_rule_set_name": "defaultRewriteRuleSetName",
    },
)
class ApplicationGatewayUrlPathMap:
    def __init__(
        self,
        *,
        name: builtins.str,
        path_rule: typing.List["ApplicationGatewayUrlPathMapPathRule"],
        default_backend_address_pool_name: typing.Optional[builtins.str] = None,
        default_backend_http_settings_name: typing.Optional[builtins.str] = None,
        default_redirect_configuration_name: typing.Optional[builtins.str] = None,
        default_rewrite_rule_set_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param path_rule: path_rule block.
        :param default_backend_address_pool_name: -
        :param default_backend_http_settings_name: -
        :param default_redirect_configuration_name: -
        :param default_rewrite_rule_set_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "path_rule": path_rule,
        }
        if default_backend_address_pool_name is not None:
            self._values["default_backend_address_pool_name"] = default_backend_address_pool_name
        if default_backend_http_settings_name is not None:
            self._values["default_backend_http_settings_name"] = default_backend_http_settings_name
        if default_redirect_configuration_name is not None:
            self._values["default_redirect_configuration_name"] = default_redirect_configuration_name
        if default_rewrite_rule_set_name is not None:
            self._values["default_rewrite_rule_set_name"] = default_rewrite_rule_set_name

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def path_rule(self) -> typing.List["ApplicationGatewayUrlPathMapPathRule"]:
        """path_rule block."""
        result = self._values.get("path_rule")
        assert result is not None, "Required property 'path_rule' is missing"
        return result

    @builtins.property
    def default_backend_address_pool_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_backend_address_pool_name")
        return result

    @builtins.property
    def default_backend_http_settings_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_backend_http_settings_name")
        return result

    @builtins.property
    def default_redirect_configuration_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_redirect_configuration_name")
        return result

    @builtins.property
    def default_rewrite_rule_set_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_rewrite_rule_set_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayUrlPathMap(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayUrlPathMapPathRule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "paths": "paths",
        "backend_address_pool_name": "backendAddressPoolName",
        "backend_http_settings_name": "backendHttpSettingsName",
        "redirect_configuration_name": "redirectConfigurationName",
        "rewrite_rule_set_name": "rewriteRuleSetName",
    },
)
class ApplicationGatewayUrlPathMapPathRule:
    def __init__(
        self,
        *,
        name: builtins.str,
        paths: typing.List[builtins.str],
        backend_address_pool_name: typing.Optional[builtins.str] = None,
        backend_http_settings_name: typing.Optional[builtins.str] = None,
        redirect_configuration_name: typing.Optional[builtins.str] = None,
        rewrite_rule_set_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param paths: -
        :param backend_address_pool_name: -
        :param backend_http_settings_name: -
        :param redirect_configuration_name: -
        :param rewrite_rule_set_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "paths": paths,
        }
        if backend_address_pool_name is not None:
            self._values["backend_address_pool_name"] = backend_address_pool_name
        if backend_http_settings_name is not None:
            self._values["backend_http_settings_name"] = backend_http_settings_name
        if redirect_configuration_name is not None:
            self._values["redirect_configuration_name"] = redirect_configuration_name
        if rewrite_rule_set_name is not None:
            self._values["rewrite_rule_set_name"] = rewrite_rule_set_name

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def paths(self) -> typing.List[builtins.str]:
        result = self._values.get("paths")
        assert result is not None, "Required property 'paths' is missing"
        return result

    @builtins.property
    def backend_address_pool_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("backend_address_pool_name")
        return result

    @builtins.property
    def backend_http_settings_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("backend_http_settings_name")
        return result

    @builtins.property
    def redirect_configuration_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("redirect_configuration_name")
        return result

    @builtins.property
    def rewrite_rule_set_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("rewrite_rule_set_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayUrlPathMapPathRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayWafConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "firewall_mode": "firewallMode",
        "rule_set_version": "ruleSetVersion",
        "disabled_rule_group": "disabledRuleGroup",
        "exclusion": "exclusion",
        "file_upload_limit_mb": "fileUploadLimitMb",
        "max_request_body_size_kb": "maxRequestBodySizeKb",
        "request_body_check": "requestBodyCheck",
        "rule_set_type": "ruleSetType",
    },
)
class ApplicationGatewayWafConfiguration:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        firewall_mode: builtins.str,
        rule_set_version: builtins.str,
        disabled_rule_group: typing.Optional[typing.List["ApplicationGatewayWafConfigurationDisabledRuleGroup"]] = None,
        exclusion: typing.Optional[typing.List["ApplicationGatewayWafConfigurationExclusion"]] = None,
        file_upload_limit_mb: typing.Optional[jsii.Number] = None,
        max_request_body_size_kb: typing.Optional[jsii.Number] = None,
        request_body_check: typing.Optional[builtins.bool] = None,
        rule_set_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param firewall_mode: -
        :param rule_set_version: -
        :param disabled_rule_group: disabled_rule_group block.
        :param exclusion: exclusion block.
        :param file_upload_limit_mb: -
        :param max_request_body_size_kb: -
        :param request_body_check: -
        :param rule_set_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "firewall_mode": firewall_mode,
            "rule_set_version": rule_set_version,
        }
        if disabled_rule_group is not None:
            self._values["disabled_rule_group"] = disabled_rule_group
        if exclusion is not None:
            self._values["exclusion"] = exclusion
        if file_upload_limit_mb is not None:
            self._values["file_upload_limit_mb"] = file_upload_limit_mb
        if max_request_body_size_kb is not None:
            self._values["max_request_body_size_kb"] = max_request_body_size_kb
        if request_body_check is not None:
            self._values["request_body_check"] = request_body_check
        if rule_set_type is not None:
            self._values["rule_set_type"] = rule_set_type

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def firewall_mode(self) -> builtins.str:
        result = self._values.get("firewall_mode")
        assert result is not None, "Required property 'firewall_mode' is missing"
        return result

    @builtins.property
    def rule_set_version(self) -> builtins.str:
        result = self._values.get("rule_set_version")
        assert result is not None, "Required property 'rule_set_version' is missing"
        return result

    @builtins.property
    def disabled_rule_group(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayWafConfigurationDisabledRuleGroup"]]:
        """disabled_rule_group block."""
        result = self._values.get("disabled_rule_group")
        return result

    @builtins.property
    def exclusion(
        self,
    ) -> typing.Optional[typing.List["ApplicationGatewayWafConfigurationExclusion"]]:
        """exclusion block."""
        result = self._values.get("exclusion")
        return result

    @builtins.property
    def file_upload_limit_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("file_upload_limit_mb")
        return result

    @builtins.property
    def max_request_body_size_kb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_request_body_size_kb")
        return result

    @builtins.property
    def request_body_check(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("request_body_check")
        return result

    @builtins.property
    def rule_set_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("rule_set_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayWafConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayWafConfigurationDisabledRuleGroup",
    jsii_struct_bases=[],
    name_mapping={"rule_group_name": "ruleGroupName", "rules": "rules"},
)
class ApplicationGatewayWafConfigurationDisabledRuleGroup:
    def __init__(
        self,
        *,
        rule_group_name: builtins.str,
        rules: typing.Optional[typing.List[jsii.Number]] = None,
    ) -> None:
        """
        :param rule_group_name: -
        :param rules: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "rule_group_name": rule_group_name,
        }
        if rules is not None:
            self._values["rules"] = rules

    @builtins.property
    def rule_group_name(self) -> builtins.str:
        result = self._values.get("rule_group_name")
        assert result is not None, "Required property 'rule_group_name' is missing"
        return result

    @builtins.property
    def rules(self) -> typing.Optional[typing.List[jsii.Number]]:
        result = self._values.get("rules")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayWafConfigurationDisabledRuleGroup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationGatewayWafConfigurationExclusion",
    jsii_struct_bases=[],
    name_mapping={
        "match_variable": "matchVariable",
        "selector": "selector",
        "selector_match_operator": "selectorMatchOperator",
    },
)
class ApplicationGatewayWafConfigurationExclusion:
    def __init__(
        self,
        *,
        match_variable: builtins.str,
        selector: typing.Optional[builtins.str] = None,
        selector_match_operator: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param match_variable: -
        :param selector: -
        :param selector_match_operator: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_variable": match_variable,
        }
        if selector is not None:
            self._values["selector"] = selector
        if selector_match_operator is not None:
            self._values["selector_match_operator"] = selector_match_operator

    @builtins.property
    def match_variable(self) -> builtins.str:
        result = self._values.get("match_variable")
        assert result is not None, "Required property 'match_variable' is missing"
        return result

    @builtins.property
    def selector(self) -> typing.Optional[builtins.str]:
        result = self._values.get("selector")
        return result

    @builtins.property
    def selector_match_operator(self) -> typing.Optional[builtins.str]:
        result = self._values.get("selector_match_operator")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationGatewayWafConfigurationExclusion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApplicationInsights(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApplicationInsights",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_type: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        daily_data_cap_in_gb: typing.Optional[jsii.Number] = None,
        daily_data_cap_notifications_disabled: typing.Optional[builtins.bool] = None,
        disable_ip_masking: typing.Optional[builtins.bool] = None,
        retention_in_days: typing.Optional[jsii.Number] = None,
        sampling_percentage: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApplicationInsightsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_type: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param daily_data_cap_in_gb: -
        :param daily_data_cap_notifications_disabled: -
        :param disable_ip_masking: -
        :param retention_in_days: -
        :param sampling_percentage: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApplicationInsightsConfig(
            application_type=application_type,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            daily_data_cap_in_gb=daily_data_cap_in_gb,
            daily_data_cap_notifications_disabled=daily_data_cap_notifications_disabled,
            disable_ip_masking=disable_ip_masking,
            retention_in_days=retention_in_days,
            sampling_percentage=sampling_percentage,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApplicationInsights, self, [scope, id, config])

    @jsii.member(jsii_name="resetDailyDataCapInGb")
    def reset_daily_data_cap_in_gb(self) -> None:
        return jsii.invoke(self, "resetDailyDataCapInGb", [])

    @jsii.member(jsii_name="resetDailyDataCapNotificationsDisabled")
    def reset_daily_data_cap_notifications_disabled(self) -> None:
        return jsii.invoke(self, "resetDailyDataCapNotificationsDisabled", [])

    @jsii.member(jsii_name="resetDisableIpMasking")
    def reset_disable_ip_masking(self) -> None:
        return jsii.invoke(self, "resetDisableIpMasking", [])

    @jsii.member(jsii_name="resetRetentionInDays")
    def reset_retention_in_days(self) -> None:
        return jsii.invoke(self, "resetRetentionInDays", [])

    @jsii.member(jsii_name="resetSamplingPercentage")
    def reset_sampling_percentage(self) -> None:
        return jsii.invoke(self, "resetSamplingPercentage", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appId")
    def app_id(self) -> builtins.str:
        return jsii.get(self, "appId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationTypeInput")
    def application_type_input(self) -> builtins.str:
        return jsii.get(self, "applicationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instrumentationKey")
    def instrumentation_key(self) -> builtins.str:
        return jsii.get(self, "instrumentationKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyDataCapInGbInput")
    def daily_data_cap_in_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dailyDataCapInGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyDataCapNotificationsDisabledInput")
    def daily_data_cap_notifications_disabled_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "dailyDataCapNotificationsDisabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableIpMaskingInput")
    def disable_ip_masking_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableIpMaskingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDaysInput")
    def retention_in_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionInDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="samplingPercentageInput")
    def sampling_percentage_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "samplingPercentageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApplicationInsightsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationType")
    def application_type(self) -> builtins.str:
        return jsii.get(self, "applicationType")

    @application_type.setter # type: ignore
    def application_type(self, value: builtins.str) -> None:
        jsii.set(self, "applicationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyDataCapInGb")
    def daily_data_cap_in_gb(self) -> jsii.Number:
        return jsii.get(self, "dailyDataCapInGb")

    @daily_data_cap_in_gb.setter # type: ignore
    def daily_data_cap_in_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "dailyDataCapInGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyDataCapNotificationsDisabled")
    def daily_data_cap_notifications_disabled(self) -> builtins.bool:
        return jsii.get(self, "dailyDataCapNotificationsDisabled")

    @daily_data_cap_notifications_disabled.setter # type: ignore
    def daily_data_cap_notifications_disabled(self, value: builtins.bool) -> None:
        jsii.set(self, "dailyDataCapNotificationsDisabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableIpMasking")
    def disable_ip_masking(self) -> builtins.bool:
        return jsii.get(self, "disableIpMasking")

    @disable_ip_masking.setter # type: ignore
    def disable_ip_masking(self, value: builtins.bool) -> None:
        jsii.set(self, "disableIpMasking", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDays")
    def retention_in_days(self) -> jsii.Number:
        return jsii.get(self, "retentionInDays")

    @retention_in_days.setter # type: ignore
    def retention_in_days(self, value: jsii.Number) -> None:
        jsii.set(self, "retentionInDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="samplingPercentage")
    def sampling_percentage(self) -> jsii.Number:
        return jsii.get(self, "samplingPercentage")

    @sampling_percentage.setter # type: ignore
    def sampling_percentage(self, value: jsii.Number) -> None:
        jsii.set(self, "samplingPercentage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApplicationInsightsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApplicationInsightsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class ApplicationInsightsAnalyticsItem(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApplicationInsightsAnalyticsItem",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        application_insights_id: builtins.str,
        content: builtins.str,
        name: builtins.str,
        scope: builtins.str,
        type: builtins.str,
        function_alias: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApplicationInsightsAnalyticsItemTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param application_insights_id: -
        :param content: -
        :param name: -
        :param scope: -
        :param type: -
        :param function_alias: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApplicationInsightsAnalyticsItemConfig(
            application_insights_id=application_insights_id,
            content=content,
            name=name,
            scope=scope,
            type=type,
            function_alias=function_alias,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApplicationInsightsAnalyticsItem, self, [scope_, id, config])

    @jsii.member(jsii_name="resetFunctionAlias")
    def reset_function_alias(self) -> None:
        return jsii.invoke(self, "resetFunctionAlias", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsIdInput")
    def application_insights_id_input(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentInput")
    def content_input(self) -> builtins.str:
        return jsii.get(self, "contentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeCreated")
    def time_created(self) -> builtins.str:
        return jsii.get(self, "timeCreated")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeModified")
    def time_modified(self) -> builtins.str:
        return jsii.get(self, "timeModified")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionAliasInput")
    def function_alias_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "functionAliasInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ApplicationInsightsAnalyticsItemTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsId")
    def application_insights_id(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsId")

    @application_insights_id.setter # type: ignore
    def application_insights_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationInsightsId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="content")
    def content(self) -> builtins.str:
        return jsii.get(self, "content")

    @content.setter # type: ignore
    def content(self, value: builtins.str) -> None:
        jsii.set(self, "content", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionAlias")
    def function_alias(self) -> builtins.str:
        return jsii.get(self, "functionAlias")

    @function_alias.setter # type: ignore
    def function_alias(self, value: builtins.str) -> None:
        jsii.set(self, "functionAlias", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApplicationInsightsAnalyticsItemTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApplicationInsightsAnalyticsItemTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsAnalyticsItemConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_insights_id": "applicationInsightsId",
        "content": "content",
        "name": "name",
        "scope": "scope",
        "type": "type",
        "function_alias": "functionAlias",
        "timeouts": "timeouts",
    },
)
class ApplicationInsightsAnalyticsItemConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_insights_id: builtins.str,
        content: builtins.str,
        name: builtins.str,
        scope: builtins.str,
        type: builtins.str,
        function_alias: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ApplicationInsightsAnalyticsItemTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_insights_id: -
        :param content: -
        :param name: -
        :param scope: -
        :param type: -
        :param function_alias: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApplicationInsightsAnalyticsItemTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_insights_id": application_insights_id,
            "content": content,
            "name": name,
            "scope": scope,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if function_alias is not None:
            self._values["function_alias"] = function_alias
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_insights_id(self) -> builtins.str:
        result = self._values.get("application_insights_id")
        assert result is not None, "Required property 'application_insights_id' is missing"
        return result

    @builtins.property
    def content(self) -> builtins.str:
        result = self._values.get("content")
        assert result is not None, "Required property 'content' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def function_alias(self) -> typing.Optional[builtins.str]:
        result = self._values.get("function_alias")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApplicationInsightsAnalyticsItemTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsAnalyticsItemConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsAnalyticsItemTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApplicationInsightsAnalyticsItemTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsAnalyticsItemTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApplicationInsightsApiKey(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApplicationInsightsApiKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_insights_id: builtins.str,
        name: builtins.str,
        read_permissions: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ApplicationInsightsApiKeyTimeouts"] = None,
        write_permissions: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_insights_id: -
        :param name: -
        :param read_permissions: -
        :param timeouts: timeouts block.
        :param write_permissions: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApplicationInsightsApiKeyConfig(
            application_insights_id=application_insights_id,
            name=name,
            read_permissions=read_permissions,
            timeouts=timeouts,
            write_permissions=write_permissions,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApplicationInsightsApiKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetReadPermissions")
    def reset_read_permissions(self) -> None:
        return jsii.invoke(self, "resetReadPermissions", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWritePermissions")
    def reset_write_permissions(self) -> None:
        return jsii.invoke(self, "resetWritePermissions", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiKey")
    def api_key(self) -> builtins.str:
        return jsii.get(self, "apiKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsIdInput")
    def application_insights_id_input(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readPermissionsInput")
    def read_permissions_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "readPermissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApplicationInsightsApiKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="writePermissionsInput")
    def write_permissions_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "writePermissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsId")
    def application_insights_id(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsId")

    @application_insights_id.setter # type: ignore
    def application_insights_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationInsightsId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readPermissions")
    def read_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "readPermissions")

    @read_permissions.setter # type: ignore
    def read_permissions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "readPermissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApplicationInsightsApiKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApplicationInsightsApiKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="writePermissions")
    def write_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "writePermissions")

    @write_permissions.setter # type: ignore
    def write_permissions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "writePermissions", value)


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsApiKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_insights_id": "applicationInsightsId",
        "name": "name",
        "read_permissions": "readPermissions",
        "timeouts": "timeouts",
        "write_permissions": "writePermissions",
    },
)
class ApplicationInsightsApiKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_insights_id: builtins.str,
        name: builtins.str,
        read_permissions: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ApplicationInsightsApiKeyTimeouts"] = None,
        write_permissions: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_insights_id: -
        :param name: -
        :param read_permissions: -
        :param timeouts: timeouts block.
        :param write_permissions: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApplicationInsightsApiKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_insights_id": application_insights_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if read_permissions is not None:
            self._values["read_permissions"] = read_permissions
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if write_permissions is not None:
            self._values["write_permissions"] = write_permissions

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_insights_id(self) -> builtins.str:
        result = self._values.get("application_insights_id")
        assert result is not None, "Required property 'application_insights_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def read_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("read_permissions")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApplicationInsightsApiKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def write_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("write_permissions")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsApiKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsApiKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApplicationInsightsApiKeyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsApiKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_type": "applicationType",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "daily_data_cap_in_gb": "dailyDataCapInGb",
        "daily_data_cap_notifications_disabled": "dailyDataCapNotificationsDisabled",
        "disable_ip_masking": "disableIpMasking",
        "retention_in_days": "retentionInDays",
        "sampling_percentage": "samplingPercentage",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ApplicationInsightsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_type: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        daily_data_cap_in_gb: typing.Optional[jsii.Number] = None,
        daily_data_cap_notifications_disabled: typing.Optional[builtins.bool] = None,
        disable_ip_masking: typing.Optional[builtins.bool] = None,
        retention_in_days: typing.Optional[jsii.Number] = None,
        sampling_percentage: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApplicationInsightsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_type: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param daily_data_cap_in_gb: -
        :param daily_data_cap_notifications_disabled: -
        :param disable_ip_masking: -
        :param retention_in_days: -
        :param sampling_percentage: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApplicationInsightsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_type": application_type,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if daily_data_cap_in_gb is not None:
            self._values["daily_data_cap_in_gb"] = daily_data_cap_in_gb
        if daily_data_cap_notifications_disabled is not None:
            self._values["daily_data_cap_notifications_disabled"] = daily_data_cap_notifications_disabled
        if disable_ip_masking is not None:
            self._values["disable_ip_masking"] = disable_ip_masking
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if sampling_percentage is not None:
            self._values["sampling_percentage"] = sampling_percentage
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_type(self) -> builtins.str:
        result = self._values.get("application_type")
        assert result is not None, "Required property 'application_type' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def daily_data_cap_in_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("daily_data_cap_in_gb")
        return result

    @builtins.property
    def daily_data_cap_notifications_disabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("daily_data_cap_notifications_disabled")
        return result

    @builtins.property
    def disable_ip_masking(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disable_ip_masking")
        return result

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def sampling_percentage(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("sampling_percentage")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApplicationInsightsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApplicationInsightsTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApplicationInsightsWebTest(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApplicationInsightsWebTest",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_insights_id: builtins.str,
        configuration: builtins.str,
        geo_locations: typing.List[builtins.str],
        kind: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        frequency: typing.Optional[jsii.Number] = None,
        retry_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeout: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["ApplicationInsightsWebTestTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_insights_id: -
        :param configuration: -
        :param geo_locations: -
        :param kind: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param enabled: -
        :param frequency: -
        :param retry_enabled: -
        :param tags: -
        :param timeout: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApplicationInsightsWebTestConfig(
            application_insights_id=application_insights_id,
            configuration=configuration,
            geo_locations=geo_locations,
            kind=kind,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            enabled=enabled,
            frequency=frequency,
            retry_enabled=retry_enabled,
            tags=tags,
            timeout=timeout,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApplicationInsightsWebTest, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetFrequency")
    def reset_frequency(self) -> None:
        return jsii.invoke(self, "resetFrequency", [])

    @jsii.member(jsii_name="resetRetryEnabled")
    def reset_retry_enabled(self) -> None:
        return jsii.invoke(self, "resetRetryEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeout")
    def reset_timeout(self) -> None:
        return jsii.invoke(self, "resetTimeout", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsIdInput")
    def application_insights_id_input(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="configurationInput")
    def configuration_input(self) -> builtins.str:
        return jsii.get(self, "configurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoLocationsInput")
    def geo_locations_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "geoLocationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kindInput")
    def kind_input(self) -> builtins.str:
        return jsii.get(self, "kindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="syntheticMonitorId")
    def synthetic_monitor_id(self) -> builtins.str:
        return jsii.get(self, "syntheticMonitorId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequencyInput")
    def frequency_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "frequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retryEnabledInput")
    def retry_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "retryEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutInput")
    def timeout_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeoutInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApplicationInsightsWebTestTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsId")
    def application_insights_id(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsId")

    @application_insights_id.setter # type: ignore
    def application_insights_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationInsightsId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="configuration")
    def configuration(self) -> builtins.str:
        return jsii.get(self, "configuration")

    @configuration.setter # type: ignore
    def configuration(self, value: builtins.str) -> None:
        jsii.set(self, "configuration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> jsii.Number:
        return jsii.get(self, "frequency")

    @frequency.setter # type: ignore
    def frequency(self, value: jsii.Number) -> None:
        jsii.set(self, "frequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoLocations")
    def geo_locations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "geoLocations")

    @geo_locations.setter # type: ignore
    def geo_locations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "geoLocations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @kind.setter # type: ignore
    def kind(self, value: builtins.str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retryEnabled")
    def retry_enabled(self) -> builtins.bool:
        return jsii.get(self, "retryEnabled")

    @retry_enabled.setter # type: ignore
    def retry_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "retryEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeout")
    def timeout(self) -> jsii.Number:
        return jsii.get(self, "timeout")

    @timeout.setter # type: ignore
    def timeout(self, value: jsii.Number) -> None:
        jsii.set(self, "timeout", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApplicationInsightsWebTestTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApplicationInsightsWebTestTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsWebTestConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_insights_id": "applicationInsightsId",
        "configuration": "configuration",
        "geo_locations": "geoLocations",
        "kind": "kind",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "enabled": "enabled",
        "frequency": "frequency",
        "retry_enabled": "retryEnabled",
        "tags": "tags",
        "timeout": "timeout",
        "timeouts": "timeouts",
    },
)
class ApplicationInsightsWebTestConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_insights_id: builtins.str,
        configuration: builtins.str,
        geo_locations: typing.List[builtins.str],
        kind: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        frequency: typing.Optional[jsii.Number] = None,
        retry_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeout: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["ApplicationInsightsWebTestTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_insights_id: -
        :param configuration: -
        :param geo_locations: -
        :param kind: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param enabled: -
        :param frequency: -
        :param retry_enabled: -
        :param tags: -
        :param timeout: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApplicationInsightsWebTestTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_insights_id": application_insights_id,
            "configuration": configuration,
            "geo_locations": geo_locations,
            "kind": kind,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if frequency is not None:
            self._values["frequency"] = frequency
        if retry_enabled is not None:
            self._values["retry_enabled"] = retry_enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeout is not None:
            self._values["timeout"] = timeout
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_insights_id(self) -> builtins.str:
        result = self._values.get("application_insights_id")
        assert result is not None, "Required property 'application_insights_id' is missing"
        return result

    @builtins.property
    def configuration(self) -> builtins.str:
        result = self._values.get("configuration")
        assert result is not None, "Required property 'configuration' is missing"
        return result

    @builtins.property
    def geo_locations(self) -> typing.List[builtins.str]:
        result = self._values.get("geo_locations")
        assert result is not None, "Required property 'geo_locations' is missing"
        return result

    @builtins.property
    def kind(self) -> builtins.str:
        result = self._values.get("kind")
        assert result is not None, "Required property 'kind' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def frequency(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("frequency")
        return result

    @builtins.property
    def retry_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("retry_enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeout(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("timeout")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApplicationInsightsWebTestTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsWebTestConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationInsightsWebTestTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApplicationInsightsWebTestTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationInsightsWebTestTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ApplicationSecurityGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ApplicationSecurityGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApplicationSecurityGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ApplicationSecurityGroupConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ApplicationSecurityGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ApplicationSecurityGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ApplicationSecurityGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ApplicationSecurityGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ApplicationSecurityGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ApplicationSecurityGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ApplicationSecurityGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ApplicationSecurityGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ApplicationSecurityGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationSecurityGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ApplicationSecurityGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ApplicationSecurityGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ApplicationSecurityGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AttestationProvider(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AttestationProvider",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        policy_signing_certificate_data: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AttestationProviderTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param policy_signing_certificate_data: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AttestationProviderConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            policy_signing_certificate_data=policy_signing_certificate_data,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AttestationProvider, self, [scope, id, config])

    @jsii.member(jsii_name="resetPolicySigningCertificateData")
    def reset_policy_signing_certificate_data(self) -> None:
        return jsii.invoke(self, "resetPolicySigningCertificateData", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="attestationUri")
    def attestation_uri(self) -> builtins.str:
        return jsii.get(self, "attestationUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustModel")
    def trust_model(self) -> builtins.str:
        return jsii.get(self, "trustModel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policySigningCertificateDataInput")
    def policy_signing_certificate_data_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "policySigningCertificateDataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AttestationProviderTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policySigningCertificateData")
    def policy_signing_certificate_data(self) -> builtins.str:
        return jsii.get(self, "policySigningCertificateData")

    @policy_signing_certificate_data.setter # type: ignore
    def policy_signing_certificate_data(self, value: builtins.str) -> None:
        jsii.set(self, "policySigningCertificateData", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AttestationProviderTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AttestationProviderTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AttestationProviderConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "policy_signing_certificate_data": "policySigningCertificateData",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AttestationProviderConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        policy_signing_certificate_data: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AttestationProviderTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param policy_signing_certificate_data: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AttestationProviderTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if policy_signing_certificate_data is not None:
            self._values["policy_signing_certificate_data"] = policy_signing_certificate_data
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def policy_signing_certificate_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("policy_signing_certificate_data")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AttestationProviderTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AttestationProviderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AttestationProviderTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AttestationProviderTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AttestationProviderTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AutomationAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationAccountConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dscPrimaryAccessKey")
    def dsc_primary_access_key(self) -> builtins.str:
        return jsii.get(self, "dscPrimaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dscSecondaryAccessKey")
    def dsc_secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "dscSecondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dscServerEndpoint")
    def dsc_server_endpoint(self) -> builtins.str:
        return jsii.get(self, "dscServerEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AutomationAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AutomationAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        base64: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param base64: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationCertificateConfig(
            automation_account_name=automation_account_name,
            base64=base64,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="base64Input")
    def base64_input(self) -> builtins.str:
        return jsii.get(self, "base64Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="exportable")
    def exportable(self) -> builtins.bool:
        return jsii.get(self, "exportable")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="base64")
    def base64(self) -> builtins.str:
        return jsii.get(self, "base64")

    @base64.setter # type: ignore
    def base64(self, value: builtins.str) -> None:
        jsii.set(self, "base64", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "base64": "base64",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class AutomationCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        base64: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param base64: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "base64": base64,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def base64(self) -> builtins.str:
        result = self._values.get("base64")
        assert result is not None, "Required property 'base64' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        values: typing.Mapping[builtins.str, builtins.str],
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param values: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationConnectionConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            type=type,
            values=values,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valuesInput")
    def values_input(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "valuesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="values")
    def values(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "values")

    @values.setter # type: ignore
    def values(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "values", value)


class AutomationConnectionCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationConnectionCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        automation_certificate_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        subscription_id: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param automation_certificate_name: -
        :param name: -
        :param resource_group_name: -
        :param subscription_id: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationConnectionCertificateConfig(
            automation_account_name=automation_account_name,
            automation_certificate_name=automation_certificate_name,
            name=name,
            resource_group_name=resource_group_name,
            subscription_id=subscription_id,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationConnectionCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationCertificateNameInput")
    def automation_certificate_name_input(self) -> builtins.str:
        return jsii.get(self, "automationCertificateNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIdInput")
    def subscription_id_input(self) -> builtins.str:
        return jsii.get(self, "subscriptionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["AutomationConnectionCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationCertificateName")
    def automation_certificate_name(self) -> builtins.str:
        return jsii.get(self, "automationCertificateName")

    @automation_certificate_name.setter # type: ignore
    def automation_certificate_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationCertificateName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")

    @subscription_id.setter # type: ignore
    def subscription_id(self, value: builtins.str) -> None:
        jsii.set(self, "subscriptionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationConnectionCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationConnectionCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "automation_certificate_name": "automationCertificateName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "subscription_id": "subscriptionId",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class AutomationConnectionCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        automation_certificate_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        subscription_id: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param automation_certificate_name: -
        :param name: -
        :param resource_group_name: -
        :param subscription_id: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationConnectionCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "automation_certificate_name": automation_certificate_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "subscription_id": subscription_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def automation_certificate_name(self) -> builtins.str:
        result = self._values.get("automation_certificate_name")
        assert result is not None, "Required property 'automation_certificate_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def subscription_id(self) -> builtins.str:
        result = self._values.get("subscription_id")
        assert result is not None, "Required property 'subscription_id' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationConnectionCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationConnectionCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationConnectionClassicCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationConnectionClassicCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        certificate_asset_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        subscription_id: builtins.str,
        subscription_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionClassicCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param certificate_asset_name: -
        :param name: -
        :param resource_group_name: -
        :param subscription_id: -
        :param subscription_name: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationConnectionClassicCertificateConfig(
            automation_account_name=automation_account_name,
            certificate_asset_name=certificate_asset_name,
            name=name,
            resource_group_name=resource_group_name,
            subscription_id=subscription_id,
            subscription_name=subscription_name,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationConnectionClassicCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateAssetNameInput")
    def certificate_asset_name_input(self) -> builtins.str:
        return jsii.get(self, "certificateAssetNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIdInput")
    def subscription_id_input(self) -> builtins.str:
        return jsii.get(self, "subscriptionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionNameInput")
    def subscription_name_input(self) -> builtins.str:
        return jsii.get(self, "subscriptionNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["AutomationConnectionClassicCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateAssetName")
    def certificate_asset_name(self) -> builtins.str:
        return jsii.get(self, "certificateAssetName")

    @certificate_asset_name.setter # type: ignore
    def certificate_asset_name(self, value: builtins.str) -> None:
        jsii.set(self, "certificateAssetName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")

    @subscription_id.setter # type: ignore
    def subscription_id(self, value: builtins.str) -> None:
        jsii.set(self, "subscriptionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionName")
    def subscription_name(self) -> builtins.str:
        return jsii.get(self, "subscriptionName")

    @subscription_name.setter # type: ignore
    def subscription_name(self, value: builtins.str) -> None:
        jsii.set(self, "subscriptionName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationConnectionClassicCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationConnectionClassicCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionClassicCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "certificate_asset_name": "certificateAssetName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "subscription_id": "subscriptionId",
        "subscription_name": "subscriptionName",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class AutomationConnectionClassicCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        certificate_asset_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        subscription_id: builtins.str,
        subscription_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionClassicCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param certificate_asset_name: -
        :param name: -
        :param resource_group_name: -
        :param subscription_id: -
        :param subscription_name: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationConnectionClassicCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "certificate_asset_name": certificate_asset_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "subscription_id": subscription_id,
            "subscription_name": subscription_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def certificate_asset_name(self) -> builtins.str:
        result = self._values.get("certificate_asset_name")
        assert result is not None, "Required property 'certificate_asset_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def subscription_id(self) -> builtins.str:
        result = self._values.get("subscription_id")
        assert result is not None, "Required property 'subscription_id' is missing"
        return result

    @builtins.property
    def subscription_name(self) -> builtins.str:
        result = self._values.get("subscription_name")
        assert result is not None, "Required property 'subscription_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["AutomationConnectionClassicCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionClassicCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionClassicCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationConnectionClassicCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionClassicCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "type": "type",
        "values": "values",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class AutomationConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        values: typing.Mapping[builtins.str, builtins.str],
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param values: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "type": type,
            "values": values,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def values(self) -> typing.Mapping[builtins.str, builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationConnectionServicePrincipal(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationConnectionServicePrincipal",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_id: builtins.str,
        automation_account_name: builtins.str,
        certificate_thumbprint: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        subscription_id: builtins.str,
        tenant_id: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionServicePrincipalTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_id: -
        :param automation_account_name: -
        :param certificate_thumbprint: -
        :param name: -
        :param resource_group_name: -
        :param subscription_id: -
        :param tenant_id: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationConnectionServicePrincipalConfig(
            application_id=application_id,
            automation_account_name=automation_account_name,
            certificate_thumbprint=certificate_thumbprint,
            name=name,
            resource_group_name=resource_group_name,
            subscription_id=subscription_id,
            tenant_id=tenant_id,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationConnectionServicePrincipal, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationIdInput")
    def application_id_input(self) -> builtins.str:
        return jsii.get(self, "applicationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateThumbprintInput")
    def certificate_thumbprint_input(self) -> builtins.str:
        return jsii.get(self, "certificateThumbprintInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIdInput")
    def subscription_id_input(self) -> builtins.str:
        return jsii.get(self, "subscriptionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["AutomationConnectionServicePrincipalTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationId")
    def application_id(self) -> builtins.str:
        return jsii.get(self, "applicationId")

    @application_id.setter # type: ignore
    def application_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateThumbprint")
    def certificate_thumbprint(self) -> builtins.str:
        return jsii.get(self, "certificateThumbprint")

    @certificate_thumbprint.setter # type: ignore
    def certificate_thumbprint(self, value: builtins.str) -> None:
        jsii.set(self, "certificateThumbprint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")

    @subscription_id.setter # type: ignore
    def subscription_id(self, value: builtins.str) -> None:
        jsii.set(self, "subscriptionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationConnectionServicePrincipalTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationConnectionServicePrincipalTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionServicePrincipalConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_id": "applicationId",
        "automation_account_name": "automationAccountName",
        "certificate_thumbprint": "certificateThumbprint",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "subscription_id": "subscriptionId",
        "tenant_id": "tenantId",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class AutomationConnectionServicePrincipalConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_id: builtins.str,
        automation_account_name: builtins.str,
        certificate_thumbprint: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        subscription_id: builtins.str,
        tenant_id: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationConnectionServicePrincipalTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_id: -
        :param automation_account_name: -
        :param certificate_thumbprint: -
        :param name: -
        :param resource_group_name: -
        :param subscription_id: -
        :param tenant_id: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationConnectionServicePrincipalTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_id": application_id,
            "automation_account_name": automation_account_name,
            "certificate_thumbprint": certificate_thumbprint,
            "name": name,
            "resource_group_name": resource_group_name,
            "subscription_id": subscription_id,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_id(self) -> builtins.str:
        result = self._values.get("application_id")
        assert result is not None, "Required property 'application_id' is missing"
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def certificate_thumbprint(self) -> builtins.str:
        result = self._values.get("certificate_thumbprint")
        assert result is not None, "Required property 'certificate_thumbprint' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def subscription_id(self) -> builtins.str:
        result = self._values.get("subscription_id")
        assert result is not None, "Required property 'subscription_id' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["AutomationConnectionServicePrincipalTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionServicePrincipalConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionServicePrincipalTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationConnectionServicePrincipalTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionServicePrincipalTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationCredential(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationCredential",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        password: builtins.str,
        resource_group_name: builtins.str,
        username: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationCredentialTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param password: -
        :param resource_group_name: -
        :param username: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationCredentialConfig(
            automation_account_name=automation_account_name,
            name=name,
            password=password,
            resource_group_name=resource_group_name,
            username=username,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationCredential, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> builtins.str:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usernameInput")
    def username_input(self) -> builtins.str:
        return jsii.get(self, "usernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationCredentialTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationCredentialTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationCredentialTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")

    @username.setter # type: ignore
    def username(self, value: builtins.str) -> None:
        jsii.set(self, "username", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationCredentialConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "password": "password",
        "resource_group_name": "resourceGroupName",
        "username": "username",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class AutomationCredentialConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        password: builtins.str,
        resource_group_name: builtins.str,
        username: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationCredentialTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param password: -
        :param resource_group_name: -
        :param username: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationCredentialTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "password": password,
            "resource_group_name": resource_group_name,
            "username": username,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationCredentialTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationCredentialConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationCredentialTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationCredentialTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationCredentialTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationDscConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationDscConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        content_embedded: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        log_verbose: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AutomationDscConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param content_embedded: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param log_verbose: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationDscConfigurationConfig(
            automation_account_name=automation_account_name,
            content_embedded=content_embedded,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            log_verbose=log_verbose,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationDscConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetLogVerbose")
    def reset_log_verbose(self) -> None:
        return jsii.invoke(self, "resetLogVerbose", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEmbeddedInput")
    def content_embedded_input(self) -> builtins.str:
        return jsii.get(self, "contentEmbeddedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="state")
    def state(self) -> builtins.str:
        return jsii.get(self, "state")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logVerboseInput")
    def log_verbose_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "logVerboseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationDscConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEmbedded")
    def content_embedded(self) -> builtins.str:
        return jsii.get(self, "contentEmbedded")

    @content_embedded.setter # type: ignore
    def content_embedded(self, value: builtins.str) -> None:
        jsii.set(self, "contentEmbedded", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logVerbose")
    def log_verbose(self) -> builtins.bool:
        return jsii.get(self, "logVerbose")

    @log_verbose.setter # type: ignore
    def log_verbose(self, value: builtins.bool) -> None:
        jsii.set(self, "logVerbose", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationDscConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationDscConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationDscConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "content_embedded": "contentEmbedded",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "log_verbose": "logVerbose",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AutomationDscConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        content_embedded: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        log_verbose: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AutomationDscConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param content_embedded: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param log_verbose: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationDscConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "content_embedded": content_embedded,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if log_verbose is not None:
            self._values["log_verbose"] = log_verbose
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def content_embedded(self) -> builtins.str:
        result = self._values.get("content_embedded")
        assert result is not None, "Required property 'content_embedded' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def log_verbose(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("log_verbose")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationDscConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationDscConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationDscConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationDscConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationDscConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationDscNodeconfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationDscNodeconfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        content_embedded: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["AutomationDscNodeconfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param content_embedded: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationDscNodeconfigurationConfig(
            automation_account_name=automation_account_name,
            content_embedded=content_embedded,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationDscNodeconfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="configurationName")
    def configuration_name(self) -> builtins.str:
        return jsii.get(self, "configurationName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEmbeddedInput")
    def content_embedded_input(self) -> builtins.str:
        return jsii.get(self, "contentEmbeddedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["AutomationDscNodeconfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEmbedded")
    def content_embedded(self) -> builtins.str:
        return jsii.get(self, "contentEmbedded")

    @content_embedded.setter # type: ignore
    def content_embedded(self, value: builtins.str) -> None:
        jsii.set(self, "contentEmbedded", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationDscNodeconfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationDscNodeconfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationDscNodeconfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "content_embedded": "contentEmbedded",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class AutomationDscNodeconfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        content_embedded: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["AutomationDscNodeconfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param content_embedded: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationDscNodeconfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "content_embedded": content_embedded,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def content_embedded(self) -> builtins.str:
        result = self._values.get("content_embedded")
        assert result is not None, "Required property 'content_embedded' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationDscNodeconfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationDscNodeconfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationDscNodeconfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationDscNodeconfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationDscNodeconfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationJobSchedule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationJobSchedule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        resource_group_name: builtins.str,
        runbook_name: builtins.str,
        schedule_name: builtins.str,
        job_schedule_id: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        run_on: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationJobScheduleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param resource_group_name: -
        :param runbook_name: -
        :param schedule_name: -
        :param job_schedule_id: -
        :param parameters: -
        :param run_on: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationJobScheduleConfig(
            automation_account_name=automation_account_name,
            resource_group_name=resource_group_name,
            runbook_name=runbook_name,
            schedule_name=schedule_name,
            job_schedule_id=job_schedule_id,
            parameters=parameters,
            run_on=run_on,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationJobSchedule, self, [scope, id, config])

    @jsii.member(jsii_name="resetJobScheduleId")
    def reset_job_schedule_id(self) -> None:
        return jsii.invoke(self, "resetJobScheduleId", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetRunOn")
    def reset_run_on(self) -> None:
        return jsii.invoke(self, "resetRunOn", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runbookNameInput")
    def runbook_name_input(self) -> builtins.str:
        return jsii.get(self, "runbookNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scheduleNameInput")
    def schedule_name_input(self) -> builtins.str:
        return jsii.get(self, "scheduleNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="jobScheduleIdInput")
    def job_schedule_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "jobScheduleIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runOnInput")
    def run_on_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "runOnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationJobScheduleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="jobScheduleId")
    def job_schedule_id(self) -> builtins.str:
        return jsii.get(self, "jobScheduleId")

    @job_schedule_id.setter # type: ignore
    def job_schedule_id(self, value: builtins.str) -> None:
        jsii.set(self, "jobScheduleId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runbookName")
    def runbook_name(self) -> builtins.str:
        return jsii.get(self, "runbookName")

    @runbook_name.setter # type: ignore
    def runbook_name(self, value: builtins.str) -> None:
        jsii.set(self, "runbookName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runOn")
    def run_on(self) -> builtins.str:
        return jsii.get(self, "runOn")

    @run_on.setter # type: ignore
    def run_on(self, value: builtins.str) -> None:
        jsii.set(self, "runOn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scheduleName")
    def schedule_name(self) -> builtins.str:
        return jsii.get(self, "scheduleName")

    @schedule_name.setter # type: ignore
    def schedule_name(self, value: builtins.str) -> None:
        jsii.set(self, "scheduleName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationJobScheduleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationJobScheduleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationJobScheduleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "resource_group_name": "resourceGroupName",
        "runbook_name": "runbookName",
        "schedule_name": "scheduleName",
        "job_schedule_id": "jobScheduleId",
        "parameters": "parameters",
        "run_on": "runOn",
        "timeouts": "timeouts",
    },
)
class AutomationJobScheduleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        resource_group_name: builtins.str,
        runbook_name: builtins.str,
        schedule_name: builtins.str,
        job_schedule_id: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        run_on: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationJobScheduleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param resource_group_name: -
        :param runbook_name: -
        :param schedule_name: -
        :param job_schedule_id: -
        :param parameters: -
        :param run_on: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationJobScheduleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "resource_group_name": resource_group_name,
            "runbook_name": runbook_name,
            "schedule_name": schedule_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if job_schedule_id is not None:
            self._values["job_schedule_id"] = job_schedule_id
        if parameters is not None:
            self._values["parameters"] = parameters
        if run_on is not None:
            self._values["run_on"] = run_on
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def runbook_name(self) -> builtins.str:
        result = self._values.get("runbook_name")
        assert result is not None, "Required property 'runbook_name' is missing"
        return result

    @builtins.property
    def schedule_name(self) -> builtins.str:
        result = self._values.get("schedule_name")
        assert result is not None, "Required property 'schedule_name' is missing"
        return result

    @builtins.property
    def job_schedule_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("job_schedule_id")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def run_on(self) -> typing.Optional[builtins.str]:
        result = self._values.get("run_on")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationJobScheduleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationJobScheduleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationJobScheduleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationJobScheduleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationJobScheduleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationModule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationModule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        module_link: typing.List["AutomationModuleModuleLink"],
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["AutomationModuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param module_link: module_link block.
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationModuleConfig(
            automation_account_name=automation_account_name,
            module_link=module_link,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationModule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="moduleLinkInput")
    def module_link_input(self) -> typing.List["AutomationModuleModuleLink"]:
        return jsii.get(self, "moduleLinkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationModuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="moduleLink")
    def module_link(self) -> typing.List["AutomationModuleModuleLink"]:
        return jsii.get(self, "moduleLink")

    @module_link.setter # type: ignore
    def module_link(self, value: typing.List["AutomationModuleModuleLink"]) -> None:
        jsii.set(self, "moduleLink", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationModuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationModuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationModuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "module_link": "moduleLink",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class AutomationModuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        module_link: typing.List["AutomationModuleModuleLink"],
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["AutomationModuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param module_link: module_link block.
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationModuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "module_link": module_link,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def module_link(self) -> typing.List["AutomationModuleModuleLink"]:
        """module_link block."""
        result = self._values.get("module_link")
        assert result is not None, "Required property 'module_link' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationModuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationModuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationModuleModuleLink",
    jsii_struct_bases=[],
    name_mapping={"uri": "uri", "hash": "hash"},
)
class AutomationModuleModuleLink:
    def __init__(
        self,
        *,
        uri: builtins.str,
        hash: typing.Optional[typing.List["AutomationModuleModuleLinkHash"]] = None,
    ) -> None:
        """
        :param uri: -
        :param hash: hash block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "uri": uri,
        }
        if hash is not None:
            self._values["hash"] = hash

    @builtins.property
    def uri(self) -> builtins.str:
        result = self._values.get("uri")
        assert result is not None, "Required property 'uri' is missing"
        return result

    @builtins.property
    def hash(self) -> typing.Optional[typing.List["AutomationModuleModuleLinkHash"]]:
        """hash block."""
        result = self._values.get("hash")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationModuleModuleLink(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationModuleModuleLinkHash",
    jsii_struct_bases=[],
    name_mapping={"algorithm": "algorithm", "value": "value"},
)
class AutomationModuleModuleLinkHash:
    def __init__(self, *, algorithm: builtins.str, value: builtins.str) -> None:
        """
        :param algorithm: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "algorithm": algorithm,
            "value": value,
        }

    @builtins.property
    def algorithm(self) -> builtins.str:
        result = self._values.get("algorithm")
        assert result is not None, "Required property 'algorithm' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationModuleModuleLinkHash(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationModuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationModuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationModuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationRunbook(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationRunbook",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        location: builtins.str,
        log_progress: builtins.bool,
        log_verbose: builtins.bool,
        name: builtins.str,
        resource_group_name: builtins.str,
        runbook_type: builtins.str,
        content: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        job_schedule: typing.Optional[typing.List["AutomationRunbookJobSchedule"]] = None,
        publish_content_link: typing.Optional[typing.List["AutomationRunbookPublishContentLink"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AutomationRunbookTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param location: -
        :param log_progress: -
        :param log_verbose: -
        :param name: -
        :param resource_group_name: -
        :param runbook_type: -
        :param content: -
        :param description: -
        :param job_schedule: -
        :param publish_content_link: publish_content_link block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationRunbookConfig(
            automation_account_name=automation_account_name,
            location=location,
            log_progress=log_progress,
            log_verbose=log_verbose,
            name=name,
            resource_group_name=resource_group_name,
            runbook_type=runbook_type,
            content=content,
            description=description,
            job_schedule=job_schedule,
            publish_content_link=publish_content_link,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationRunbook, self, [scope, id, config])

    @jsii.member(jsii_name="resetContent")
    def reset_content(self) -> None:
        return jsii.invoke(self, "resetContent", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetJobSchedule")
    def reset_job_schedule(self) -> None:
        return jsii.invoke(self, "resetJobSchedule", [])

    @jsii.member(jsii_name="resetPublishContentLink")
    def reset_publish_content_link(self) -> None:
        return jsii.invoke(self, "resetPublishContentLink", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logProgressInput")
    def log_progress_input(self) -> builtins.bool:
        return jsii.get(self, "logProgressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logVerboseInput")
    def log_verbose_input(self) -> builtins.bool:
        return jsii.get(self, "logVerboseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runbookTypeInput")
    def runbook_type_input(self) -> builtins.str:
        return jsii.get(self, "runbookTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentInput")
    def content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="jobScheduleInput")
    def job_schedule_input(
        self,
    ) -> typing.Optional[typing.List["AutomationRunbookJobSchedule"]]:
        return jsii.get(self, "jobScheduleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publishContentLinkInput")
    def publish_content_link_input(
        self,
    ) -> typing.Optional[typing.List["AutomationRunbookPublishContentLink"]]:
        return jsii.get(self, "publishContentLinkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationRunbookTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="content")
    def content(self) -> builtins.str:
        return jsii.get(self, "content")

    @content.setter # type: ignore
    def content(self, value: builtins.str) -> None:
        jsii.set(self, "content", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="jobSchedule")
    def job_schedule(self) -> typing.List["AutomationRunbookJobSchedule"]:
        return jsii.get(self, "jobSchedule")

    @job_schedule.setter # type: ignore
    def job_schedule(self, value: typing.List["AutomationRunbookJobSchedule"]) -> None:
        jsii.set(self, "jobSchedule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logProgress")
    def log_progress(self) -> builtins.bool:
        return jsii.get(self, "logProgress")

    @log_progress.setter # type: ignore
    def log_progress(self, value: builtins.bool) -> None:
        jsii.set(self, "logProgress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logVerbose")
    def log_verbose(self) -> builtins.bool:
        return jsii.get(self, "logVerbose")

    @log_verbose.setter # type: ignore
    def log_verbose(self, value: builtins.bool) -> None:
        jsii.set(self, "logVerbose", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publishContentLink")
    def publish_content_link(
        self,
    ) -> typing.List["AutomationRunbookPublishContentLink"]:
        return jsii.get(self, "publishContentLink")

    @publish_content_link.setter # type: ignore
    def publish_content_link(
        self,
        value: typing.List["AutomationRunbookPublishContentLink"],
    ) -> None:
        jsii.set(self, "publishContentLink", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runbookType")
    def runbook_type(self) -> builtins.str:
        return jsii.get(self, "runbookType")

    @runbook_type.setter # type: ignore
    def runbook_type(self, value: builtins.str) -> None:
        jsii.set(self, "runbookType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationRunbookTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationRunbookTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationRunbookConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "location": "location",
        "log_progress": "logProgress",
        "log_verbose": "logVerbose",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "runbook_type": "runbookType",
        "content": "content",
        "description": "description",
        "job_schedule": "jobSchedule",
        "publish_content_link": "publishContentLink",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AutomationRunbookConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        location: builtins.str,
        log_progress: builtins.bool,
        log_verbose: builtins.bool,
        name: builtins.str,
        resource_group_name: builtins.str,
        runbook_type: builtins.str,
        content: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        job_schedule: typing.Optional[typing.List["AutomationRunbookJobSchedule"]] = None,
        publish_content_link: typing.Optional[typing.List["AutomationRunbookPublishContentLink"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AutomationRunbookTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param location: -
        :param log_progress: -
        :param log_verbose: -
        :param name: -
        :param resource_group_name: -
        :param runbook_type: -
        :param content: -
        :param description: -
        :param job_schedule: -
        :param publish_content_link: publish_content_link block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationRunbookTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "location": location,
            "log_progress": log_progress,
            "log_verbose": log_verbose,
            "name": name,
            "resource_group_name": resource_group_name,
            "runbook_type": runbook_type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if content is not None:
            self._values["content"] = content
        if description is not None:
            self._values["description"] = description
        if job_schedule is not None:
            self._values["job_schedule"] = job_schedule
        if publish_content_link is not None:
            self._values["publish_content_link"] = publish_content_link
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def log_progress(self) -> builtins.bool:
        result = self._values.get("log_progress")
        assert result is not None, "Required property 'log_progress' is missing"
        return result

    @builtins.property
    def log_verbose(self) -> builtins.bool:
        result = self._values.get("log_verbose")
        assert result is not None, "Required property 'log_verbose' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def runbook_type(self) -> builtins.str:
        result = self._values.get("runbook_type")
        assert result is not None, "Required property 'runbook_type' is missing"
        return result

    @builtins.property
    def content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def job_schedule(
        self,
    ) -> typing.Optional[typing.List["AutomationRunbookJobSchedule"]]:
        result = self._values.get("job_schedule")
        return result

    @builtins.property
    def publish_content_link(
        self,
    ) -> typing.Optional[typing.List["AutomationRunbookPublishContentLink"]]:
        """publish_content_link block."""
        result = self._values.get("publish_content_link")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationRunbookTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationRunbookConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationRunbookJobSchedule",
    jsii_struct_bases=[],
    name_mapping={
        "job_schedule_id": "jobScheduleId",
        "parameters": "parameters",
        "run_on": "runOn",
        "schedule_name": "scheduleName",
    },
)
class AutomationRunbookJobSchedule:
    def __init__(
        self,
        *,
        job_schedule_id: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        run_on: typing.Optional[builtins.str] = None,
        schedule_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param job_schedule_id: -
        :param parameters: -
        :param run_on: -
        :param schedule_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if job_schedule_id is not None:
            self._values["job_schedule_id"] = job_schedule_id
        if parameters is not None:
            self._values["parameters"] = parameters
        if run_on is not None:
            self._values["run_on"] = run_on
        if schedule_name is not None:
            self._values["schedule_name"] = schedule_name

    @builtins.property
    def job_schedule_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("job_schedule_id")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def run_on(self) -> typing.Optional[builtins.str]:
        result = self._values.get("run_on")
        return result

    @builtins.property
    def schedule_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("schedule_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationRunbookJobSchedule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationRunbookPublishContentLink",
    jsii_struct_bases=[],
    name_mapping={"uri": "uri", "hash": "hash", "version": "version"},
)
class AutomationRunbookPublishContentLink:
    def __init__(
        self,
        *,
        uri: builtins.str,
        hash: typing.Optional[typing.List["AutomationRunbookPublishContentLinkHash"]] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param uri: -
        :param hash: hash block.
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "uri": uri,
        }
        if hash is not None:
            self._values["hash"] = hash
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def uri(self) -> builtins.str:
        result = self._values.get("uri")
        assert result is not None, "Required property 'uri' is missing"
        return result

    @builtins.property
    def hash(
        self,
    ) -> typing.Optional[typing.List["AutomationRunbookPublishContentLinkHash"]]:
        """hash block."""
        result = self._values.get("hash")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationRunbookPublishContentLink(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationRunbookPublishContentLinkHash",
    jsii_struct_bases=[],
    name_mapping={"algorithm": "algorithm", "value": "value"},
)
class AutomationRunbookPublishContentLinkHash:
    def __init__(self, *, algorithm: builtins.str, value: builtins.str) -> None:
        """
        :param algorithm: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "algorithm": algorithm,
            "value": value,
        }

    @builtins.property
    def algorithm(self) -> builtins.str:
        result = self._values.get("algorithm")
        assert result is not None, "Required property 'algorithm' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationRunbookPublishContentLinkHash(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationRunbookTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationRunbookTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationRunbookTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationSchedule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationSchedule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        frequency: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        expiry_time: typing.Optional[builtins.str] = None,
        interval: typing.Optional[jsii.Number] = None,
        month_days: typing.Optional[typing.List[jsii.Number]] = None,
        monthly_occurrence: typing.Optional[typing.List["AutomationScheduleMonthlyOccurrence"]] = None,
        start_time: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationScheduleTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        week_days: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param frequency: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param expiry_time: -
        :param interval: -
        :param month_days: -
        :param monthly_occurrence: monthly_occurrence block.
        :param start_time: -
        :param timeouts: timeouts block.
        :param timezone: -
        :param week_days: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationScheduleConfig(
            automation_account_name=automation_account_name,
            frequency=frequency,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            expiry_time=expiry_time,
            interval=interval,
            month_days=month_days,
            monthly_occurrence=monthly_occurrence,
            start_time=start_time,
            timeouts=timeouts,
            timezone=timezone,
            week_days=week_days,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationSchedule, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetExpiryTime")
    def reset_expiry_time(self) -> None:
        return jsii.invoke(self, "resetExpiryTime", [])

    @jsii.member(jsii_name="resetInterval")
    def reset_interval(self) -> None:
        return jsii.invoke(self, "resetInterval", [])

    @jsii.member(jsii_name="resetMonthDays")
    def reset_month_days(self) -> None:
        return jsii.invoke(self, "resetMonthDays", [])

    @jsii.member(jsii_name="resetMonthlyOccurrence")
    def reset_monthly_occurrence(self) -> None:
        return jsii.invoke(self, "resetMonthlyOccurrence", [])

    @jsii.member(jsii_name="resetStartTime")
    def reset_start_time(self) -> None:
        return jsii.invoke(self, "resetStartTime", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTimezone")
    def reset_timezone(self) -> None:
        return jsii.invoke(self, "resetTimezone", [])

    @jsii.member(jsii_name="resetWeekDays")
    def reset_week_days(self) -> None:
        return jsii.invoke(self, "resetWeekDays", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequencyInput")
    def frequency_input(self) -> builtins.str:
        return jsii.get(self, "frequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expiryTimeInput")
    def expiry_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "expiryTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInput")
    def interval_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "intervalInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monthDaysInput")
    def month_days_input(self) -> typing.Optional[typing.List[jsii.Number]]:
        return jsii.get(self, "monthDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monthlyOccurrenceInput")
    def monthly_occurrence_input(
        self,
    ) -> typing.Optional[typing.List["AutomationScheduleMonthlyOccurrence"]]:
        return jsii.get(self, "monthlyOccurrenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTimeInput")
    def start_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "startTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationScheduleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezoneInput")
    def timezone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "timezoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="weekDaysInput")
    def week_days_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "weekDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expiryTime")
    def expiry_time(self) -> builtins.str:
        return jsii.get(self, "expiryTime")

    @expiry_time.setter # type: ignore
    def expiry_time(self, value: builtins.str) -> None:
        jsii.set(self, "expiryTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> builtins.str:
        return jsii.get(self, "frequency")

    @frequency.setter # type: ignore
    def frequency(self, value: builtins.str) -> None:
        jsii.set(self, "frequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="interval")
    def interval(self) -> jsii.Number:
        return jsii.get(self, "interval")

    @interval.setter # type: ignore
    def interval(self, value: jsii.Number) -> None:
        jsii.set(self, "interval", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monthDays")
    def month_days(self) -> typing.List[jsii.Number]:
        return jsii.get(self, "monthDays")

    @month_days.setter # type: ignore
    def month_days(self, value: typing.List[jsii.Number]) -> None:
        jsii.set(self, "monthDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monthlyOccurrence")
    def monthly_occurrence(self) -> typing.List["AutomationScheduleMonthlyOccurrence"]:
        return jsii.get(self, "monthlyOccurrence")

    @monthly_occurrence.setter # type: ignore
    def monthly_occurrence(
        self,
        value: typing.List["AutomationScheduleMonthlyOccurrence"],
    ) -> None:
        jsii.set(self, "monthlyOccurrence", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTime")
    def start_time(self) -> builtins.str:
        return jsii.get(self, "startTime")

    @start_time.setter # type: ignore
    def start_time(self, value: builtins.str) -> None:
        jsii.set(self, "startTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationScheduleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationScheduleTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezone")
    def timezone(self) -> builtins.str:
        return jsii.get(self, "timezone")

    @timezone.setter # type: ignore
    def timezone(self, value: builtins.str) -> None:
        jsii.set(self, "timezone", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="weekDays")
    def week_days(self) -> typing.List[builtins.str]:
        return jsii.get(self, "weekDays")

    @week_days.setter # type: ignore
    def week_days(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "weekDays", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationScheduleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "frequency": "frequency",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "expiry_time": "expiryTime",
        "interval": "interval",
        "month_days": "monthDays",
        "monthly_occurrence": "monthlyOccurrence",
        "start_time": "startTime",
        "timeouts": "timeouts",
        "timezone": "timezone",
        "week_days": "weekDays",
    },
)
class AutomationScheduleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        frequency: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        expiry_time: typing.Optional[builtins.str] = None,
        interval: typing.Optional[jsii.Number] = None,
        month_days: typing.Optional[typing.List[jsii.Number]] = None,
        monthly_occurrence: typing.Optional[typing.List["AutomationScheduleMonthlyOccurrence"]] = None,
        start_time: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["AutomationScheduleTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        week_days: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param frequency: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param expiry_time: -
        :param interval: -
        :param month_days: -
        :param monthly_occurrence: monthly_occurrence block.
        :param start_time: -
        :param timeouts: timeouts block.
        :param timezone: -
        :param week_days: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationScheduleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "frequency": frequency,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if expiry_time is not None:
            self._values["expiry_time"] = expiry_time
        if interval is not None:
            self._values["interval"] = interval
        if month_days is not None:
            self._values["month_days"] = month_days
        if monthly_occurrence is not None:
            self._values["monthly_occurrence"] = monthly_occurrence
        if start_time is not None:
            self._values["start_time"] = start_time
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if timezone is not None:
            self._values["timezone"] = timezone
        if week_days is not None:
            self._values["week_days"] = week_days

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def frequency(self) -> builtins.str:
        result = self._values.get("frequency")
        assert result is not None, "Required property 'frequency' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def expiry_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("expiry_time")
        return result

    @builtins.property
    def interval(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval")
        return result

    @builtins.property
    def month_days(self) -> typing.Optional[typing.List[jsii.Number]]:
        result = self._values.get("month_days")
        return result

    @builtins.property
    def monthly_occurrence(
        self,
    ) -> typing.Optional[typing.List["AutomationScheduleMonthlyOccurrence"]]:
        """monthly_occurrence block."""
        result = self._values.get("monthly_occurrence")
        return result

    @builtins.property
    def start_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("start_time")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationScheduleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    @builtins.property
    def week_days(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("week_days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationScheduleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationScheduleMonthlyOccurrence",
    jsii_struct_bases=[],
    name_mapping={"day": "day", "occurrence": "occurrence"},
)
class AutomationScheduleMonthlyOccurrence:
    def __init__(self, *, day: builtins.str, occurrence: jsii.Number) -> None:
        """
        :param day: -
        :param occurrence: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "day": day,
            "occurrence": occurrence,
        }

    @builtins.property
    def day(self) -> builtins.str:
        result = self._values.get("day")
        assert result is not None, "Required property 'day' is missing"
        return result

    @builtins.property
    def occurrence(self) -> jsii.Number:
        result = self._values.get("occurrence")
        assert result is not None, "Required property 'occurrence' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationScheduleMonthlyOccurrence(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationScheduleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationScheduleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationScheduleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationVariableBool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationVariableBool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableBoolTimeouts"] = None,
        value: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationVariableBoolConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            encrypted=encrypted,
            timeouts=timeouts,
            value=value,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationVariableBool, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEncrypted")
    def reset_encrypted(self) -> None:
        return jsii.invoke(self, "resetEncrypted", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetValue")
    def reset_value(self) -> None:
        return jsii.invoke(self, "resetValue", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptedInput")
    def encrypted_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationVariableBoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @encrypted.setter # type: ignore
    def encrypted(self, value: builtins.bool) -> None:
        jsii.set(self, "encrypted", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationVariableBoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationVariableBoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.bool:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.bool) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableBoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "encrypted": "encrypted",
        "timeouts": "timeouts",
        "value": "value",
    },
)
class AutomationVariableBoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableBoolTimeouts"] = None,
        value: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationVariableBoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if encrypted is not None:
            self._values["encrypted"] = encrypted
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def encrypted(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encrypted")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationVariableBoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def value(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableBoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableBoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationVariableBoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableBoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationVariableDatetime(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationVariableDatetime",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableDatetimeTimeouts"] = None,
        value: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationVariableDatetimeConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            encrypted=encrypted,
            timeouts=timeouts,
            value=value,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationVariableDatetime, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEncrypted")
    def reset_encrypted(self) -> None:
        return jsii.invoke(self, "resetEncrypted", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetValue")
    def reset_value(self) -> None:
        return jsii.invoke(self, "resetValue", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptedInput")
    def encrypted_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationVariableDatetimeTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @encrypted.setter # type: ignore
    def encrypted(self, value: builtins.bool) -> None:
        jsii.set(self, "encrypted", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationVariableDatetimeTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationVariableDatetimeTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableDatetimeConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "encrypted": "encrypted",
        "timeouts": "timeouts",
        "value": "value",
    },
)
class AutomationVariableDatetimeConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableDatetimeTimeouts"] = None,
        value: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationVariableDatetimeTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if encrypted is not None:
            self._values["encrypted"] = encrypted
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def encrypted(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encrypted")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationVariableDatetimeTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableDatetimeConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableDatetimeTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationVariableDatetimeTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableDatetimeTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationVariableInt(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationVariableInt",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableIntTimeouts"] = None,
        value: typing.Optional[jsii.Number] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationVariableIntConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            encrypted=encrypted,
            timeouts=timeouts,
            value=value,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationVariableInt, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEncrypted")
    def reset_encrypted(self) -> None:
        return jsii.invoke(self, "resetEncrypted", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetValue")
    def reset_value(self) -> None:
        return jsii.invoke(self, "resetValue", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptedInput")
    def encrypted_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationVariableIntTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @encrypted.setter # type: ignore
    def encrypted(self, value: builtins.bool) -> None:
        jsii.set(self, "encrypted", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationVariableIntTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationVariableIntTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> jsii.Number:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: jsii.Number) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableIntConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "encrypted": "encrypted",
        "timeouts": "timeouts",
        "value": "value",
    },
)
class AutomationVariableIntConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableIntTimeouts"] = None,
        value: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationVariableIntTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if encrypted is not None:
            self._values["encrypted"] = encrypted
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def encrypted(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encrypted")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationVariableIntTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def value(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableIntConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableIntTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationVariableIntTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableIntTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AutomationVariableString(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AutomationVariableString",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableStringTimeouts"] = None,
        value: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AutomationVariableStringConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            encrypted=encrypted,
            timeouts=timeouts,
            value=value,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AutomationVariableString, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEncrypted")
    def reset_encrypted(self) -> None:
        return jsii.invoke(self, "resetEncrypted", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetValue")
    def reset_value(self) -> None:
        return jsii.invoke(self, "resetValue", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptedInput")
    def encrypted_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AutomationVariableStringTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @encrypted.setter # type: ignore
    def encrypted(self, value: builtins.bool) -> None:
        jsii.set(self, "encrypted", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AutomationVariableStringTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AutomationVariableStringTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableStringConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "encrypted": "encrypted",
        "timeouts": "timeouts",
        "value": "value",
    },
)
class AutomationVariableStringConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        encrypted: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["AutomationVariableStringTimeouts"] = None,
        value: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param encrypted: -
        :param timeouts: timeouts block.
        :param value: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AutomationVariableStringTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if encrypted is not None:
            self._values["encrypted"] = encrypted
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def encrypted(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encrypted")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AutomationVariableStringTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableStringConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AutomationVariableStringTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AutomationVariableStringTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AutomationVariableStringTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AvailabilitySet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AvailabilitySet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        managed: typing.Optional[builtins.bool] = None,
        platform_fault_domain_count: typing.Optional[jsii.Number] = None,
        platform_update_domain_count: typing.Optional[jsii.Number] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AvailabilitySetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param managed: -
        :param platform_fault_domain_count: -
        :param platform_update_domain_count: -
        :param proximity_placement_group_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AvailabilitySetConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            managed=managed,
            platform_fault_domain_count=platform_fault_domain_count,
            platform_update_domain_count=platform_update_domain_count,
            proximity_placement_group_id=proximity_placement_group_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(AvailabilitySet, self, [scope, id, config])

    @jsii.member(jsii_name="resetManaged")
    def reset_managed(self) -> None:
        return jsii.invoke(self, "resetManaged", [])

    @jsii.member(jsii_name="resetPlatformFaultDomainCount")
    def reset_platform_fault_domain_count(self) -> None:
        return jsii.invoke(self, "resetPlatformFaultDomainCount", [])

    @jsii.member(jsii_name="resetPlatformUpdateDomainCount")
    def reset_platform_update_domain_count(self) -> None:
        return jsii.invoke(self, "resetPlatformUpdateDomainCount", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedInput")
    def managed_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "managedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCountInput")
    def platform_fault_domain_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "platformFaultDomainCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformUpdateDomainCountInput")
    def platform_update_domain_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "platformUpdateDomainCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["AvailabilitySetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managed")
    def managed(self) -> builtins.bool:
        return jsii.get(self, "managed")

    @managed.setter # type: ignore
    def managed(self, value: builtins.bool) -> None:
        jsii.set(self, "managed", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCount")
    def platform_fault_domain_count(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCount")

    @platform_fault_domain_count.setter # type: ignore
    def platform_fault_domain_count(self, value: jsii.Number) -> None:
        jsii.set(self, "platformFaultDomainCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformUpdateDomainCount")
    def platform_update_domain_count(self) -> jsii.Number:
        return jsii.get(self, "platformUpdateDomainCount")

    @platform_update_domain_count.setter # type: ignore
    def platform_update_domain_count(self, value: jsii.Number) -> None:
        jsii.set(self, "platformUpdateDomainCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "AvailabilitySetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "AvailabilitySetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.AvailabilitySetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "managed": "managed",
        "platform_fault_domain_count": "platformFaultDomainCount",
        "platform_update_domain_count": "platformUpdateDomainCount",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class AvailabilitySetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        managed: typing.Optional[builtins.bool] = None,
        platform_fault_domain_count: typing.Optional[jsii.Number] = None,
        platform_update_domain_count: typing.Optional[jsii.Number] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["AvailabilitySetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param managed: -
        :param platform_fault_domain_count: -
        :param platform_update_domain_count: -
        :param proximity_placement_group_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = AvailabilitySetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if managed is not None:
            self._values["managed"] = managed
        if platform_fault_domain_count is not None:
            self._values["platform_fault_domain_count"] = platform_fault_domain_count
        if platform_update_domain_count is not None:
            self._values["platform_update_domain_count"] = platform_update_domain_count
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def managed(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("managed")
        return result

    @builtins.property
    def platform_fault_domain_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("platform_fault_domain_count")
        return result

    @builtins.property
    def platform_update_domain_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("platform_update_domain_count")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["AvailabilitySetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AvailabilitySetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AvailabilitySetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class AvailabilitySetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AvailabilitySetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class AzurermProvider(
    cdktf.TerraformProvider,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.AzurermProvider",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        features: typing.List["AzurermProviderFeatures"],
        alias: typing.Optional[builtins.str] = None,
        auxiliary_tenant_ids: typing.Optional[typing.List[builtins.str]] = None,
        client_certificate_password: typing.Optional[builtins.str] = None,
        client_certificate_path: typing.Optional[builtins.str] = None,
        client_id: typing.Optional[builtins.str] = None,
        client_secret: typing.Optional[builtins.str] = None,
        disable_correlation_request_id: typing.Optional[builtins.bool] = None,
        disable_terraform_partner_id: typing.Optional[builtins.bool] = None,
        environment: typing.Optional[builtins.str] = None,
        metadata_host: typing.Optional[builtins.str] = None,
        metadata_url: typing.Optional[builtins.str] = None,
        msi_endpoint: typing.Optional[builtins.str] = None,
        partner_id: typing.Optional[builtins.str] = None,
        skip_credentials_validation: typing.Optional[builtins.bool] = None,
        skip_provider_registration: typing.Optional[builtins.bool] = None,
        storage_use_azuread: typing.Optional[builtins.bool] = None,
        subscription_id: typing.Optional[builtins.str] = None,
        tenant_id: typing.Optional[builtins.str] = None,
        use_msi: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param features: features block.
        :param alias: Alias name.
        :param auxiliary_tenant_ids: -
        :param client_certificate_password: The password associated with the Client Certificate. For use when authenticating as a Service Principal using a Client Certificate
        :param client_certificate_path: The path to the Client Certificate associated with the Service Principal for use when authenticating as a Service Principal using a Client Certificate.
        :param client_id: The Client ID which should be used.
        :param client_secret: The Client Secret which should be used. For use When authenticating as a Service Principal using a Client Secret.
        :param disable_correlation_request_id: This will disable the x-ms-correlation-request-id header.
        :param disable_terraform_partner_id: This will disable the Terraform Partner ID which is used if a custom ``partner_id`` isn't specified.
        :param environment: The Cloud Environment which should be used. Possible values are public, usgovernment, german, and china. Defaults to public.
        :param metadata_host: The Hostname which should be used for the Azure Metadata Service.
        :param metadata_url: Deprecated - replaced by ``metadata_host``.
        :param msi_endpoint: The path to a custom endpoint for Managed Service Identity - in most circumstances this should be detected automatically.
        :param partner_id: A GUID/UUID that is registered with Microsoft to facilitate partner resource usage attribution.
        :param skip_credentials_validation: This will cause the AzureRM Provider to skip verifying the credentials being used are valid.
        :param skip_provider_registration: Should the AzureRM Provider skip registering all of the Resource Providers that it supports, if they're not already registered?
        :param storage_use_azuread: Should the AzureRM Provider use AzureAD to access the Storage Data Plane API's?
        :param subscription_id: The Subscription ID which should be used.
        :param tenant_id: The Tenant ID which should be used.
        :param use_msi: Allowed Managed Service Identity be used for Authentication.
        """
        config = AzurermProviderConfig(
            features=features,
            alias=alias,
            auxiliary_tenant_ids=auxiliary_tenant_ids,
            client_certificate_password=client_certificate_password,
            client_certificate_path=client_certificate_path,
            client_id=client_id,
            client_secret=client_secret,
            disable_correlation_request_id=disable_correlation_request_id,
            disable_terraform_partner_id=disable_terraform_partner_id,
            environment=environment,
            metadata_host=metadata_host,
            metadata_url=metadata_url,
            msi_endpoint=msi_endpoint,
            partner_id=partner_id,
            skip_credentials_validation=skip_credentials_validation,
            skip_provider_registration=skip_provider_registration,
            storage_use_azuread=storage_use_azuread,
            subscription_id=subscription_id,
            tenant_id=tenant_id,
            use_msi=use_msi,
        )

        jsii.create(AzurermProvider, self, [scope, id, config])

    @jsii.member(jsii_name="resetAlias")
    def reset_alias(self) -> None:
        return jsii.invoke(self, "resetAlias", [])

    @jsii.member(jsii_name="resetAuxiliaryTenantIds")
    def reset_auxiliary_tenant_ids(self) -> None:
        return jsii.invoke(self, "resetAuxiliaryTenantIds", [])

    @jsii.member(jsii_name="resetClientCertificatePassword")
    def reset_client_certificate_password(self) -> None:
        return jsii.invoke(self, "resetClientCertificatePassword", [])

    @jsii.member(jsii_name="resetClientCertificatePath")
    def reset_client_certificate_path(self) -> None:
        return jsii.invoke(self, "resetClientCertificatePath", [])

    @jsii.member(jsii_name="resetClientId")
    def reset_client_id(self) -> None:
        return jsii.invoke(self, "resetClientId", [])

    @jsii.member(jsii_name="resetClientSecret")
    def reset_client_secret(self) -> None:
        return jsii.invoke(self, "resetClientSecret", [])

    @jsii.member(jsii_name="resetDisableCorrelationRequestId")
    def reset_disable_correlation_request_id(self) -> None:
        return jsii.invoke(self, "resetDisableCorrelationRequestId", [])

    @jsii.member(jsii_name="resetDisableTerraformPartnerId")
    def reset_disable_terraform_partner_id(self) -> None:
        return jsii.invoke(self, "resetDisableTerraformPartnerId", [])

    @jsii.member(jsii_name="resetEnvironment")
    def reset_environment(self) -> None:
        return jsii.invoke(self, "resetEnvironment", [])

    @jsii.member(jsii_name="resetMetadataHost")
    def reset_metadata_host(self) -> None:
        return jsii.invoke(self, "resetMetadataHost", [])

    @jsii.member(jsii_name="resetMetadataUrl")
    def reset_metadata_url(self) -> None:
        return jsii.invoke(self, "resetMetadataUrl", [])

    @jsii.member(jsii_name="resetMsiEndpoint")
    def reset_msi_endpoint(self) -> None:
        return jsii.invoke(self, "resetMsiEndpoint", [])

    @jsii.member(jsii_name="resetPartnerId")
    def reset_partner_id(self) -> None:
        return jsii.invoke(self, "resetPartnerId", [])

    @jsii.member(jsii_name="resetSkipCredentialsValidation")
    def reset_skip_credentials_validation(self) -> None:
        return jsii.invoke(self, "resetSkipCredentialsValidation", [])

    @jsii.member(jsii_name="resetSkipProviderRegistration")
    def reset_skip_provider_registration(self) -> None:
        return jsii.invoke(self, "resetSkipProviderRegistration", [])

    @jsii.member(jsii_name="resetStorageUseAzuread")
    def reset_storage_use_azuread(self) -> None:
        return jsii.invoke(self, "resetStorageUseAzuread", [])

    @jsii.member(jsii_name="resetSubscriptionId")
    def reset_subscription_id(self) -> None:
        return jsii.invoke(self, "resetSubscriptionId", [])

    @jsii.member(jsii_name="resetTenantId")
    def reset_tenant_id(self) -> None:
        return jsii.invoke(self, "resetTenantId", [])

    @jsii.member(jsii_name="resetUseMsi")
    def reset_use_msi(self) -> None:
        return jsii.invoke(self, "resetUseMsi", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="featuresInput")
    def features_input(self) -> typing.List["AzurermProviderFeatures"]:
        return jsii.get(self, "featuresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aliasInput")
    def alias_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "aliasInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="auxiliaryTenantIdsInput")
    def auxiliary_tenant_ids_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "auxiliaryTenantIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificatePasswordInput")
    def client_certificate_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientCertificatePasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificatePathInput")
    def client_certificate_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientCertificatePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableCorrelationRequestIdInput")
    def disable_correlation_request_id_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableCorrelationRequestIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableTerraformPartnerIdInput")
    def disable_terraform_partner_id_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableTerraformPartnerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="environmentInput")
    def environment_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "environmentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataHostInput")
    def metadata_host_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "metadataHostInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataUrlInput")
    def metadata_url_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "metadataUrlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="msiEndpointInput")
    def msi_endpoint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "msiEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partnerIdInput")
    def partner_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "partnerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skipCredentialsValidationInput")
    def skip_credentials_validation_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "skipCredentialsValidationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skipProviderRegistrationInput")
    def skip_provider_registration_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "skipProviderRegistrationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageUseAzureadInput")
    def storage_use_azuread_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "storageUseAzureadInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIdInput")
    def subscription_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "subscriptionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useMsiInput")
    def use_msi_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "useMsiInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="features")
    def features(self) -> typing.List["AzurermProviderFeatures"]:
        return jsii.get(self, "features")

    @features.setter # type: ignore
    def features(self, value: typing.List["AzurermProviderFeatures"]) -> None:
        jsii.set(self, "features", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alias")
    def alias(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "alias")

    @alias.setter # type: ignore
    def alias(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "alias", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="auxiliaryTenantIds")
    def auxiliary_tenant_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "auxiliaryTenantIds")

    @auxiliary_tenant_ids.setter # type: ignore
    def auxiliary_tenant_ids(
        self,
        value: typing.Optional[typing.List[builtins.str]],
    ) -> None:
        jsii.set(self, "auxiliaryTenantIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificatePassword")
    def client_certificate_password(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientCertificatePassword")

    @client_certificate_password.setter # type: ignore
    def client_certificate_password(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "clientCertificatePassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificatePath")
    def client_certificate_path(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientCertificatePath")

    @client_certificate_path.setter # type: ignore
    def client_certificate_path(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "clientCertificatePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableCorrelationRequestId")
    def disable_correlation_request_id(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableCorrelationRequestId")

    @disable_correlation_request_id.setter # type: ignore
    def disable_correlation_request_id(
        self,
        value: typing.Optional[builtins.bool],
    ) -> None:
        jsii.set(self, "disableCorrelationRequestId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableTerraformPartnerId")
    def disable_terraform_partner_id(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableTerraformPartnerId")

    @disable_terraform_partner_id.setter # type: ignore
    def disable_terraform_partner_id(
        self,
        value: typing.Optional[builtins.bool],
    ) -> None:
        jsii.set(self, "disableTerraformPartnerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="environment")
    def environment(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "environment")

    @environment.setter # type: ignore
    def environment(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "environment", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataHost")
    def metadata_host(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "metadataHost")

    @metadata_host.setter # type: ignore
    def metadata_host(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "metadataHost", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataUrl")
    def metadata_url(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "metadataUrl")

    @metadata_url.setter # type: ignore
    def metadata_url(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "metadataUrl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="msiEndpoint")
    def msi_endpoint(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "msiEndpoint")

    @msi_endpoint.setter # type: ignore
    def msi_endpoint(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "msiEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partnerId")
    def partner_id(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "partnerId")

    @partner_id.setter # type: ignore
    def partner_id(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "partnerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skipCredentialsValidation")
    def skip_credentials_validation(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "skipCredentialsValidation")

    @skip_credentials_validation.setter # type: ignore
    def skip_credentials_validation(
        self,
        value: typing.Optional[builtins.bool],
    ) -> None:
        jsii.set(self, "skipCredentialsValidation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skipProviderRegistration")
    def skip_provider_registration(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "skipProviderRegistration")

    @skip_provider_registration.setter # type: ignore
    def skip_provider_registration(self, value: typing.Optional[builtins.bool]) -> None:
        jsii.set(self, "skipProviderRegistration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageUseAzuread")
    def storage_use_azuread(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "storageUseAzuread")

    @storage_use_azuread.setter # type: ignore
    def storage_use_azuread(self, value: typing.Optional[builtins.bool]) -> None:
        jsii.set(self, "storageUseAzuread", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "subscriptionId")

    @subscription_id.setter # type: ignore
    def subscription_id(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "subscriptionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: typing.Optional[builtins.str]) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useMsi")
    def use_msi(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "useMsi")

    @use_msi.setter # type: ignore
    def use_msi(self, value: typing.Optional[builtins.bool]) -> None:
        jsii.set(self, "useMsi", value)


@jsii.data_type(
    jsii_type="azurerm.AzurermProviderConfig",
    jsii_struct_bases=[],
    name_mapping={
        "features": "features",
        "alias": "alias",
        "auxiliary_tenant_ids": "auxiliaryTenantIds",
        "client_certificate_password": "clientCertificatePassword",
        "client_certificate_path": "clientCertificatePath",
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "disable_correlation_request_id": "disableCorrelationRequestId",
        "disable_terraform_partner_id": "disableTerraformPartnerId",
        "environment": "environment",
        "metadata_host": "metadataHost",
        "metadata_url": "metadataUrl",
        "msi_endpoint": "msiEndpoint",
        "partner_id": "partnerId",
        "skip_credentials_validation": "skipCredentialsValidation",
        "skip_provider_registration": "skipProviderRegistration",
        "storage_use_azuread": "storageUseAzuread",
        "subscription_id": "subscriptionId",
        "tenant_id": "tenantId",
        "use_msi": "useMsi",
    },
)
class AzurermProviderConfig:
    def __init__(
        self,
        *,
        features: typing.List["AzurermProviderFeatures"],
        alias: typing.Optional[builtins.str] = None,
        auxiliary_tenant_ids: typing.Optional[typing.List[builtins.str]] = None,
        client_certificate_password: typing.Optional[builtins.str] = None,
        client_certificate_path: typing.Optional[builtins.str] = None,
        client_id: typing.Optional[builtins.str] = None,
        client_secret: typing.Optional[builtins.str] = None,
        disable_correlation_request_id: typing.Optional[builtins.bool] = None,
        disable_terraform_partner_id: typing.Optional[builtins.bool] = None,
        environment: typing.Optional[builtins.str] = None,
        metadata_host: typing.Optional[builtins.str] = None,
        metadata_url: typing.Optional[builtins.str] = None,
        msi_endpoint: typing.Optional[builtins.str] = None,
        partner_id: typing.Optional[builtins.str] = None,
        skip_credentials_validation: typing.Optional[builtins.bool] = None,
        skip_provider_registration: typing.Optional[builtins.bool] = None,
        storage_use_azuread: typing.Optional[builtins.bool] = None,
        subscription_id: typing.Optional[builtins.str] = None,
        tenant_id: typing.Optional[builtins.str] = None,
        use_msi: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param features: features block.
        :param alias: Alias name.
        :param auxiliary_tenant_ids: -
        :param client_certificate_password: The password associated with the Client Certificate. For use when authenticating as a Service Principal using a Client Certificate
        :param client_certificate_path: The path to the Client Certificate associated with the Service Principal for use when authenticating as a Service Principal using a Client Certificate.
        :param client_id: The Client ID which should be used.
        :param client_secret: The Client Secret which should be used. For use When authenticating as a Service Principal using a Client Secret.
        :param disable_correlation_request_id: This will disable the x-ms-correlation-request-id header.
        :param disable_terraform_partner_id: This will disable the Terraform Partner ID which is used if a custom ``partner_id`` isn't specified.
        :param environment: The Cloud Environment which should be used. Possible values are public, usgovernment, german, and china. Defaults to public.
        :param metadata_host: The Hostname which should be used for the Azure Metadata Service.
        :param metadata_url: Deprecated - replaced by ``metadata_host``.
        :param msi_endpoint: The path to a custom endpoint for Managed Service Identity - in most circumstances this should be detected automatically.
        :param partner_id: A GUID/UUID that is registered with Microsoft to facilitate partner resource usage attribution.
        :param skip_credentials_validation: This will cause the AzureRM Provider to skip verifying the credentials being used are valid.
        :param skip_provider_registration: Should the AzureRM Provider skip registering all of the Resource Providers that it supports, if they're not already registered?
        :param storage_use_azuread: Should the AzureRM Provider use AzureAD to access the Storage Data Plane API's?
        :param subscription_id: The Subscription ID which should be used.
        :param tenant_id: The Tenant ID which should be used.
        :param use_msi: Allowed Managed Service Identity be used for Authentication.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "features": features,
        }
        if alias is not None:
            self._values["alias"] = alias
        if auxiliary_tenant_ids is not None:
            self._values["auxiliary_tenant_ids"] = auxiliary_tenant_ids
        if client_certificate_password is not None:
            self._values["client_certificate_password"] = client_certificate_password
        if client_certificate_path is not None:
            self._values["client_certificate_path"] = client_certificate_path
        if client_id is not None:
            self._values["client_id"] = client_id
        if client_secret is not None:
            self._values["client_secret"] = client_secret
        if disable_correlation_request_id is not None:
            self._values["disable_correlation_request_id"] = disable_correlation_request_id
        if disable_terraform_partner_id is not None:
            self._values["disable_terraform_partner_id"] = disable_terraform_partner_id
        if environment is not None:
            self._values["environment"] = environment
        if metadata_host is not None:
            self._values["metadata_host"] = metadata_host
        if metadata_url is not None:
            self._values["metadata_url"] = metadata_url
        if msi_endpoint is not None:
            self._values["msi_endpoint"] = msi_endpoint
        if partner_id is not None:
            self._values["partner_id"] = partner_id
        if skip_credentials_validation is not None:
            self._values["skip_credentials_validation"] = skip_credentials_validation
        if skip_provider_registration is not None:
            self._values["skip_provider_registration"] = skip_provider_registration
        if storage_use_azuread is not None:
            self._values["storage_use_azuread"] = storage_use_azuread
        if subscription_id is not None:
            self._values["subscription_id"] = subscription_id
        if tenant_id is not None:
            self._values["tenant_id"] = tenant_id
        if use_msi is not None:
            self._values["use_msi"] = use_msi

    @builtins.property
    def features(self) -> typing.List["AzurermProviderFeatures"]:
        """features block."""
        result = self._values.get("features")
        assert result is not None, "Required property 'features' is missing"
        return result

    @builtins.property
    def alias(self) -> typing.Optional[builtins.str]:
        """Alias name."""
        result = self._values.get("alias")
        return result

    @builtins.property
    def auxiliary_tenant_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("auxiliary_tenant_ids")
        return result

    @builtins.property
    def client_certificate_password(self) -> typing.Optional[builtins.str]:
        """The password associated with the Client Certificate.

        For use when authenticating as a Service Principal using a Client Certificate
        """
        result = self._values.get("client_certificate_password")
        return result

    @builtins.property
    def client_certificate_path(self) -> typing.Optional[builtins.str]:
        """The path to the Client Certificate associated with the Service Principal for use when authenticating as a Service Principal using a Client Certificate."""
        result = self._values.get("client_certificate_path")
        return result

    @builtins.property
    def client_id(self) -> typing.Optional[builtins.str]:
        """The Client ID which should be used."""
        result = self._values.get("client_id")
        return result

    @builtins.property
    def client_secret(self) -> typing.Optional[builtins.str]:
        """The Client Secret which should be used.

        For use When authenticating as a Service Principal using a Client Secret.
        """
        result = self._values.get("client_secret")
        return result

    @builtins.property
    def disable_correlation_request_id(self) -> typing.Optional[builtins.bool]:
        """This will disable the x-ms-correlation-request-id header."""
        result = self._values.get("disable_correlation_request_id")
        return result

    @builtins.property
    def disable_terraform_partner_id(self) -> typing.Optional[builtins.bool]:
        """This will disable the Terraform Partner ID which is used if a custom ``partner_id`` isn't specified."""
        result = self._values.get("disable_terraform_partner_id")
        return result

    @builtins.property
    def environment(self) -> typing.Optional[builtins.str]:
        """The Cloud Environment which should be used.

        Possible values are public, usgovernment, german, and china. Defaults to public.
        """
        result = self._values.get("environment")
        return result

    @builtins.property
    def metadata_host(self) -> typing.Optional[builtins.str]:
        """The Hostname which should be used for the Azure Metadata Service."""
        result = self._values.get("metadata_host")
        return result

    @builtins.property
    def metadata_url(self) -> typing.Optional[builtins.str]:
        """Deprecated - replaced by ``metadata_host``."""
        result = self._values.get("metadata_url")
        return result

    @builtins.property
    def msi_endpoint(self) -> typing.Optional[builtins.str]:
        """The path to a custom endpoint for Managed Service Identity - in most circumstances this should be detected automatically."""
        result = self._values.get("msi_endpoint")
        return result

    @builtins.property
    def partner_id(self) -> typing.Optional[builtins.str]:
        """A GUID/UUID that is registered with Microsoft to facilitate partner resource usage attribution."""
        result = self._values.get("partner_id")
        return result

    @builtins.property
    def skip_credentials_validation(self) -> typing.Optional[builtins.bool]:
        """This will cause the AzureRM Provider to skip verifying the credentials being used are valid."""
        result = self._values.get("skip_credentials_validation")
        return result

    @builtins.property
    def skip_provider_registration(self) -> typing.Optional[builtins.bool]:
        """Should the AzureRM Provider skip registering all of the Resource Providers that it supports, if they're not already registered?"""
        result = self._values.get("skip_provider_registration")
        return result

    @builtins.property
    def storage_use_azuread(self) -> typing.Optional[builtins.bool]:
        """Should the AzureRM Provider use AzureAD to access the Storage Data Plane API's?"""
        result = self._values.get("storage_use_azuread")
        return result

    @builtins.property
    def subscription_id(self) -> typing.Optional[builtins.str]:
        """The Subscription ID which should be used."""
        result = self._values.get("subscription_id")
        return result

    @builtins.property
    def tenant_id(self) -> typing.Optional[builtins.str]:
        """The Tenant ID which should be used."""
        result = self._values.get("tenant_id")
        return result

    @builtins.property
    def use_msi(self) -> typing.Optional[builtins.bool]:
        """Allowed Managed Service Identity be used for Authentication."""
        result = self._values.get("use_msi")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AzurermProviderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AzurermProviderFeatures",
    jsii_struct_bases=[],
    name_mapping={
        "key_vault": "keyVault",
        "network": "network",
        "template_deployment": "templateDeployment",
        "virtual_machine": "virtualMachine",
        "virtual_machine_scale_set": "virtualMachineScaleSet",
    },
)
class AzurermProviderFeatures:
    def __init__(
        self,
        *,
        key_vault: typing.Optional[typing.List["AzurermProviderFeaturesKeyVault"]] = None,
        network: typing.Optional[typing.List["AzurermProviderFeaturesNetwork"]] = None,
        template_deployment: typing.Optional[typing.List["AzurermProviderFeaturesTemplateDeployment"]] = None,
        virtual_machine: typing.Optional[typing.List["AzurermProviderFeaturesVirtualMachine"]] = None,
        virtual_machine_scale_set: typing.Optional[typing.List["AzurermProviderFeaturesVirtualMachineScaleSet"]] = None,
    ) -> None:
        """
        :param key_vault: key_vault block.
        :param network: network block.
        :param template_deployment: template_deployment block.
        :param virtual_machine: virtual_machine block.
        :param virtual_machine_scale_set: virtual_machine_scale_set block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if key_vault is not None:
            self._values["key_vault"] = key_vault
        if network is not None:
            self._values["network"] = network
        if template_deployment is not None:
            self._values["template_deployment"] = template_deployment
        if virtual_machine is not None:
            self._values["virtual_machine"] = virtual_machine
        if virtual_machine_scale_set is not None:
            self._values["virtual_machine_scale_set"] = virtual_machine_scale_set

    @builtins.property
    def key_vault(
        self,
    ) -> typing.Optional[typing.List["AzurermProviderFeaturesKeyVault"]]:
        """key_vault block."""
        result = self._values.get("key_vault")
        return result

    @builtins.property
    def network(self) -> typing.Optional[typing.List["AzurermProviderFeaturesNetwork"]]:
        """network block."""
        result = self._values.get("network")
        return result

    @builtins.property
    def template_deployment(
        self,
    ) -> typing.Optional[typing.List["AzurermProviderFeaturesTemplateDeployment"]]:
        """template_deployment block."""
        result = self._values.get("template_deployment")
        return result

    @builtins.property
    def virtual_machine(
        self,
    ) -> typing.Optional[typing.List["AzurermProviderFeaturesVirtualMachine"]]:
        """virtual_machine block."""
        result = self._values.get("virtual_machine")
        return result

    @builtins.property
    def virtual_machine_scale_set(
        self,
    ) -> typing.Optional[typing.List["AzurermProviderFeaturesVirtualMachineScaleSet"]]:
        """virtual_machine_scale_set block."""
        result = self._values.get("virtual_machine_scale_set")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AzurermProviderFeatures(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AzurermProviderFeaturesKeyVault",
    jsii_struct_bases=[],
    name_mapping={
        "purge_soft_delete_on_destroy": "purgeSoftDeleteOnDestroy",
        "recover_soft_deleted_key_vaults": "recoverSoftDeletedKeyVaults",
    },
)
class AzurermProviderFeaturesKeyVault:
    def __init__(
        self,
        *,
        purge_soft_delete_on_destroy: typing.Optional[builtins.bool] = None,
        recover_soft_deleted_key_vaults: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param purge_soft_delete_on_destroy: -
        :param recover_soft_deleted_key_vaults: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if purge_soft_delete_on_destroy is not None:
            self._values["purge_soft_delete_on_destroy"] = purge_soft_delete_on_destroy
        if recover_soft_deleted_key_vaults is not None:
            self._values["recover_soft_deleted_key_vaults"] = recover_soft_deleted_key_vaults

    @builtins.property
    def purge_soft_delete_on_destroy(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("purge_soft_delete_on_destroy")
        return result

    @builtins.property
    def recover_soft_deleted_key_vaults(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("recover_soft_deleted_key_vaults")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AzurermProviderFeaturesKeyVault(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AzurermProviderFeaturesNetwork",
    jsii_struct_bases=[],
    name_mapping={"relaxed_locking": "relaxedLocking"},
)
class AzurermProviderFeaturesNetwork:
    def __init__(self, *, relaxed_locking: builtins.bool) -> None:
        """
        :param relaxed_locking: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "relaxed_locking": relaxed_locking,
        }

    @builtins.property
    def relaxed_locking(self) -> builtins.bool:
        result = self._values.get("relaxed_locking")
        assert result is not None, "Required property 'relaxed_locking' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AzurermProviderFeaturesNetwork(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AzurermProviderFeaturesTemplateDeployment",
    jsii_struct_bases=[],
    name_mapping={
        "delete_nested_items_during_deletion": "deleteNestedItemsDuringDeletion",
    },
)
class AzurermProviderFeaturesTemplateDeployment:
    def __init__(self, *, delete_nested_items_during_deletion: builtins.bool) -> None:
        """
        :param delete_nested_items_during_deletion: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "delete_nested_items_during_deletion": delete_nested_items_during_deletion,
        }

    @builtins.property
    def delete_nested_items_during_deletion(self) -> builtins.bool:
        result = self._values.get("delete_nested_items_during_deletion")
        assert result is not None, "Required property 'delete_nested_items_during_deletion' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AzurermProviderFeaturesTemplateDeployment(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AzurermProviderFeaturesVirtualMachine",
    jsii_struct_bases=[],
    name_mapping={
        "delete_os_disk_on_deletion": "deleteOsDiskOnDeletion",
        "graceful_shutdown": "gracefulShutdown",
    },
)
class AzurermProviderFeaturesVirtualMachine:
    def __init__(
        self,
        *,
        delete_os_disk_on_deletion: typing.Optional[builtins.bool] = None,
        graceful_shutdown: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param delete_os_disk_on_deletion: -
        :param graceful_shutdown: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if delete_os_disk_on_deletion is not None:
            self._values["delete_os_disk_on_deletion"] = delete_os_disk_on_deletion
        if graceful_shutdown is not None:
            self._values["graceful_shutdown"] = graceful_shutdown

    @builtins.property
    def delete_os_disk_on_deletion(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("delete_os_disk_on_deletion")
        return result

    @builtins.property
    def graceful_shutdown(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("graceful_shutdown")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AzurermProviderFeaturesVirtualMachine(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.AzurermProviderFeaturesVirtualMachineScaleSet",
    jsii_struct_bases=[],
    name_mapping={"roll_instances_when_required": "rollInstancesWhenRequired"},
)
class AzurermProviderFeaturesVirtualMachineScaleSet:
    def __init__(self, *, roll_instances_when_required: builtins.bool) -> None:
        """
        :param roll_instances_when_required: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "roll_instances_when_required": roll_instances_when_required,
        }

    @builtins.property
    def roll_instances_when_required(self) -> builtins.bool:
        result = self._values.get("roll_instances_when_required")
        assert result is not None, "Required property 'roll_instances_when_required' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "AzurermProviderFeaturesVirtualMachineScaleSet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BackupContainerStorageAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BackupContainerStorageAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_id: builtins.str,
        timeouts: typing.Optional["BackupContainerStorageAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param storage_account_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BackupContainerStorageAccountConfig(
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            storage_account_id=storage_account_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BackupContainerStorageAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["BackupContainerStorageAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BackupContainerStorageAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BackupContainerStorageAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BackupContainerStorageAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "storage_account_id": "storageAccountId",
        "timeouts": "timeouts",
    },
)
class BackupContainerStorageAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_id: builtins.str,
        timeouts: typing.Optional["BackupContainerStorageAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param storage_account_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BackupContainerStorageAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BackupContainerStorageAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupContainerStorageAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupContainerStorageAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BackupContainerStorageAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupContainerStorageAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BackupPolicyFileShare(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BackupPolicyFileShare",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backup: typing.List["BackupPolicyFileShareBackup"],
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        retention_daily: typing.List["BackupPolicyFileShareRetentionDaily"],
        timeouts: typing.Optional["BackupPolicyFileShareTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backup: backup block.
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param retention_daily: retention_daily block.
        :param timeouts: timeouts block.
        :param timezone: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BackupPolicyFileShareConfig(
            backup=backup,
            name=name,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            retention_daily=retention_daily,
            timeouts=timeouts,
            timezone=timezone,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BackupPolicyFileShare, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTimezone")
    def reset_timezone(self) -> None:
        return jsii.invoke(self, "resetTimezone", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupInput")
    def backup_input(self) -> typing.List["BackupPolicyFileShareBackup"]:
        return jsii.get(self, "backupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionDailyInput")
    def retention_daily_input(
        self,
    ) -> typing.List["BackupPolicyFileShareRetentionDaily"]:
        return jsii.get(self, "retentionDailyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BackupPolicyFileShareTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezoneInput")
    def timezone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "timezoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backup")
    def backup(self) -> typing.List["BackupPolicyFileShareBackup"]:
        return jsii.get(self, "backup")

    @backup.setter # type: ignore
    def backup(self, value: typing.List["BackupPolicyFileShareBackup"]) -> None:
        jsii.set(self, "backup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionDaily")
    def retention_daily(self) -> typing.List["BackupPolicyFileShareRetentionDaily"]:
        return jsii.get(self, "retentionDaily")

    @retention_daily.setter # type: ignore
    def retention_daily(
        self,
        value: typing.List["BackupPolicyFileShareRetentionDaily"],
    ) -> None:
        jsii.set(self, "retentionDaily", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BackupPolicyFileShareTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BackupPolicyFileShareTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezone")
    def timezone(self) -> builtins.str:
        return jsii.get(self, "timezone")

    @timezone.setter # type: ignore
    def timezone(self, value: builtins.str) -> None:
        jsii.set(self, "timezone", value)


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyFileShareBackup",
    jsii_struct_bases=[],
    name_mapping={"frequency": "frequency", "time": "time"},
)
class BackupPolicyFileShareBackup:
    def __init__(self, *, frequency: builtins.str, time: builtins.str) -> None:
        """
        :param frequency: -
        :param time: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "frequency": frequency,
            "time": time,
        }

    @builtins.property
    def frequency(self) -> builtins.str:
        result = self._values.get("frequency")
        assert result is not None, "Required property 'frequency' is missing"
        return result

    @builtins.property
    def time(self) -> builtins.str:
        result = self._values.get("time")
        assert result is not None, "Required property 'time' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyFileShareBackup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyFileShareConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backup": "backup",
        "name": "name",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "retention_daily": "retentionDaily",
        "timeouts": "timeouts",
        "timezone": "timezone",
    },
)
class BackupPolicyFileShareConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backup: typing.List[BackupPolicyFileShareBackup],
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        retention_daily: typing.List["BackupPolicyFileShareRetentionDaily"],
        timeouts: typing.Optional["BackupPolicyFileShareTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backup: backup block.
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param retention_daily: retention_daily block.
        :param timeouts: timeouts block.
        :param timezone: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BackupPolicyFileShareTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backup": backup,
            "name": name,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
            "retention_daily": retention_daily,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if timezone is not None:
            self._values["timezone"] = timezone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backup(self) -> typing.List[BackupPolicyFileShareBackup]:
        """backup block."""
        result = self._values.get("backup")
        assert result is not None, "Required property 'backup' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def retention_daily(self) -> typing.List["BackupPolicyFileShareRetentionDaily"]:
        """retention_daily block."""
        result = self._values.get("retention_daily")
        assert result is not None, "Required property 'retention_daily' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BackupPolicyFileShareTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyFileShareConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyFileShareRetentionDaily",
    jsii_struct_bases=[],
    name_mapping={"count": "count"},
)
class BackupPolicyFileShareRetentionDaily:
    def __init__(self, *, count: jsii.Number) -> None:
        """
        :param count: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "count": count,
        }

    @builtins.property
    def count(self) -> jsii.Number:
        result = self._values.get("count")
        assert result is not None, "Required property 'count' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyFileShareRetentionDaily(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyFileShareTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BackupPolicyFileShareTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyFileShareTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BackupPolicyVm(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BackupPolicyVm",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backup: typing.List["BackupPolicyVmBackup"],
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        instant_restore_retention_days: typing.Optional[jsii.Number] = None,
        retention_daily: typing.Optional[typing.List["BackupPolicyVmRetentionDaily"]] = None,
        retention_monthly: typing.Optional[typing.List["BackupPolicyVmRetentionMonthly"]] = None,
        retention_weekly: typing.Optional[typing.List["BackupPolicyVmRetentionWeekly"]] = None,
        retention_yearly: typing.Optional[typing.List["BackupPolicyVmRetentionYearly"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BackupPolicyVmTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backup: backup block.
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param instant_restore_retention_days: -
        :param retention_daily: retention_daily block.
        :param retention_monthly: retention_monthly block.
        :param retention_weekly: retention_weekly block.
        :param retention_yearly: retention_yearly block.
        :param tags: -
        :param timeouts: timeouts block.
        :param timezone: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BackupPolicyVmConfig(
            backup=backup,
            name=name,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            instant_restore_retention_days=instant_restore_retention_days,
            retention_daily=retention_daily,
            retention_monthly=retention_monthly,
            retention_weekly=retention_weekly,
            retention_yearly=retention_yearly,
            tags=tags,
            timeouts=timeouts,
            timezone=timezone,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BackupPolicyVm, self, [scope, id, config])

    @jsii.member(jsii_name="resetInstantRestoreRetentionDays")
    def reset_instant_restore_retention_days(self) -> None:
        return jsii.invoke(self, "resetInstantRestoreRetentionDays", [])

    @jsii.member(jsii_name="resetRetentionDaily")
    def reset_retention_daily(self) -> None:
        return jsii.invoke(self, "resetRetentionDaily", [])

    @jsii.member(jsii_name="resetRetentionMonthly")
    def reset_retention_monthly(self) -> None:
        return jsii.invoke(self, "resetRetentionMonthly", [])

    @jsii.member(jsii_name="resetRetentionWeekly")
    def reset_retention_weekly(self) -> None:
        return jsii.invoke(self, "resetRetentionWeekly", [])

    @jsii.member(jsii_name="resetRetentionYearly")
    def reset_retention_yearly(self) -> None:
        return jsii.invoke(self, "resetRetentionYearly", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTimezone")
    def reset_timezone(self) -> None:
        return jsii.invoke(self, "resetTimezone", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupInput")
    def backup_input(self) -> typing.List["BackupPolicyVmBackup"]:
        return jsii.get(self, "backupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instantRestoreRetentionDaysInput")
    def instant_restore_retention_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "instantRestoreRetentionDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionDailyInput")
    def retention_daily_input(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionDaily"]]:
        return jsii.get(self, "retentionDailyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionMonthlyInput")
    def retention_monthly_input(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionMonthly"]]:
        return jsii.get(self, "retentionMonthlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionWeeklyInput")
    def retention_weekly_input(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionWeekly"]]:
        return jsii.get(self, "retentionWeeklyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionYearlyInput")
    def retention_yearly_input(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionYearly"]]:
        return jsii.get(self, "retentionYearlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BackupPolicyVmTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezoneInput")
    def timezone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "timezoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backup")
    def backup(self) -> typing.List["BackupPolicyVmBackup"]:
        return jsii.get(self, "backup")

    @backup.setter # type: ignore
    def backup(self, value: typing.List["BackupPolicyVmBackup"]) -> None:
        jsii.set(self, "backup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instantRestoreRetentionDays")
    def instant_restore_retention_days(self) -> jsii.Number:
        return jsii.get(self, "instantRestoreRetentionDays")

    @instant_restore_retention_days.setter # type: ignore
    def instant_restore_retention_days(self, value: jsii.Number) -> None:
        jsii.set(self, "instantRestoreRetentionDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionDaily")
    def retention_daily(self) -> typing.List["BackupPolicyVmRetentionDaily"]:
        return jsii.get(self, "retentionDaily")

    @retention_daily.setter # type: ignore
    def retention_daily(
        self,
        value: typing.List["BackupPolicyVmRetentionDaily"],
    ) -> None:
        jsii.set(self, "retentionDaily", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionMonthly")
    def retention_monthly(self) -> typing.List["BackupPolicyVmRetentionMonthly"]:
        return jsii.get(self, "retentionMonthly")

    @retention_monthly.setter # type: ignore
    def retention_monthly(
        self,
        value: typing.List["BackupPolicyVmRetentionMonthly"],
    ) -> None:
        jsii.set(self, "retentionMonthly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionWeekly")
    def retention_weekly(self) -> typing.List["BackupPolicyVmRetentionWeekly"]:
        return jsii.get(self, "retentionWeekly")

    @retention_weekly.setter # type: ignore
    def retention_weekly(
        self,
        value: typing.List["BackupPolicyVmRetentionWeekly"],
    ) -> None:
        jsii.set(self, "retentionWeekly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionYearly")
    def retention_yearly(self) -> typing.List["BackupPolicyVmRetentionYearly"]:
        return jsii.get(self, "retentionYearly")

    @retention_yearly.setter # type: ignore
    def retention_yearly(
        self,
        value: typing.List["BackupPolicyVmRetentionYearly"],
    ) -> None:
        jsii.set(self, "retentionYearly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BackupPolicyVmTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BackupPolicyVmTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezone")
    def timezone(self) -> builtins.str:
        return jsii.get(self, "timezone")

    @timezone.setter # type: ignore
    def timezone(self, value: builtins.str) -> None:
        jsii.set(self, "timezone", value)


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyVmBackup",
    jsii_struct_bases=[],
    name_mapping={"frequency": "frequency", "time": "time", "weekdays": "weekdays"},
)
class BackupPolicyVmBackup:
    def __init__(
        self,
        *,
        frequency: builtins.str,
        time: builtins.str,
        weekdays: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param frequency: -
        :param time: -
        :param weekdays: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "frequency": frequency,
            "time": time,
        }
        if weekdays is not None:
            self._values["weekdays"] = weekdays

    @builtins.property
    def frequency(self) -> builtins.str:
        result = self._values.get("frequency")
        assert result is not None, "Required property 'frequency' is missing"
        return result

    @builtins.property
    def time(self) -> builtins.str:
        result = self._values.get("time")
        assert result is not None, "Required property 'time' is missing"
        return result

    @builtins.property
    def weekdays(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("weekdays")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyVmBackup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyVmConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backup": "backup",
        "name": "name",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "instant_restore_retention_days": "instantRestoreRetentionDays",
        "retention_daily": "retentionDaily",
        "retention_monthly": "retentionMonthly",
        "retention_weekly": "retentionWeekly",
        "retention_yearly": "retentionYearly",
        "tags": "tags",
        "timeouts": "timeouts",
        "timezone": "timezone",
    },
)
class BackupPolicyVmConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backup: typing.List[BackupPolicyVmBackup],
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        instant_restore_retention_days: typing.Optional[jsii.Number] = None,
        retention_daily: typing.Optional[typing.List["BackupPolicyVmRetentionDaily"]] = None,
        retention_monthly: typing.Optional[typing.List["BackupPolicyVmRetentionMonthly"]] = None,
        retention_weekly: typing.Optional[typing.List["BackupPolicyVmRetentionWeekly"]] = None,
        retention_yearly: typing.Optional[typing.List["BackupPolicyVmRetentionYearly"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BackupPolicyVmTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backup: backup block.
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param instant_restore_retention_days: -
        :param retention_daily: retention_daily block.
        :param retention_monthly: retention_monthly block.
        :param retention_weekly: retention_weekly block.
        :param retention_yearly: retention_yearly block.
        :param tags: -
        :param timeouts: timeouts block.
        :param timezone: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BackupPolicyVmTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backup": backup,
            "name": name,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if instant_restore_retention_days is not None:
            self._values["instant_restore_retention_days"] = instant_restore_retention_days
        if retention_daily is not None:
            self._values["retention_daily"] = retention_daily
        if retention_monthly is not None:
            self._values["retention_monthly"] = retention_monthly
        if retention_weekly is not None:
            self._values["retention_weekly"] = retention_weekly
        if retention_yearly is not None:
            self._values["retention_yearly"] = retention_yearly
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if timezone is not None:
            self._values["timezone"] = timezone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backup(self) -> typing.List[BackupPolicyVmBackup]:
        """backup block."""
        result = self._values.get("backup")
        assert result is not None, "Required property 'backup' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def instant_restore_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("instant_restore_retention_days")
        return result

    @builtins.property
    def retention_daily(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionDaily"]]:
        """retention_daily block."""
        result = self._values.get("retention_daily")
        return result

    @builtins.property
    def retention_monthly(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionMonthly"]]:
        """retention_monthly block."""
        result = self._values.get("retention_monthly")
        return result

    @builtins.property
    def retention_weekly(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionWeekly"]]:
        """retention_weekly block."""
        result = self._values.get("retention_weekly")
        return result

    @builtins.property
    def retention_yearly(
        self,
    ) -> typing.Optional[typing.List["BackupPolicyVmRetentionYearly"]]:
        """retention_yearly block."""
        result = self._values.get("retention_yearly")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BackupPolicyVmTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyVmConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyVmRetentionDaily",
    jsii_struct_bases=[],
    name_mapping={"count": "count"},
)
class BackupPolicyVmRetentionDaily:
    def __init__(self, *, count: jsii.Number) -> None:
        """
        :param count: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "count": count,
        }

    @builtins.property
    def count(self) -> jsii.Number:
        result = self._values.get("count")
        assert result is not None, "Required property 'count' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyVmRetentionDaily(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyVmRetentionMonthly",
    jsii_struct_bases=[],
    name_mapping={"count": "count", "weekdays": "weekdays", "weeks": "weeks"},
)
class BackupPolicyVmRetentionMonthly:
    def __init__(
        self,
        *,
        count: jsii.Number,
        weekdays: typing.List[builtins.str],
        weeks: typing.List[builtins.str],
    ) -> None:
        """
        :param count: -
        :param weekdays: -
        :param weeks: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "count": count,
            "weekdays": weekdays,
            "weeks": weeks,
        }

    @builtins.property
    def count(self) -> jsii.Number:
        result = self._values.get("count")
        assert result is not None, "Required property 'count' is missing"
        return result

    @builtins.property
    def weekdays(self) -> typing.List[builtins.str]:
        result = self._values.get("weekdays")
        assert result is not None, "Required property 'weekdays' is missing"
        return result

    @builtins.property
    def weeks(self) -> typing.List[builtins.str]:
        result = self._values.get("weeks")
        assert result is not None, "Required property 'weeks' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyVmRetentionMonthly(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyVmRetentionWeekly",
    jsii_struct_bases=[],
    name_mapping={"count": "count", "weekdays": "weekdays"},
)
class BackupPolicyVmRetentionWeekly:
    def __init__(
        self,
        *,
        count: jsii.Number,
        weekdays: typing.List[builtins.str],
    ) -> None:
        """
        :param count: -
        :param weekdays: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "count": count,
            "weekdays": weekdays,
        }

    @builtins.property
    def count(self) -> jsii.Number:
        result = self._values.get("count")
        assert result is not None, "Required property 'count' is missing"
        return result

    @builtins.property
    def weekdays(self) -> typing.List[builtins.str]:
        result = self._values.get("weekdays")
        assert result is not None, "Required property 'weekdays' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyVmRetentionWeekly(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyVmRetentionYearly",
    jsii_struct_bases=[],
    name_mapping={
        "count": "count",
        "months": "months",
        "weekdays": "weekdays",
        "weeks": "weeks",
    },
)
class BackupPolicyVmRetentionYearly:
    def __init__(
        self,
        *,
        count: jsii.Number,
        months: typing.List[builtins.str],
        weekdays: typing.List[builtins.str],
        weeks: typing.List[builtins.str],
    ) -> None:
        """
        :param count: -
        :param months: -
        :param weekdays: -
        :param weeks: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "count": count,
            "months": months,
            "weekdays": weekdays,
            "weeks": weeks,
        }

    @builtins.property
    def count(self) -> jsii.Number:
        result = self._values.get("count")
        assert result is not None, "Required property 'count' is missing"
        return result

    @builtins.property
    def months(self) -> typing.List[builtins.str]:
        result = self._values.get("months")
        assert result is not None, "Required property 'months' is missing"
        return result

    @builtins.property
    def weekdays(self) -> typing.List[builtins.str]:
        result = self._values.get("weekdays")
        assert result is not None, "Required property 'weekdays' is missing"
        return result

    @builtins.property
    def weeks(self) -> typing.List[builtins.str]:
        result = self._values.get("weeks")
        assert result is not None, "Required property 'weeks' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyVmRetentionYearly(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupPolicyVmTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BackupPolicyVmTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupPolicyVmTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BackupProtectedFileShare(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BackupProtectedFileShare",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backup_policy_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_file_share_name: builtins.str,
        source_storage_account_id: builtins.str,
        timeouts: typing.Optional["BackupProtectedFileShareTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backup_policy_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_file_share_name: -
        :param source_storage_account_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BackupProtectedFileShareConfig(
            backup_policy_id=backup_policy_id,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            source_file_share_name=source_file_share_name,
            source_storage_account_id=source_storage_account_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BackupProtectedFileShare, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupPolicyIdInput")
    def backup_policy_id_input(self) -> builtins.str:
        return jsii.get(self, "backupPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceFileShareNameInput")
    def source_file_share_name_input(self) -> builtins.str:
        return jsii.get(self, "sourceFileShareNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceStorageAccountIdInput")
    def source_storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "sourceStorageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BackupProtectedFileShareTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupPolicyId")
    def backup_policy_id(self) -> builtins.str:
        return jsii.get(self, "backupPolicyId")

    @backup_policy_id.setter # type: ignore
    def backup_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "backupPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceFileShareName")
    def source_file_share_name(self) -> builtins.str:
        return jsii.get(self, "sourceFileShareName")

    @source_file_share_name.setter # type: ignore
    def source_file_share_name(self, value: builtins.str) -> None:
        jsii.set(self, "sourceFileShareName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceStorageAccountId")
    def source_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "sourceStorageAccountId")

    @source_storage_account_id.setter # type: ignore
    def source_storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceStorageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BackupProtectedFileShareTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BackupProtectedFileShareTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BackupProtectedFileShareConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backup_policy_id": "backupPolicyId",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "source_file_share_name": "sourceFileShareName",
        "source_storage_account_id": "sourceStorageAccountId",
        "timeouts": "timeouts",
    },
)
class BackupProtectedFileShareConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backup_policy_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_file_share_name: builtins.str,
        source_storage_account_id: builtins.str,
        timeouts: typing.Optional["BackupProtectedFileShareTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backup_policy_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_file_share_name: -
        :param source_storage_account_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BackupProtectedFileShareTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backup_policy_id": backup_policy_id,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
            "source_file_share_name": source_file_share_name,
            "source_storage_account_id": source_storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backup_policy_id(self) -> builtins.str:
        result = self._values.get("backup_policy_id")
        assert result is not None, "Required property 'backup_policy_id' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def source_file_share_name(self) -> builtins.str:
        result = self._values.get("source_file_share_name")
        assert result is not None, "Required property 'source_file_share_name' is missing"
        return result

    @builtins.property
    def source_storage_account_id(self) -> builtins.str:
        result = self._values.get("source_storage_account_id")
        assert result is not None, "Required property 'source_storage_account_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BackupProtectedFileShareTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupProtectedFileShareConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupProtectedFileShareTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BackupProtectedFileShareTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupProtectedFileShareTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BackupProtectedVm(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BackupProtectedVm",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backup_policy_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_vm_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BackupProtectedVmTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backup_policy_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_vm_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BackupProtectedVmConfig(
            backup_policy_id=backup_policy_id,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            source_vm_id=source_vm_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BackupProtectedVm, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupPolicyIdInput")
    def backup_policy_id_input(self) -> builtins.str:
        return jsii.get(self, "backupPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVmIdInput")
    def source_vm_id_input(self) -> builtins.str:
        return jsii.get(self, "sourceVmIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BackupProtectedVmTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupPolicyId")
    def backup_policy_id(self) -> builtins.str:
        return jsii.get(self, "backupPolicyId")

    @backup_policy_id.setter # type: ignore
    def backup_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "backupPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVmId")
    def source_vm_id(self) -> builtins.str:
        return jsii.get(self, "sourceVmId")

    @source_vm_id.setter # type: ignore
    def source_vm_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceVmId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BackupProtectedVmTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BackupProtectedVmTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BackupProtectedVmConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backup_policy_id": "backupPolicyId",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "source_vm_id": "sourceVmId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class BackupProtectedVmConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backup_policy_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_vm_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BackupProtectedVmTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backup_policy_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_vm_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BackupProtectedVmTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backup_policy_id": backup_policy_id,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
            "source_vm_id": source_vm_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backup_policy_id(self) -> builtins.str:
        result = self._values.get("backup_policy_id")
        assert result is not None, "Required property 'backup_policy_id' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def source_vm_id(self) -> builtins.str:
        result = self._values.get("source_vm_id")
        assert result is not None, "Required property 'source_vm_id' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BackupProtectedVmTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupProtectedVmConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BackupProtectedVmTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BackupProtectedVmTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BackupProtectedVmTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BastionHost(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BastionHost",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        ip_configuration: typing.Optional[typing.List["BastionHostIpConfiguration"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BastionHostTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param ip_configuration: ip_configuration block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BastionHostConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            ip_configuration=ip_configuration,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BastionHost, self, [scope, id, config])

    @jsii.member(jsii_name="resetIpConfiguration")
    def reset_ip_configuration(self) -> None:
        return jsii.invoke(self, "resetIpConfiguration", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsName")
    def dns_name(self) -> builtins.str:
        return jsii.get(self, "dnsName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationInput")
    def ip_configuration_input(
        self,
    ) -> typing.Optional[typing.List["BastionHostIpConfiguration"]]:
        return jsii.get(self, "ipConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BastionHostTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(self) -> typing.List["BastionHostIpConfiguration"]:
        return jsii.get(self, "ipConfiguration")

    @ip_configuration.setter # type: ignore
    def ip_configuration(
        self,
        value: typing.List["BastionHostIpConfiguration"],
    ) -> None:
        jsii.set(self, "ipConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BastionHostTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BastionHostTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BastionHostConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "ip_configuration": "ipConfiguration",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class BastionHostConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        ip_configuration: typing.Optional[typing.List["BastionHostIpConfiguration"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BastionHostTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param ip_configuration: ip_configuration block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BastionHostTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if ip_configuration is not None:
            self._values["ip_configuration"] = ip_configuration
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ip_configuration(
        self,
    ) -> typing.Optional[typing.List["BastionHostIpConfiguration"]]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BastionHostTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BastionHostConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BastionHostIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "public_ip_address_id": "publicIpAddressId",
        "subnet_id": "subnetId",
    },
)
class BastionHostIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        public_ip_address_id: builtins.str,
        subnet_id: builtins.str,
    ) -> None:
        """
        :param name: -
        :param public_ip_address_id: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "public_ip_address_id": public_ip_address_id,
            "subnet_id": subnet_id,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def public_ip_address_id(self) -> builtins.str:
        result = self._values.get("public_ip_address_id")
        assert result is not None, "Required property 'public_ip_address_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BastionHostIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BastionHostTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BastionHostTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BastionHostTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BatchAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BatchAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        key_vault_reference: typing.Optional[typing.List["BatchAccountKeyVaultReference"]] = None,
        pool_allocation_mode: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BatchAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param key_vault_reference: key_vault_reference block.
        :param pool_allocation_mode: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BatchAccountConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            key_vault_reference=key_vault_reference,
            pool_allocation_mode=pool_allocation_mode,
            storage_account_id=storage_account_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BatchAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetKeyVaultReference")
    def reset_key_vault_reference(self) -> None:
        return jsii.invoke(self, "resetKeyVaultReference", [])

    @jsii.member(jsii_name="resetPoolAllocationMode")
    def reset_pool_allocation_mode(self) -> None:
        return jsii.invoke(self, "resetPoolAllocationMode", [])

    @jsii.member(jsii_name="resetStorageAccountId")
    def reset_storage_account_id(self) -> None:
        return jsii.invoke(self, "resetStorageAccountId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountEndpoint")
    def account_endpoint(self) -> builtins.str:
        return jsii.get(self, "accountEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultReferenceInput")
    def key_vault_reference_input(
        self,
    ) -> typing.Optional[typing.List["BatchAccountKeyVaultReference"]]:
        return jsii.get(self, "keyVaultReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolAllocationModeInput")
    def pool_allocation_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "poolAllocationModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BatchAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultReference")
    def key_vault_reference(self) -> typing.List["BatchAccountKeyVaultReference"]:
        return jsii.get(self, "keyVaultReference")

    @key_vault_reference.setter # type: ignore
    def key_vault_reference(
        self,
        value: typing.List["BatchAccountKeyVaultReference"],
    ) -> None:
        jsii.set(self, "keyVaultReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolAllocationMode")
    def pool_allocation_mode(self) -> builtins.str:
        return jsii.get(self, "poolAllocationMode")

    @pool_allocation_mode.setter # type: ignore
    def pool_allocation_mode(self, value: builtins.str) -> None:
        jsii.set(self, "poolAllocationMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BatchAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BatchAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BatchAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "key_vault_reference": "keyVaultReference",
        "pool_allocation_mode": "poolAllocationMode",
        "storage_account_id": "storageAccountId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class BatchAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        key_vault_reference: typing.Optional[typing.List["BatchAccountKeyVaultReference"]] = None,
        pool_allocation_mode: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BatchAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param key_vault_reference: key_vault_reference block.
        :param pool_allocation_mode: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BatchAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if key_vault_reference is not None:
            self._values["key_vault_reference"] = key_vault_reference
        if pool_allocation_mode is not None:
            self._values["pool_allocation_mode"] = pool_allocation_mode
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def key_vault_reference(
        self,
    ) -> typing.Optional[typing.List["BatchAccountKeyVaultReference"]]:
        """key_vault_reference block."""
        result = self._values.get("key_vault_reference")
        return result

    @builtins.property
    def pool_allocation_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("pool_allocation_mode")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BatchAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchAccountKeyVaultReference",
    jsii_struct_bases=[],
    name_mapping={"id": "id", "url": "url"},
)
class BatchAccountKeyVaultReference:
    def __init__(self, *, id: builtins.str, url: builtins.str) -> None:
        """
        :param id: -
        :param url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
            "url": url,
        }

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchAccountKeyVaultReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BatchAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BatchApplication(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BatchApplication",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        allow_updates: typing.Optional[builtins.bool] = None,
        default_version: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BatchApplicationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param allow_updates: -
        :param default_version: -
        :param display_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BatchApplicationConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            allow_updates=allow_updates,
            default_version=default_version,
            display_name=display_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BatchApplication, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowUpdates")
    def reset_allow_updates(self) -> None:
        return jsii.invoke(self, "resetAllowUpdates", [])

    @jsii.member(jsii_name="resetDefaultVersion")
    def reset_default_version(self) -> None:
        return jsii.invoke(self, "resetDefaultVersion", [])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowUpdatesInput")
    def allow_updates_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowUpdatesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultVersionInput")
    def default_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BatchApplicationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowUpdates")
    def allow_updates(self) -> builtins.bool:
        return jsii.get(self, "allowUpdates")

    @allow_updates.setter # type: ignore
    def allow_updates(self, value: builtins.bool) -> None:
        jsii.set(self, "allowUpdates", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultVersion")
    def default_version(self) -> builtins.str:
        return jsii.get(self, "defaultVersion")

    @default_version.setter # type: ignore
    def default_version(self, value: builtins.str) -> None:
        jsii.set(self, "defaultVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BatchApplicationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BatchApplicationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BatchApplicationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "allow_updates": "allowUpdates",
        "default_version": "defaultVersion",
        "display_name": "displayName",
        "timeouts": "timeouts",
    },
)
class BatchApplicationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        allow_updates: typing.Optional[builtins.bool] = None,
        default_version: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BatchApplicationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param allow_updates: -
        :param default_version: -
        :param display_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BatchApplicationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allow_updates is not None:
            self._values["allow_updates"] = allow_updates
        if default_version is not None:
            self._values["default_version"] = default_version
        if display_name is not None:
            self._values["display_name"] = display_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def allow_updates(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_updates")
        return result

    @builtins.property
    def default_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_version")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BatchApplicationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchApplicationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchApplicationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BatchApplicationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchApplicationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BatchCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BatchCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        certificate: builtins.str,
        format: builtins.str,
        resource_group_name: builtins.str,
        thumbprint: builtins.str,
        thumbprint_algorithm: builtins.str,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BatchCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param certificate: -
        :param format: -
        :param resource_group_name: -
        :param thumbprint: -
        :param thumbprint_algorithm: -
        :param password: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BatchCertificateConfig(
            account_name=account_name,
            certificate=certificate,
            format=format,
            resource_group_name=resource_group_name,
            thumbprint=thumbprint,
            thumbprint_algorithm=thumbprint_algorithm,
            password=password,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BatchCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateInput")
    def certificate_input(self) -> builtins.str:
        return jsii.get(self, "certificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="formatInput")
    def format_input(self) -> builtins.str:
        return jsii.get(self, "formatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicData")
    def public_data(self) -> builtins.str:
        return jsii.get(self, "publicData")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprintAlgorithmInput")
    def thumbprint_algorithm_input(self) -> builtins.str:
        return jsii.get(self, "thumbprintAlgorithmInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprintInput")
    def thumbprint_input(self) -> builtins.str:
        return jsii.get(self, "thumbprintInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BatchCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> builtins.str:
        return jsii.get(self, "certificate")

    @certificate.setter # type: ignore
    def certificate(self, value: builtins.str) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="format")
    def format(self) -> builtins.str:
        return jsii.get(self, "format")

    @format.setter # type: ignore
    def format(self, value: builtins.str) -> None:
        jsii.set(self, "format", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @thumbprint.setter # type: ignore
    def thumbprint(self, value: builtins.str) -> None:
        jsii.set(self, "thumbprint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprintAlgorithm")
    def thumbprint_algorithm(self) -> builtins.str:
        return jsii.get(self, "thumbprintAlgorithm")

    @thumbprint_algorithm.setter # type: ignore
    def thumbprint_algorithm(self, value: builtins.str) -> None:
        jsii.set(self, "thumbprintAlgorithm", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BatchCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BatchCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BatchCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "certificate": "certificate",
        "format": "format",
        "resource_group_name": "resourceGroupName",
        "thumbprint": "thumbprint",
        "thumbprint_algorithm": "thumbprintAlgorithm",
        "password": "password",
        "timeouts": "timeouts",
    },
)
class BatchCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        certificate: builtins.str,
        format: builtins.str,
        resource_group_name: builtins.str,
        thumbprint: builtins.str,
        thumbprint_algorithm: builtins.str,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BatchCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param certificate: -
        :param format: -
        :param resource_group_name: -
        :param thumbprint: -
        :param thumbprint_algorithm: -
        :param password: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BatchCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "certificate": certificate,
            "format": format,
            "resource_group_name": resource_group_name,
            "thumbprint": thumbprint,
            "thumbprint_algorithm": thumbprint_algorithm,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if password is not None:
            self._values["password"] = password
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def certificate(self) -> builtins.str:
        result = self._values.get("certificate")
        assert result is not None, "Required property 'certificate' is missing"
        return result

    @builtins.property
    def format(self) -> builtins.str:
        result = self._values.get("format")
        assert result is not None, "Required property 'format' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    @builtins.property
    def thumbprint_algorithm(self) -> builtins.str:
        result = self._values.get("thumbprint_algorithm")
        assert result is not None, "Required property 'thumbprint_algorithm' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BatchCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BatchCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BatchPool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BatchPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        node_agent_sku_id: builtins.str,
        resource_group_name: builtins.str,
        storage_image_reference: typing.List["BatchPoolStorageImageReference"],
        vm_size: builtins.str,
        auto_scale: typing.Optional[typing.List["BatchPoolAutoScale"]] = None,
        certificate: typing.Optional[typing.List["BatchPoolCertificate"]] = None,
        container_configuration: typing.Optional[typing.List["BatchPoolContainerConfiguration"]] = None,
        display_name: typing.Optional[builtins.str] = None,
        fixed_scale: typing.Optional[typing.List["BatchPoolFixedScale"]] = None,
        max_tasks_per_node: typing.Optional[jsii.Number] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        network_configuration: typing.Optional[typing.List["BatchPoolNetworkConfiguration"]] = None,
        start_task: typing.Optional[typing.List["BatchPoolStartTask"]] = None,
        stop_pending_resize_operation: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["BatchPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param node_agent_sku_id: -
        :param resource_group_name: -
        :param storage_image_reference: storage_image_reference block.
        :param vm_size: -
        :param auto_scale: auto_scale block.
        :param certificate: certificate block.
        :param container_configuration: container_configuration block.
        :param display_name: -
        :param fixed_scale: fixed_scale block.
        :param max_tasks_per_node: -
        :param metadata: -
        :param network_configuration: network_configuration block.
        :param start_task: start_task block.
        :param stop_pending_resize_operation: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BatchPoolConfig(
            account_name=account_name,
            name=name,
            node_agent_sku_id=node_agent_sku_id,
            resource_group_name=resource_group_name,
            storage_image_reference=storage_image_reference,
            vm_size=vm_size,
            auto_scale=auto_scale,
            certificate=certificate,
            container_configuration=container_configuration,
            display_name=display_name,
            fixed_scale=fixed_scale,
            max_tasks_per_node=max_tasks_per_node,
            metadata=metadata,
            network_configuration=network_configuration,
            start_task=start_task,
            stop_pending_resize_operation=stop_pending_resize_operation,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BatchPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoScale")
    def reset_auto_scale(self) -> None:
        return jsii.invoke(self, "resetAutoScale", [])

    @jsii.member(jsii_name="resetCertificate")
    def reset_certificate(self) -> None:
        return jsii.invoke(self, "resetCertificate", [])

    @jsii.member(jsii_name="resetContainerConfiguration")
    def reset_container_configuration(self) -> None:
        return jsii.invoke(self, "resetContainerConfiguration", [])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetFixedScale")
    def reset_fixed_scale(self) -> None:
        return jsii.invoke(self, "resetFixedScale", [])

    @jsii.member(jsii_name="resetMaxTasksPerNode")
    def reset_max_tasks_per_node(self) -> None:
        return jsii.invoke(self, "resetMaxTasksPerNode", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetNetworkConfiguration")
    def reset_network_configuration(self) -> None:
        return jsii.invoke(self, "resetNetworkConfiguration", [])

    @jsii.member(jsii_name="resetStartTask")
    def reset_start_task(self) -> None:
        return jsii.invoke(self, "resetStartTask", [])

    @jsii.member(jsii_name="resetStopPendingResizeOperation")
    def reset_stop_pending_resize_operation(self) -> None:
        return jsii.invoke(self, "resetStopPendingResizeOperation", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeAgentSkuIdInput")
    def node_agent_sku_id_input(self) -> builtins.str:
        return jsii.get(self, "nodeAgentSkuIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageImageReferenceInput")
    def storage_image_reference_input(
        self,
    ) -> typing.List["BatchPoolStorageImageReference"]:
        return jsii.get(self, "storageImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSizeInput")
    def vm_size_input(self) -> builtins.str:
        return jsii.get(self, "vmSizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoScaleInput")
    def auto_scale_input(self) -> typing.Optional[typing.List["BatchPoolAutoScale"]]:
        return jsii.get(self, "autoScaleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateInput")
    def certificate_input(self) -> typing.Optional[typing.List["BatchPoolCertificate"]]:
        return jsii.get(self, "certificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerConfigurationInput")
    def container_configuration_input(
        self,
    ) -> typing.Optional[typing.List["BatchPoolContainerConfiguration"]]:
        return jsii.get(self, "containerConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fixedScaleInput")
    def fixed_scale_input(self) -> typing.Optional[typing.List["BatchPoolFixedScale"]]:
        return jsii.get(self, "fixedScaleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxTasksPerNodeInput")
    def max_tasks_per_node_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxTasksPerNodeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkConfigurationInput")
    def network_configuration_input(
        self,
    ) -> typing.Optional[typing.List["BatchPoolNetworkConfiguration"]]:
        return jsii.get(self, "networkConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTaskInput")
    def start_task_input(self) -> typing.Optional[typing.List["BatchPoolStartTask"]]:
        return jsii.get(self, "startTaskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="stopPendingResizeOperationInput")
    def stop_pending_resize_operation_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "stopPendingResizeOperationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BatchPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoScale")
    def auto_scale(self) -> typing.List["BatchPoolAutoScale"]:
        return jsii.get(self, "autoScale")

    @auto_scale.setter # type: ignore
    def auto_scale(self, value: typing.List["BatchPoolAutoScale"]) -> None:
        jsii.set(self, "autoScale", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> typing.List["BatchPoolCertificate"]:
        return jsii.get(self, "certificate")

    @certificate.setter # type: ignore
    def certificate(self, value: typing.List["BatchPoolCertificate"]) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerConfiguration")
    def container_configuration(self) -> typing.List["BatchPoolContainerConfiguration"]:
        return jsii.get(self, "containerConfiguration")

    @container_configuration.setter # type: ignore
    def container_configuration(
        self,
        value: typing.List["BatchPoolContainerConfiguration"],
    ) -> None:
        jsii.set(self, "containerConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fixedScale")
    def fixed_scale(self) -> typing.List["BatchPoolFixedScale"]:
        return jsii.get(self, "fixedScale")

    @fixed_scale.setter # type: ignore
    def fixed_scale(self, value: typing.List["BatchPoolFixedScale"]) -> None:
        jsii.set(self, "fixedScale", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxTasksPerNode")
    def max_tasks_per_node(self) -> jsii.Number:
        return jsii.get(self, "maxTasksPerNode")

    @max_tasks_per_node.setter # type: ignore
    def max_tasks_per_node(self, value: jsii.Number) -> None:
        jsii.set(self, "maxTasksPerNode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkConfiguration")
    def network_configuration(self) -> typing.List["BatchPoolNetworkConfiguration"]:
        return jsii.get(self, "networkConfiguration")

    @network_configuration.setter # type: ignore
    def network_configuration(
        self,
        value: typing.List["BatchPoolNetworkConfiguration"],
    ) -> None:
        jsii.set(self, "networkConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeAgentSkuId")
    def node_agent_sku_id(self) -> builtins.str:
        return jsii.get(self, "nodeAgentSkuId")

    @node_agent_sku_id.setter # type: ignore
    def node_agent_sku_id(self, value: builtins.str) -> None:
        jsii.set(self, "nodeAgentSkuId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTask")
    def start_task(self) -> typing.List["BatchPoolStartTask"]:
        return jsii.get(self, "startTask")

    @start_task.setter # type: ignore
    def start_task(self, value: typing.List["BatchPoolStartTask"]) -> None:
        jsii.set(self, "startTask", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="stopPendingResizeOperation")
    def stop_pending_resize_operation(self) -> builtins.bool:
        return jsii.get(self, "stopPendingResizeOperation")

    @stop_pending_resize_operation.setter # type: ignore
    def stop_pending_resize_operation(self, value: builtins.bool) -> None:
        jsii.set(self, "stopPendingResizeOperation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageImageReference")
    def storage_image_reference(self) -> typing.List["BatchPoolStorageImageReference"]:
        return jsii.get(self, "storageImageReference")

    @storage_image_reference.setter # type: ignore
    def storage_image_reference(
        self,
        value: typing.List["BatchPoolStorageImageReference"],
    ) -> None:
        jsii.set(self, "storageImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BatchPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BatchPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSize")
    def vm_size(self) -> builtins.str:
        return jsii.get(self, "vmSize")

    @vm_size.setter # type: ignore
    def vm_size(self, value: builtins.str) -> None:
        jsii.set(self, "vmSize", value)


@jsii.data_type(
    jsii_type="azurerm.BatchPoolAutoScale",
    jsii_struct_bases=[],
    name_mapping={"formula": "formula", "evaluation_interval": "evaluationInterval"},
)
class BatchPoolAutoScale:
    def __init__(
        self,
        *,
        formula: builtins.str,
        evaluation_interval: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param formula: -
        :param evaluation_interval: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "formula": formula,
        }
        if evaluation_interval is not None:
            self._values["evaluation_interval"] = evaluation_interval

    @builtins.property
    def formula(self) -> builtins.str:
        result = self._values.get("formula")
        assert result is not None, "Required property 'formula' is missing"
        return result

    @builtins.property
    def evaluation_interval(self) -> typing.Optional[builtins.str]:
        result = self._values.get("evaluation_interval")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolAutoScale(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolCertificate",
    jsii_struct_bases=[],
    name_mapping={
        "id": "id",
        "store_location": "storeLocation",
        "store_name": "storeName",
        "visibility": "visibility",
    },
)
class BatchPoolCertificate:
    def __init__(
        self,
        *,
        id: builtins.str,
        store_location: builtins.str,
        store_name: typing.Optional[builtins.str] = None,
        visibility: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param id: -
        :param store_location: -
        :param store_name: -
        :param visibility: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
            "store_location": store_location,
        }
        if store_name is not None:
            self._values["store_name"] = store_name
        if visibility is not None:
            self._values["visibility"] = visibility

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    @builtins.property
    def store_location(self) -> builtins.str:
        result = self._values.get("store_location")
        assert result is not None, "Required property 'store_location' is missing"
        return result

    @builtins.property
    def store_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("store_name")
        return result

    @builtins.property
    def visibility(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("visibility")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "node_agent_sku_id": "nodeAgentSkuId",
        "resource_group_name": "resourceGroupName",
        "storage_image_reference": "storageImageReference",
        "vm_size": "vmSize",
        "auto_scale": "autoScale",
        "certificate": "certificate",
        "container_configuration": "containerConfiguration",
        "display_name": "displayName",
        "fixed_scale": "fixedScale",
        "max_tasks_per_node": "maxTasksPerNode",
        "metadata": "metadata",
        "network_configuration": "networkConfiguration",
        "start_task": "startTask",
        "stop_pending_resize_operation": "stopPendingResizeOperation",
        "timeouts": "timeouts",
    },
)
class BatchPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        node_agent_sku_id: builtins.str,
        resource_group_name: builtins.str,
        storage_image_reference: typing.List["BatchPoolStorageImageReference"],
        vm_size: builtins.str,
        auto_scale: typing.Optional[typing.List[BatchPoolAutoScale]] = None,
        certificate: typing.Optional[typing.List[BatchPoolCertificate]] = None,
        container_configuration: typing.Optional[typing.List["BatchPoolContainerConfiguration"]] = None,
        display_name: typing.Optional[builtins.str] = None,
        fixed_scale: typing.Optional[typing.List["BatchPoolFixedScale"]] = None,
        max_tasks_per_node: typing.Optional[jsii.Number] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        network_configuration: typing.Optional[typing.List["BatchPoolNetworkConfiguration"]] = None,
        start_task: typing.Optional[typing.List["BatchPoolStartTask"]] = None,
        stop_pending_resize_operation: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["BatchPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param node_agent_sku_id: -
        :param resource_group_name: -
        :param storage_image_reference: storage_image_reference block.
        :param vm_size: -
        :param auto_scale: auto_scale block.
        :param certificate: certificate block.
        :param container_configuration: container_configuration block.
        :param display_name: -
        :param fixed_scale: fixed_scale block.
        :param max_tasks_per_node: -
        :param metadata: -
        :param network_configuration: network_configuration block.
        :param start_task: start_task block.
        :param stop_pending_resize_operation: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BatchPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "node_agent_sku_id": node_agent_sku_id,
            "resource_group_name": resource_group_name,
            "storage_image_reference": storage_image_reference,
            "vm_size": vm_size,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_scale is not None:
            self._values["auto_scale"] = auto_scale
        if certificate is not None:
            self._values["certificate"] = certificate
        if container_configuration is not None:
            self._values["container_configuration"] = container_configuration
        if display_name is not None:
            self._values["display_name"] = display_name
        if fixed_scale is not None:
            self._values["fixed_scale"] = fixed_scale
        if max_tasks_per_node is not None:
            self._values["max_tasks_per_node"] = max_tasks_per_node
        if metadata is not None:
            self._values["metadata"] = metadata
        if network_configuration is not None:
            self._values["network_configuration"] = network_configuration
        if start_task is not None:
            self._values["start_task"] = start_task
        if stop_pending_resize_operation is not None:
            self._values["stop_pending_resize_operation"] = stop_pending_resize_operation
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def node_agent_sku_id(self) -> builtins.str:
        result = self._values.get("node_agent_sku_id")
        assert result is not None, "Required property 'node_agent_sku_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_image_reference(self) -> typing.List["BatchPoolStorageImageReference"]:
        """storage_image_reference block."""
        result = self._values.get("storage_image_reference")
        assert result is not None, "Required property 'storage_image_reference' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def auto_scale(self) -> typing.Optional[typing.List[BatchPoolAutoScale]]:
        """auto_scale block."""
        result = self._values.get("auto_scale")
        return result

    @builtins.property
    def certificate(self) -> typing.Optional[typing.List[BatchPoolCertificate]]:
        """certificate block."""
        result = self._values.get("certificate")
        return result

    @builtins.property
    def container_configuration(
        self,
    ) -> typing.Optional[typing.List["BatchPoolContainerConfiguration"]]:
        """container_configuration block."""
        result = self._values.get("container_configuration")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def fixed_scale(self) -> typing.Optional[typing.List["BatchPoolFixedScale"]]:
        """fixed_scale block."""
        result = self._values.get("fixed_scale")
        return result

    @builtins.property
    def max_tasks_per_node(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_tasks_per_node")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def network_configuration(
        self,
    ) -> typing.Optional[typing.List["BatchPoolNetworkConfiguration"]]:
        """network_configuration block."""
        result = self._values.get("network_configuration")
        return result

    @builtins.property
    def start_task(self) -> typing.Optional[typing.List["BatchPoolStartTask"]]:
        """start_task block."""
        result = self._values.get("start_task")
        return result

    @builtins.property
    def stop_pending_resize_operation(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("stop_pending_resize_operation")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BatchPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolContainerConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "container_image_names": "containerImageNames",
        "container_registries": "containerRegistries",
        "type": "type",
    },
)
class BatchPoolContainerConfiguration:
    def __init__(
        self,
        *,
        container_image_names: typing.Optional[typing.List[builtins.str]] = None,
        container_registries: typing.Optional[typing.List["BatchPoolContainerConfigurationContainerRegistries"]] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param container_image_names: -
        :param container_registries: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if container_image_names is not None:
            self._values["container_image_names"] = container_image_names
        if container_registries is not None:
            self._values["container_registries"] = container_registries
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def container_image_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("container_image_names")
        return result

    @builtins.property
    def container_registries(
        self,
    ) -> typing.Optional[typing.List["BatchPoolContainerConfigurationContainerRegistries"]]:
        result = self._values.get("container_registries")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolContainerConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolContainerConfigurationContainerRegistries",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "registry_server": "registryServer",
        "user_name": "userName",
    },
)
class BatchPoolContainerConfigurationContainerRegistries:
    def __init__(
        self,
        *,
        password: typing.Optional[builtins.str] = None,
        registry_server: typing.Optional[builtins.str] = None,
        user_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param password: -
        :param registry_server: -
        :param user_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if password is not None:
            self._values["password"] = password
        if registry_server is not None:
            self._values["registry_server"] = registry_server
        if user_name is not None:
            self._values["user_name"] = user_name

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def registry_server(self) -> typing.Optional[builtins.str]:
        result = self._values.get("registry_server")
        return result

    @builtins.property
    def user_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("user_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolContainerConfigurationContainerRegistries(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolFixedScale",
    jsii_struct_bases=[],
    name_mapping={
        "resize_timeout": "resizeTimeout",
        "target_dedicated_nodes": "targetDedicatedNodes",
        "target_low_priority_nodes": "targetLowPriorityNodes",
    },
)
class BatchPoolFixedScale:
    def __init__(
        self,
        *,
        resize_timeout: typing.Optional[builtins.str] = None,
        target_dedicated_nodes: typing.Optional[jsii.Number] = None,
        target_low_priority_nodes: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param resize_timeout: -
        :param target_dedicated_nodes: -
        :param target_low_priority_nodes: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if resize_timeout is not None:
            self._values["resize_timeout"] = resize_timeout
        if target_dedicated_nodes is not None:
            self._values["target_dedicated_nodes"] = target_dedicated_nodes
        if target_low_priority_nodes is not None:
            self._values["target_low_priority_nodes"] = target_low_priority_nodes

    @builtins.property
    def resize_timeout(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resize_timeout")
        return result

    @builtins.property
    def target_dedicated_nodes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("target_dedicated_nodes")
        return result

    @builtins.property
    def target_low_priority_nodes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("target_low_priority_nodes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolFixedScale(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolNetworkConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "subnet_id": "subnetId",
        "endpoint_configuration": "endpointConfiguration",
        "public_ips": "publicIps",
    },
)
class BatchPoolNetworkConfiguration:
    def __init__(
        self,
        *,
        subnet_id: builtins.str,
        endpoint_configuration: typing.Optional[typing.List["BatchPoolNetworkConfigurationEndpointConfiguration"]] = None,
        public_ips: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param subnet_id: -
        :param endpoint_configuration: endpoint_configuration block.
        :param public_ips: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "subnet_id": subnet_id,
        }
        if endpoint_configuration is not None:
            self._values["endpoint_configuration"] = endpoint_configuration
        if public_ips is not None:
            self._values["public_ips"] = public_ips

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def endpoint_configuration(
        self,
    ) -> typing.Optional[typing.List["BatchPoolNetworkConfigurationEndpointConfiguration"]]:
        """endpoint_configuration block."""
        result = self._values.get("endpoint_configuration")
        return result

    @builtins.property
    def public_ips(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("public_ips")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolNetworkConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolNetworkConfigurationEndpointConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "backend_port": "backendPort",
        "frontend_port_range": "frontendPortRange",
        "name": "name",
        "protocol": "protocol",
        "network_security_group_rules": "networkSecurityGroupRules",
    },
)
class BatchPoolNetworkConfigurationEndpointConfiguration:
    def __init__(
        self,
        *,
        backend_port: jsii.Number,
        frontend_port_range: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        network_security_group_rules: typing.Optional[typing.List["BatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules"]] = None,
    ) -> None:
        """
        :param backend_port: -
        :param frontend_port_range: -
        :param name: -
        :param protocol: -
        :param network_security_group_rules: network_security_group_rules block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "backend_port": backend_port,
            "frontend_port_range": frontend_port_range,
            "name": name,
            "protocol": protocol,
        }
        if network_security_group_rules is not None:
            self._values["network_security_group_rules"] = network_security_group_rules

    @builtins.property
    def backend_port(self) -> jsii.Number:
        result = self._values.get("backend_port")
        assert result is not None, "Required property 'backend_port' is missing"
        return result

    @builtins.property
    def frontend_port_range(self) -> builtins.str:
        result = self._values.get("frontend_port_range")
        assert result is not None, "Required property 'frontend_port_range' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def network_security_group_rules(
        self,
    ) -> typing.Optional[typing.List["BatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules"]]:
        """network_security_group_rules block."""
        result = self._values.get("network_security_group_rules")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolNetworkConfigurationEndpointConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules",
    jsii_struct_bases=[],
    name_mapping={
        "access": "access",
        "priority": "priority",
        "source_address_prefix": "sourceAddressPrefix",
    },
)
class BatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules:
    def __init__(
        self,
        *,
        access: builtins.str,
        priority: jsii.Number,
        source_address_prefix: builtins.str,
    ) -> None:
        """
        :param access: -
        :param priority: -
        :param source_address_prefix: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "access": access,
            "priority": priority,
            "source_address_prefix": source_address_prefix,
        }

    @builtins.property
    def access(self) -> builtins.str:
        result = self._values.get("access")
        assert result is not None, "Required property 'access' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def source_address_prefix(self) -> builtins.str:
        result = self._values.get("source_address_prefix")
        assert result is not None, "Required property 'source_address_prefix' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolStartTask",
    jsii_struct_bases=[],
    name_mapping={
        "command_line": "commandLine",
        "user_identity": "userIdentity",
        "environment": "environment",
        "max_task_retry_count": "maxTaskRetryCount",
        "resource_file": "resourceFile",
        "wait_for_success": "waitForSuccess",
    },
)
class BatchPoolStartTask:
    def __init__(
        self,
        *,
        command_line: builtins.str,
        user_identity: typing.List["BatchPoolStartTaskUserIdentity"],
        environment: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        max_task_retry_count: typing.Optional[jsii.Number] = None,
        resource_file: typing.Optional[typing.List["BatchPoolStartTaskResourceFile"]] = None,
        wait_for_success: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param command_line: -
        :param user_identity: user_identity block.
        :param environment: -
        :param max_task_retry_count: -
        :param resource_file: resource_file block.
        :param wait_for_success: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "command_line": command_line,
            "user_identity": user_identity,
        }
        if environment is not None:
            self._values["environment"] = environment
        if max_task_retry_count is not None:
            self._values["max_task_retry_count"] = max_task_retry_count
        if resource_file is not None:
            self._values["resource_file"] = resource_file
        if wait_for_success is not None:
            self._values["wait_for_success"] = wait_for_success

    @builtins.property
    def command_line(self) -> builtins.str:
        result = self._values.get("command_line")
        assert result is not None, "Required property 'command_line' is missing"
        return result

    @builtins.property
    def user_identity(self) -> typing.List["BatchPoolStartTaskUserIdentity"]:
        """user_identity block."""
        result = self._values.get("user_identity")
        assert result is not None, "Required property 'user_identity' is missing"
        return result

    @builtins.property
    def environment(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("environment")
        return result

    @builtins.property
    def max_task_retry_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_task_retry_count")
        return result

    @builtins.property
    def resource_file(
        self,
    ) -> typing.Optional[typing.List["BatchPoolStartTaskResourceFile"]]:
        """resource_file block."""
        result = self._values.get("resource_file")
        return result

    @builtins.property
    def wait_for_success(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("wait_for_success")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolStartTask(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolStartTaskResourceFile",
    jsii_struct_bases=[],
    name_mapping={
        "auto_storage_container_name": "autoStorageContainerName",
        "blob_prefix": "blobPrefix",
        "file_mode": "fileMode",
        "file_path": "filePath",
        "http_url": "httpUrl",
        "storage_container_url": "storageContainerUrl",
    },
)
class BatchPoolStartTaskResourceFile:
    def __init__(
        self,
        *,
        auto_storage_container_name: typing.Optional[builtins.str] = None,
        blob_prefix: typing.Optional[builtins.str] = None,
        file_mode: typing.Optional[builtins.str] = None,
        file_path: typing.Optional[builtins.str] = None,
        http_url: typing.Optional[builtins.str] = None,
        storage_container_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param auto_storage_container_name: -
        :param blob_prefix: -
        :param file_mode: -
        :param file_path: -
        :param http_url: -
        :param storage_container_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if auto_storage_container_name is not None:
            self._values["auto_storage_container_name"] = auto_storage_container_name
        if blob_prefix is not None:
            self._values["blob_prefix"] = blob_prefix
        if file_mode is not None:
            self._values["file_mode"] = file_mode
        if file_path is not None:
            self._values["file_path"] = file_path
        if http_url is not None:
            self._values["http_url"] = http_url
        if storage_container_url is not None:
            self._values["storage_container_url"] = storage_container_url

    @builtins.property
    def auto_storage_container_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_storage_container_name")
        return result

    @builtins.property
    def blob_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("blob_prefix")
        return result

    @builtins.property
    def file_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_mode")
        return result

    @builtins.property
    def file_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_path")
        return result

    @builtins.property
    def http_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("http_url")
        return result

    @builtins.property
    def storage_container_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_container_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolStartTaskResourceFile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolStartTaskUserIdentity",
    jsii_struct_bases=[],
    name_mapping={"auto_user": "autoUser", "user_name": "userName"},
)
class BatchPoolStartTaskUserIdentity:
    def __init__(
        self,
        *,
        auto_user: typing.Optional[typing.List["BatchPoolStartTaskUserIdentityAutoUser"]] = None,
        user_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param auto_user: auto_user block.
        :param user_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if auto_user is not None:
            self._values["auto_user"] = auto_user
        if user_name is not None:
            self._values["user_name"] = user_name

    @builtins.property
    def auto_user(
        self,
    ) -> typing.Optional[typing.List["BatchPoolStartTaskUserIdentityAutoUser"]]:
        """auto_user block."""
        result = self._values.get("auto_user")
        return result

    @builtins.property
    def user_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("user_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolStartTaskUserIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolStartTaskUserIdentityAutoUser",
    jsii_struct_bases=[],
    name_mapping={"elevation_level": "elevationLevel", "scope": "scope"},
)
class BatchPoolStartTaskUserIdentityAutoUser:
    def __init__(
        self,
        *,
        elevation_level: typing.Optional[builtins.str] = None,
        scope: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param elevation_level: -
        :param scope: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if elevation_level is not None:
            self._values["elevation_level"] = elevation_level
        if scope is not None:
            self._values["scope"] = scope

    @builtins.property
    def elevation_level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("elevation_level")
        return result

    @builtins.property
    def scope(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scope")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolStartTaskUserIdentityAutoUser(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolStorageImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "id": "id",
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class BatchPoolStorageImageReference:
    def __init__(
        self,
        *,
        id: typing.Optional[builtins.str] = None,
        offer: typing.Optional[builtins.str] = None,
        publisher: typing.Optional[builtins.str] = None,
        sku: typing.Optional[builtins.str] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param id: -
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if id is not None:
            self._values["id"] = id
        if offer is not None:
            self._values["offer"] = offer
        if publisher is not None:
            self._values["publisher"] = publisher
        if sku is not None:
            self._values["sku"] = sku
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("id")
        return result

    @builtins.property
    def offer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("offer")
        return result

    @builtins.property
    def publisher(self) -> typing.Optional[builtins.str]:
        result = self._values.get("publisher")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolStorageImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BatchPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BatchPoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BatchPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BlueprintAssignment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BlueprintAssignment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        target_subscription_id: builtins.str,
        version_id: builtins.str,
        identity: typing.Optional[typing.List["BlueprintAssignmentIdentity"]] = None,
        lock_exclude_principals: typing.Optional[typing.List[builtins.str]] = None,
        lock_mode: typing.Optional[builtins.str] = None,
        parameter_values: typing.Optional[builtins.str] = None,
        resource_groups: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BlueprintAssignmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param target_subscription_id: -
        :param version_id: -
        :param identity: identity block.
        :param lock_exclude_principals: -
        :param lock_mode: -
        :param parameter_values: -
        :param resource_groups: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BlueprintAssignmentConfig(
            location=location,
            name=name,
            target_subscription_id=target_subscription_id,
            version_id=version_id,
            identity=identity,
            lock_exclude_principals=lock_exclude_principals,
            lock_mode=lock_mode,
            parameter_values=parameter_values,
            resource_groups=resource_groups,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BlueprintAssignment, self, [scope, id, config])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLockExcludePrincipals")
    def reset_lock_exclude_principals(self) -> None:
        return jsii.invoke(self, "resetLockExcludePrincipals", [])

    @jsii.member(jsii_name="resetLockMode")
    def reset_lock_mode(self) -> None:
        return jsii.invoke(self, "resetLockMode", [])

    @jsii.member(jsii_name="resetParameterValues")
    def reset_parameter_values(self) -> None:
        return jsii.invoke(self, "resetParameterValues", [])

    @jsii.member(jsii_name="resetResourceGroups")
    def reset_resource_groups(self) -> None:
        return jsii.invoke(self, "resetResourceGroups", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blueprintName")
    def blueprint_name(self) -> builtins.str:
        return jsii.get(self, "blueprintName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetSubscriptionIdInput")
    def target_subscription_id_input(self) -> builtins.str:
        return jsii.get(self, "targetSubscriptionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionIdInput")
    def version_id_input(self) -> builtins.str:
        return jsii.get(self, "versionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["BlueprintAssignmentIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockExcludePrincipalsInput")
    def lock_exclude_principals_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "lockExcludePrincipalsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockModeInput")
    def lock_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "lockModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameterValuesInput")
    def parameter_values_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parameterValuesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupsInput")
    def resource_groups_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceGroupsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BlueprintAssignmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["BlueprintAssignmentIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["BlueprintAssignmentIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockExcludePrincipals")
    def lock_exclude_principals(self) -> typing.List[builtins.str]:
        return jsii.get(self, "lockExcludePrincipals")

    @lock_exclude_principals.setter # type: ignore
    def lock_exclude_principals(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "lockExcludePrincipals", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockMode")
    def lock_mode(self) -> builtins.str:
        return jsii.get(self, "lockMode")

    @lock_mode.setter # type: ignore
    def lock_mode(self, value: builtins.str) -> None:
        jsii.set(self, "lockMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameterValues")
    def parameter_values(self) -> builtins.str:
        return jsii.get(self, "parameterValues")

    @parameter_values.setter # type: ignore
    def parameter_values(self, value: builtins.str) -> None:
        jsii.set(self, "parameterValues", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroups")
    def resource_groups(self) -> builtins.str:
        return jsii.get(self, "resourceGroups")

    @resource_groups.setter # type: ignore
    def resource_groups(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroups", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetSubscriptionId")
    def target_subscription_id(self) -> builtins.str:
        return jsii.get(self, "targetSubscriptionId")

    @target_subscription_id.setter # type: ignore
    def target_subscription_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetSubscriptionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BlueprintAssignmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BlueprintAssignmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionId")
    def version_id(self) -> builtins.str:
        return jsii.get(self, "versionId")

    @version_id.setter # type: ignore
    def version_id(self, value: builtins.str) -> None:
        jsii.set(self, "versionId", value)


@jsii.data_type(
    jsii_type="azurerm.BlueprintAssignmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "target_subscription_id": "targetSubscriptionId",
        "version_id": "versionId",
        "identity": "identity",
        "lock_exclude_principals": "lockExcludePrincipals",
        "lock_mode": "lockMode",
        "parameter_values": "parameterValues",
        "resource_groups": "resourceGroups",
        "timeouts": "timeouts",
    },
)
class BlueprintAssignmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        target_subscription_id: builtins.str,
        version_id: builtins.str,
        identity: typing.Optional[typing.List["BlueprintAssignmentIdentity"]] = None,
        lock_exclude_principals: typing.Optional[typing.List[builtins.str]] = None,
        lock_mode: typing.Optional[builtins.str] = None,
        parameter_values: typing.Optional[builtins.str] = None,
        resource_groups: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BlueprintAssignmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param target_subscription_id: -
        :param version_id: -
        :param identity: identity block.
        :param lock_exclude_principals: -
        :param lock_mode: -
        :param parameter_values: -
        :param resource_groups: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BlueprintAssignmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "target_subscription_id": target_subscription_id,
            "version_id": version_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if identity is not None:
            self._values["identity"] = identity
        if lock_exclude_principals is not None:
            self._values["lock_exclude_principals"] = lock_exclude_principals
        if lock_mode is not None:
            self._values["lock_mode"] = lock_mode
        if parameter_values is not None:
            self._values["parameter_values"] = parameter_values
        if resource_groups is not None:
            self._values["resource_groups"] = resource_groups
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def target_subscription_id(self) -> builtins.str:
        result = self._values.get("target_subscription_id")
        assert result is not None, "Required property 'target_subscription_id' is missing"
        return result

    @builtins.property
    def version_id(self) -> builtins.str:
        result = self._values.get("version_id")
        assert result is not None, "Required property 'version_id' is missing"
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["BlueprintAssignmentIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def lock_exclude_principals(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("lock_exclude_principals")
        return result

    @builtins.property
    def lock_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("lock_mode")
        return result

    @builtins.property
    def parameter_values(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameter_values")
        return result

    @builtins.property
    def resource_groups(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_groups")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BlueprintAssignmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BlueprintAssignmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BlueprintAssignmentIdentity",
    jsii_struct_bases=[],
    name_mapping={"identity_ids": "identityIds", "type": "type"},
)
class BlueprintAssignmentIdentity:
    def __init__(
        self,
        *,
        identity_ids: typing.List[builtins.str],
        type: builtins.str,
    ) -> None:
        """
        :param identity_ids: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "identity_ids": identity_ids,
            "type": type,
        }

    @builtins.property
    def identity_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("identity_ids")
        assert result is not None, "Required property 'identity_ids' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BlueprintAssignmentIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BlueprintAssignmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BlueprintAssignmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BlueprintAssignmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BotChannelDirectline(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BotChannelDirectline",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        bot_name: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        site: typing.List["BotChannelDirectlineSite"],
        timeouts: typing.Optional["BotChannelDirectlineTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param bot_name: -
        :param location: -
        :param resource_group_name: -
        :param site: site block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BotChannelDirectlineConfig(
            bot_name=bot_name,
            location=location,
            resource_group_name=resource_group_name,
            site=site,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BotChannelDirectline, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botNameInput")
    def bot_name_input(self) -> builtins.str:
        return jsii.get(self, "botNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteInput")
    def site_input(self) -> typing.List["BotChannelDirectlineSite"]:
        return jsii.get(self, "siteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BotChannelDirectlineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botName")
    def bot_name(self) -> builtins.str:
        return jsii.get(self, "botName")

    @bot_name.setter # type: ignore
    def bot_name(self, value: builtins.str) -> None:
        jsii.set(self, "botName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="site")
    def site(self) -> typing.List["BotChannelDirectlineSite"]:
        return jsii.get(self, "site")

    @site.setter # type: ignore
    def site(self, value: typing.List["BotChannelDirectlineSite"]) -> None:
        jsii.set(self, "site", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BotChannelDirectlineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BotChannelDirectlineTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BotChannelDirectlineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "bot_name": "botName",
        "location": "location",
        "resource_group_name": "resourceGroupName",
        "site": "site",
        "timeouts": "timeouts",
    },
)
class BotChannelDirectlineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        bot_name: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        site: typing.List["BotChannelDirectlineSite"],
        timeouts: typing.Optional["BotChannelDirectlineTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bot_name: -
        :param location: -
        :param resource_group_name: -
        :param site: site block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BotChannelDirectlineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "bot_name": bot_name,
            "location": location,
            "resource_group_name": resource_group_name,
            "site": site,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def bot_name(self) -> builtins.str:
        result = self._values.get("bot_name")
        assert result is not None, "Required property 'bot_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def site(self) -> typing.List["BotChannelDirectlineSite"]:
        """site block."""
        result = self._values.get("site")
        assert result is not None, "Required property 'site' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BotChannelDirectlineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelDirectlineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotChannelDirectlineSite",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "enabled": "enabled",
        "enhanced_authentication_enabled": "enhancedAuthenticationEnabled",
        "trusted_origins": "trustedOrigins",
        "v1_allowed": "v1Allowed",
        "v3_allowed": "v3Allowed",
    },
)
class BotChannelDirectlineSite:
    def __init__(
        self,
        *,
        name: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        enhanced_authentication_enabled: typing.Optional[builtins.bool] = None,
        trusted_origins: typing.Optional[typing.List[builtins.str]] = None,
        v1_allowed: typing.Optional[builtins.bool] = None,
        v3_allowed: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param name: -
        :param enabled: -
        :param enhanced_authentication_enabled: -
        :param trusted_origins: -
        :param v1_allowed: -
        :param v3_allowed: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if enhanced_authentication_enabled is not None:
            self._values["enhanced_authentication_enabled"] = enhanced_authentication_enabled
        if trusted_origins is not None:
            self._values["trusted_origins"] = trusted_origins
        if v1_allowed is not None:
            self._values["v1_allowed"] = v1_allowed
        if v3_allowed is not None:
            self._values["v3_allowed"] = v3_allowed

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def enhanced_authentication_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enhanced_authentication_enabled")
        return result

    @builtins.property
    def trusted_origins(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("trusted_origins")
        return result

    @builtins.property
    def v1_allowed(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("v1_allowed")
        return result

    @builtins.property
    def v3_allowed(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("v3_allowed")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelDirectlineSite(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotChannelDirectlineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BotChannelDirectlineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelDirectlineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BotChannelEmail(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BotChannelEmail",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        bot_name: builtins.str,
        email_address: builtins.str,
        email_password: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["BotChannelEmailTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param bot_name: -
        :param email_address: -
        :param email_password: -
        :param location: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BotChannelEmailConfig(
            bot_name=bot_name,
            email_address=email_address,
            email_password=email_password,
            location=location,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BotChannelEmail, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botNameInput")
    def bot_name_input(self) -> builtins.str:
        return jsii.get(self, "botNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddressInput")
    def email_address_input(self) -> builtins.str:
        return jsii.get(self, "emailAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailPasswordInput")
    def email_password_input(self) -> builtins.str:
        return jsii.get(self, "emailPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BotChannelEmailTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botName")
    def bot_name(self) -> builtins.str:
        return jsii.get(self, "botName")

    @bot_name.setter # type: ignore
    def bot_name(self, value: builtins.str) -> None:
        jsii.set(self, "botName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddress")
    def email_address(self) -> builtins.str:
        return jsii.get(self, "emailAddress")

    @email_address.setter # type: ignore
    def email_address(self, value: builtins.str) -> None:
        jsii.set(self, "emailAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailPassword")
    def email_password(self) -> builtins.str:
        return jsii.get(self, "emailPassword")

    @email_password.setter # type: ignore
    def email_password(self, value: builtins.str) -> None:
        jsii.set(self, "emailPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BotChannelEmailTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BotChannelEmailTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BotChannelEmailConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "bot_name": "botName",
        "email_address": "emailAddress",
        "email_password": "emailPassword",
        "location": "location",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class BotChannelEmailConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        bot_name: builtins.str,
        email_address: builtins.str,
        email_password: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["BotChannelEmailTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bot_name: -
        :param email_address: -
        :param email_password: -
        :param location: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BotChannelEmailTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "bot_name": bot_name,
            "email_address": email_address,
            "email_password": email_password,
            "location": location,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def bot_name(self) -> builtins.str:
        result = self._values.get("bot_name")
        assert result is not None, "Required property 'bot_name' is missing"
        return result

    @builtins.property
    def email_address(self) -> builtins.str:
        result = self._values.get("email_address")
        assert result is not None, "Required property 'email_address' is missing"
        return result

    @builtins.property
    def email_password(self) -> builtins.str:
        result = self._values.get("email_password")
        assert result is not None, "Required property 'email_password' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BotChannelEmailTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelEmailConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotChannelEmailTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BotChannelEmailTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelEmailTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BotChannelMsTeams(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BotChannelMsTeams",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        bot_name: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        calling_web_hook: typing.Optional[builtins.str] = None,
        enable_calling: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["BotChannelMsTeamsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param bot_name: -
        :param location: -
        :param resource_group_name: -
        :param calling_web_hook: -
        :param enable_calling: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BotChannelMsTeamsConfig(
            bot_name=bot_name,
            location=location,
            resource_group_name=resource_group_name,
            calling_web_hook=calling_web_hook,
            enable_calling=enable_calling,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BotChannelMsTeams, self, [scope, id, config])

    @jsii.member(jsii_name="resetCallingWebHook")
    def reset_calling_web_hook(self) -> None:
        return jsii.invoke(self, "resetCallingWebHook", [])

    @jsii.member(jsii_name="resetEnableCalling")
    def reset_enable_calling(self) -> None:
        return jsii.invoke(self, "resetEnableCalling", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botNameInput")
    def bot_name_input(self) -> builtins.str:
        return jsii.get(self, "botNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="callingWebHookInput")
    def calling_web_hook_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "callingWebHookInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableCallingInput")
    def enable_calling_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableCallingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BotChannelMsTeamsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botName")
    def bot_name(self) -> builtins.str:
        return jsii.get(self, "botName")

    @bot_name.setter # type: ignore
    def bot_name(self, value: builtins.str) -> None:
        jsii.set(self, "botName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="callingWebHook")
    def calling_web_hook(self) -> builtins.str:
        return jsii.get(self, "callingWebHook")

    @calling_web_hook.setter # type: ignore
    def calling_web_hook(self, value: builtins.str) -> None:
        jsii.set(self, "callingWebHook", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableCalling")
    def enable_calling(self) -> builtins.bool:
        return jsii.get(self, "enableCalling")

    @enable_calling.setter # type: ignore
    def enable_calling(self, value: builtins.bool) -> None:
        jsii.set(self, "enableCalling", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BotChannelMsTeamsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BotChannelMsTeamsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BotChannelMsTeamsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "bot_name": "botName",
        "location": "location",
        "resource_group_name": "resourceGroupName",
        "calling_web_hook": "callingWebHook",
        "enable_calling": "enableCalling",
        "timeouts": "timeouts",
    },
)
class BotChannelMsTeamsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        bot_name: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        calling_web_hook: typing.Optional[builtins.str] = None,
        enable_calling: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["BotChannelMsTeamsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bot_name: -
        :param location: -
        :param resource_group_name: -
        :param calling_web_hook: -
        :param enable_calling: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BotChannelMsTeamsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "bot_name": bot_name,
            "location": location,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if calling_web_hook is not None:
            self._values["calling_web_hook"] = calling_web_hook
        if enable_calling is not None:
            self._values["enable_calling"] = enable_calling
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def bot_name(self) -> builtins.str:
        result = self._values.get("bot_name")
        assert result is not None, "Required property 'bot_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def calling_web_hook(self) -> typing.Optional[builtins.str]:
        result = self._values.get("calling_web_hook")
        return result

    @builtins.property
    def enable_calling(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_calling")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BotChannelMsTeamsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelMsTeamsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotChannelMsTeamsTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BotChannelMsTeamsTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelMsTeamsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BotChannelSlack(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BotChannelSlack",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        bot_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        verification_token: builtins.str,
        landing_page_url: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BotChannelSlackTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param bot_name: -
        :param client_id: -
        :param client_secret: -
        :param location: -
        :param resource_group_name: -
        :param verification_token: -
        :param landing_page_url: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BotChannelSlackConfig(
            bot_name=bot_name,
            client_id=client_id,
            client_secret=client_secret,
            location=location,
            resource_group_name=resource_group_name,
            verification_token=verification_token,
            landing_page_url=landing_page_url,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BotChannelSlack, self, [scope, id, config])

    @jsii.member(jsii_name="resetLandingPageUrl")
    def reset_landing_page_url(self) -> None:
        return jsii.invoke(self, "resetLandingPageUrl", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botNameInput")
    def bot_name_input(self) -> builtins.str:
        return jsii.get(self, "botNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> builtins.str:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="verificationTokenInput")
    def verification_token_input(self) -> builtins.str:
        return jsii.get(self, "verificationTokenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="landingPageUrlInput")
    def landing_page_url_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "landingPageUrlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BotChannelSlackTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botName")
    def bot_name(self) -> builtins.str:
        return jsii.get(self, "botName")

    @bot_name.setter # type: ignore
    def bot_name(self, value: builtins.str) -> None:
        jsii.set(self, "botName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> builtins.str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: builtins.str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="landingPageUrl")
    def landing_page_url(self) -> builtins.str:
        return jsii.get(self, "landingPageUrl")

    @landing_page_url.setter # type: ignore
    def landing_page_url(self, value: builtins.str) -> None:
        jsii.set(self, "landingPageUrl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BotChannelSlackTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BotChannelSlackTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="verificationToken")
    def verification_token(self) -> builtins.str:
        return jsii.get(self, "verificationToken")

    @verification_token.setter # type: ignore
    def verification_token(self, value: builtins.str) -> None:
        jsii.set(self, "verificationToken", value)


@jsii.data_type(
    jsii_type="azurerm.BotChannelSlackConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "bot_name": "botName",
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "location": "location",
        "resource_group_name": "resourceGroupName",
        "verification_token": "verificationToken",
        "landing_page_url": "landingPageUrl",
        "timeouts": "timeouts",
    },
)
class BotChannelSlackConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        bot_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        location: builtins.str,
        resource_group_name: builtins.str,
        verification_token: builtins.str,
        landing_page_url: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["BotChannelSlackTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bot_name: -
        :param client_id: -
        :param client_secret: -
        :param location: -
        :param resource_group_name: -
        :param verification_token: -
        :param landing_page_url: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BotChannelSlackTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "bot_name": bot_name,
            "client_id": client_id,
            "client_secret": client_secret,
            "location": location,
            "resource_group_name": resource_group_name,
            "verification_token": verification_token,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if landing_page_url is not None:
            self._values["landing_page_url"] = landing_page_url
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def bot_name(self) -> builtins.str:
        result = self._values.get("bot_name")
        assert result is not None, "Required property 'bot_name' is missing"
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def verification_token(self) -> builtins.str:
        result = self._values.get("verification_token")
        assert result is not None, "Required property 'verification_token' is missing"
        return result

    @builtins.property
    def landing_page_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("landing_page_url")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BotChannelSlackTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelSlackConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotChannelSlackTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BotChannelSlackTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelSlackTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BotChannelsRegistration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BotChannelsRegistration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        microsoft_app_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        developer_app_insights_api_key: typing.Optional[builtins.str] = None,
        developer_app_insights_application_id: typing.Optional[builtins.str] = None,
        developer_app_insights_key: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        endpoint: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BotChannelsRegistrationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param microsoft_app_id: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param developer_app_insights_api_key: -
        :param developer_app_insights_application_id: -
        :param developer_app_insights_key: -
        :param display_name: -
        :param endpoint: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BotChannelsRegistrationConfig(
            location=location,
            microsoft_app_id=microsoft_app_id,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            developer_app_insights_api_key=developer_app_insights_api_key,
            developer_app_insights_application_id=developer_app_insights_application_id,
            developer_app_insights_key=developer_app_insights_key,
            display_name=display_name,
            endpoint=endpoint,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BotChannelsRegistration, self, [scope, id, config])

    @jsii.member(jsii_name="resetDeveloperAppInsightsApiKey")
    def reset_developer_app_insights_api_key(self) -> None:
        return jsii.invoke(self, "resetDeveloperAppInsightsApiKey", [])

    @jsii.member(jsii_name="resetDeveloperAppInsightsApplicationId")
    def reset_developer_app_insights_application_id(self) -> None:
        return jsii.invoke(self, "resetDeveloperAppInsightsApplicationId", [])

    @jsii.member(jsii_name="resetDeveloperAppInsightsKey")
    def reset_developer_app_insights_key(self) -> None:
        return jsii.invoke(self, "resetDeveloperAppInsightsKey", [])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetEndpoint")
    def reset_endpoint(self) -> None:
        return jsii.invoke(self, "resetEndpoint", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="microsoftAppIdInput")
    def microsoft_app_id_input(self) -> builtins.str:
        return jsii.get(self, "microsoftAppIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApiKeyInput")
    def developer_app_insights_api_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "developerAppInsightsApiKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApplicationIdInput")
    def developer_app_insights_application_id_input(
        self,
    ) -> typing.Optional[builtins.str]:
        return jsii.get(self, "developerAppInsightsApplicationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsKeyInput")
    def developer_app_insights_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "developerAppInsightsKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointInput")
    def endpoint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "endpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BotChannelsRegistrationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApiKey")
    def developer_app_insights_api_key(self) -> builtins.str:
        return jsii.get(self, "developerAppInsightsApiKey")

    @developer_app_insights_api_key.setter # type: ignore
    def developer_app_insights_api_key(self, value: builtins.str) -> None:
        jsii.set(self, "developerAppInsightsApiKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApplicationId")
    def developer_app_insights_application_id(self) -> builtins.str:
        return jsii.get(self, "developerAppInsightsApplicationId")

    @developer_app_insights_application_id.setter # type: ignore
    def developer_app_insights_application_id(self, value: builtins.str) -> None:
        jsii.set(self, "developerAppInsightsApplicationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsKey")
    def developer_app_insights_key(self) -> builtins.str:
        return jsii.get(self, "developerAppInsightsKey")

    @developer_app_insights_key.setter # type: ignore
    def developer_app_insights_key(self, value: builtins.str) -> None:
        jsii.set(self, "developerAppInsightsKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @endpoint.setter # type: ignore
    def endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "endpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="microsoftAppId")
    def microsoft_app_id(self) -> builtins.str:
        return jsii.get(self, "microsoftAppId")

    @microsoft_app_id.setter # type: ignore
    def microsoft_app_id(self, value: builtins.str) -> None:
        jsii.set(self, "microsoftAppId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BotChannelsRegistrationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BotChannelsRegistrationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BotChannelsRegistrationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "microsoft_app_id": "microsoftAppId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "developer_app_insights_api_key": "developerAppInsightsApiKey",
        "developer_app_insights_application_id": "developerAppInsightsApplicationId",
        "developer_app_insights_key": "developerAppInsightsKey",
        "display_name": "displayName",
        "endpoint": "endpoint",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class BotChannelsRegistrationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        microsoft_app_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        developer_app_insights_api_key: typing.Optional[builtins.str] = None,
        developer_app_insights_application_id: typing.Optional[builtins.str] = None,
        developer_app_insights_key: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        endpoint: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BotChannelsRegistrationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param microsoft_app_id: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param developer_app_insights_api_key: -
        :param developer_app_insights_application_id: -
        :param developer_app_insights_key: -
        :param display_name: -
        :param endpoint: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BotChannelsRegistrationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "microsoft_app_id": microsoft_app_id,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if developer_app_insights_api_key is not None:
            self._values["developer_app_insights_api_key"] = developer_app_insights_api_key
        if developer_app_insights_application_id is not None:
            self._values["developer_app_insights_application_id"] = developer_app_insights_application_id
        if developer_app_insights_key is not None:
            self._values["developer_app_insights_key"] = developer_app_insights_key
        if display_name is not None:
            self._values["display_name"] = display_name
        if endpoint is not None:
            self._values["endpoint"] = endpoint
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def microsoft_app_id(self) -> builtins.str:
        result = self._values.get("microsoft_app_id")
        assert result is not None, "Required property 'microsoft_app_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def developer_app_insights_api_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("developer_app_insights_api_key")
        return result

    @builtins.property
    def developer_app_insights_application_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("developer_app_insights_application_id")
        return result

    @builtins.property
    def developer_app_insights_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("developer_app_insights_key")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("endpoint")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BotChannelsRegistrationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelsRegistrationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotChannelsRegistrationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BotChannelsRegistrationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotChannelsRegistrationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BotConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BotConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        bot_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_provider_name: builtins.str,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        scopes: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BotConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param bot_name: -
        :param client_id: -
        :param client_secret: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service_provider_name: -
        :param parameters: -
        :param scopes: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BotConnectionConfig(
            bot_name=bot_name,
            client_id=client_id,
            client_secret=client_secret,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            service_provider_name=service_provider_name,
            parameters=parameters,
            scopes=scopes,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BotConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetScopes")
    def reset_scopes(self) -> None:
        return jsii.invoke(self, "resetScopes", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botNameInput")
    def bot_name_input(self) -> builtins.str:
        return jsii.get(self, "botNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecretInput")
    def client_secret_input(self) -> builtins.str:
        return jsii.get(self, "clientSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceProviderNameInput")
    def service_provider_name_input(self) -> builtins.str:
        return jsii.get(self, "serviceProviderNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopesInput")
    def scopes_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "scopesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BotConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="botName")
    def bot_name(self) -> builtins.str:
        return jsii.get(self, "botName")

    @bot_name.setter # type: ignore
    def bot_name(self, value: builtins.str) -> None:
        jsii.set(self, "botName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> builtins.str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter # type: ignore
    def client_secret(self, value: builtins.str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopes")
    def scopes(self) -> builtins.str:
        return jsii.get(self, "scopes")

    @scopes.setter # type: ignore
    def scopes(self, value: builtins.str) -> None:
        jsii.set(self, "scopes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceProviderName")
    def service_provider_name(self) -> builtins.str:
        return jsii.get(self, "serviceProviderName")

    @service_provider_name.setter # type: ignore
    def service_provider_name(self, value: builtins.str) -> None:
        jsii.set(self, "serviceProviderName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BotConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BotConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BotConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "bot_name": "botName",
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "service_provider_name": "serviceProviderName",
        "parameters": "parameters",
        "scopes": "scopes",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class BotConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        bot_name: builtins.str,
        client_id: builtins.str,
        client_secret: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_provider_name: builtins.str,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        scopes: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BotConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bot_name: -
        :param client_id: -
        :param client_secret: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service_provider_name: -
        :param parameters: -
        :param scopes: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BotConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "bot_name": bot_name,
            "client_id": client_id,
            "client_secret": client_secret,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "service_provider_name": service_provider_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if parameters is not None:
            self._values["parameters"] = parameters
        if scopes is not None:
            self._values["scopes"] = scopes
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def bot_name(self) -> builtins.str:
        result = self._values.get("bot_name")
        assert result is not None, "Required property 'bot_name' is missing"
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_provider_name(self) -> builtins.str:
        result = self._values.get("service_provider_name")
        assert result is not None, "Required property 'service_provider_name' is missing"
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def scopes(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scopes")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BotConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BotConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class BotWebApp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.BotWebApp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        microsoft_app_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        developer_app_insights_api_key: typing.Optional[builtins.str] = None,
        developer_app_insights_application_id: typing.Optional[builtins.str] = None,
        developer_app_insights_key: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        endpoint: typing.Optional[builtins.str] = None,
        luis_app_ids: typing.Optional[typing.List[builtins.str]] = None,
        luis_key: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BotWebAppTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param microsoft_app_id: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param developer_app_insights_api_key: -
        :param developer_app_insights_application_id: -
        :param developer_app_insights_key: -
        :param display_name: -
        :param endpoint: -
        :param luis_app_ids: -
        :param luis_key: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BotWebAppConfig(
            location=location,
            microsoft_app_id=microsoft_app_id,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            developer_app_insights_api_key=developer_app_insights_api_key,
            developer_app_insights_application_id=developer_app_insights_application_id,
            developer_app_insights_key=developer_app_insights_key,
            display_name=display_name,
            endpoint=endpoint,
            luis_app_ids=luis_app_ids,
            luis_key=luis_key,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(BotWebApp, self, [scope, id, config])

    @jsii.member(jsii_name="resetDeveloperAppInsightsApiKey")
    def reset_developer_app_insights_api_key(self) -> None:
        return jsii.invoke(self, "resetDeveloperAppInsightsApiKey", [])

    @jsii.member(jsii_name="resetDeveloperAppInsightsApplicationId")
    def reset_developer_app_insights_application_id(self) -> None:
        return jsii.invoke(self, "resetDeveloperAppInsightsApplicationId", [])

    @jsii.member(jsii_name="resetDeveloperAppInsightsKey")
    def reset_developer_app_insights_key(self) -> None:
        return jsii.invoke(self, "resetDeveloperAppInsightsKey", [])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetEndpoint")
    def reset_endpoint(self) -> None:
        return jsii.invoke(self, "resetEndpoint", [])

    @jsii.member(jsii_name="resetLuisAppIds")
    def reset_luis_app_ids(self) -> None:
        return jsii.invoke(self, "resetLuisAppIds", [])

    @jsii.member(jsii_name="resetLuisKey")
    def reset_luis_key(self) -> None:
        return jsii.invoke(self, "resetLuisKey", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="microsoftAppIdInput")
    def microsoft_app_id_input(self) -> builtins.str:
        return jsii.get(self, "microsoftAppIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApiKeyInput")
    def developer_app_insights_api_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "developerAppInsightsApiKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApplicationIdInput")
    def developer_app_insights_application_id_input(
        self,
    ) -> typing.Optional[builtins.str]:
        return jsii.get(self, "developerAppInsightsApplicationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsKeyInput")
    def developer_app_insights_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "developerAppInsightsKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointInput")
    def endpoint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "endpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="luisAppIdsInput")
    def luis_app_ids_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "luisAppIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="luisKeyInput")
    def luis_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "luisKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["BotWebAppTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApiKey")
    def developer_app_insights_api_key(self) -> builtins.str:
        return jsii.get(self, "developerAppInsightsApiKey")

    @developer_app_insights_api_key.setter # type: ignore
    def developer_app_insights_api_key(self, value: builtins.str) -> None:
        jsii.set(self, "developerAppInsightsApiKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsApplicationId")
    def developer_app_insights_application_id(self) -> builtins.str:
        return jsii.get(self, "developerAppInsightsApplicationId")

    @developer_app_insights_application_id.setter # type: ignore
    def developer_app_insights_application_id(self, value: builtins.str) -> None:
        jsii.set(self, "developerAppInsightsApplicationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerAppInsightsKey")
    def developer_app_insights_key(self) -> builtins.str:
        return jsii.get(self, "developerAppInsightsKey")

    @developer_app_insights_key.setter # type: ignore
    def developer_app_insights_key(self, value: builtins.str) -> None:
        jsii.set(self, "developerAppInsightsKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @endpoint.setter # type: ignore
    def endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "endpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="luisAppIds")
    def luis_app_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "luisAppIds")

    @luis_app_ids.setter # type: ignore
    def luis_app_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "luisAppIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="luisKey")
    def luis_key(self) -> builtins.str:
        return jsii.get(self, "luisKey")

    @luis_key.setter # type: ignore
    def luis_key(self, value: builtins.str) -> None:
        jsii.set(self, "luisKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="microsoftAppId")
    def microsoft_app_id(self) -> builtins.str:
        return jsii.get(self, "microsoftAppId")

    @microsoft_app_id.setter # type: ignore
    def microsoft_app_id(self, value: builtins.str) -> None:
        jsii.set(self, "microsoftAppId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "BotWebAppTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "BotWebAppTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.BotWebAppConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "microsoft_app_id": "microsoftAppId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "developer_app_insights_api_key": "developerAppInsightsApiKey",
        "developer_app_insights_application_id": "developerAppInsightsApplicationId",
        "developer_app_insights_key": "developerAppInsightsKey",
        "display_name": "displayName",
        "endpoint": "endpoint",
        "luis_app_ids": "luisAppIds",
        "luis_key": "luisKey",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class BotWebAppConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        microsoft_app_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        developer_app_insights_api_key: typing.Optional[builtins.str] = None,
        developer_app_insights_application_id: typing.Optional[builtins.str] = None,
        developer_app_insights_key: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        endpoint: typing.Optional[builtins.str] = None,
        luis_app_ids: typing.Optional[typing.List[builtins.str]] = None,
        luis_key: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["BotWebAppTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param microsoft_app_id: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param developer_app_insights_api_key: -
        :param developer_app_insights_application_id: -
        :param developer_app_insights_key: -
        :param display_name: -
        :param endpoint: -
        :param luis_app_ids: -
        :param luis_key: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = BotWebAppTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "microsoft_app_id": microsoft_app_id,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if developer_app_insights_api_key is not None:
            self._values["developer_app_insights_api_key"] = developer_app_insights_api_key
        if developer_app_insights_application_id is not None:
            self._values["developer_app_insights_application_id"] = developer_app_insights_application_id
        if developer_app_insights_key is not None:
            self._values["developer_app_insights_key"] = developer_app_insights_key
        if display_name is not None:
            self._values["display_name"] = display_name
        if endpoint is not None:
            self._values["endpoint"] = endpoint
        if luis_app_ids is not None:
            self._values["luis_app_ids"] = luis_app_ids
        if luis_key is not None:
            self._values["luis_key"] = luis_key
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def microsoft_app_id(self) -> builtins.str:
        result = self._values.get("microsoft_app_id")
        assert result is not None, "Required property 'microsoft_app_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def developer_app_insights_api_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("developer_app_insights_api_key")
        return result

    @builtins.property
    def developer_app_insights_application_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("developer_app_insights_application_id")
        return result

    @builtins.property
    def developer_app_insights_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("developer_app_insights_key")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("endpoint")
        return result

    @builtins.property
    def luis_app_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("luis_app_ids")
        return result

    @builtins.property
    def luis_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("luis_key")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["BotWebAppTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotWebAppConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.BotWebAppTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class BotWebAppTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "BotWebAppTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CdnEndpoint(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CdnEndpoint",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        origin: typing.List["CdnEndpointOrigin"],
        profile_name: builtins.str,
        resource_group_name: builtins.str,
        content_types_to_compress: typing.Optional[typing.List[builtins.str]] = None,
        delivery_rule: typing.Optional[typing.List["CdnEndpointDeliveryRule"]] = None,
        geo_filter: typing.Optional[typing.List["CdnEndpointGeoFilter"]] = None,
        global_delivery_rule: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRule"]] = None,
        is_compression_enabled: typing.Optional[builtins.bool] = None,
        is_http_allowed: typing.Optional[builtins.bool] = None,
        is_https_allowed: typing.Optional[builtins.bool] = None,
        optimization_type: typing.Optional[builtins.str] = None,
        origin_host_header: typing.Optional[builtins.str] = None,
        origin_path: typing.Optional[builtins.str] = None,
        probe_path: typing.Optional[builtins.str] = None,
        querystring_caching_behaviour: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CdnEndpointTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param origin: origin block.
        :param profile_name: -
        :param resource_group_name: -
        :param content_types_to_compress: -
        :param delivery_rule: delivery_rule block.
        :param geo_filter: geo_filter block.
        :param global_delivery_rule: global_delivery_rule block.
        :param is_compression_enabled: -
        :param is_http_allowed: -
        :param is_https_allowed: -
        :param optimization_type: -
        :param origin_host_header: -
        :param origin_path: -
        :param probe_path: -
        :param querystring_caching_behaviour: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CdnEndpointConfig(
            location=location,
            name=name,
            origin=origin,
            profile_name=profile_name,
            resource_group_name=resource_group_name,
            content_types_to_compress=content_types_to_compress,
            delivery_rule=delivery_rule,
            geo_filter=geo_filter,
            global_delivery_rule=global_delivery_rule,
            is_compression_enabled=is_compression_enabled,
            is_http_allowed=is_http_allowed,
            is_https_allowed=is_https_allowed,
            optimization_type=optimization_type,
            origin_host_header=origin_host_header,
            origin_path=origin_path,
            probe_path=probe_path,
            querystring_caching_behaviour=querystring_caching_behaviour,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CdnEndpoint, self, [scope, id, config])

    @jsii.member(jsii_name="resetContentTypesToCompress")
    def reset_content_types_to_compress(self) -> None:
        return jsii.invoke(self, "resetContentTypesToCompress", [])

    @jsii.member(jsii_name="resetDeliveryRule")
    def reset_delivery_rule(self) -> None:
        return jsii.invoke(self, "resetDeliveryRule", [])

    @jsii.member(jsii_name="resetGeoFilter")
    def reset_geo_filter(self) -> None:
        return jsii.invoke(self, "resetGeoFilter", [])

    @jsii.member(jsii_name="resetGlobalDeliveryRule")
    def reset_global_delivery_rule(self) -> None:
        return jsii.invoke(self, "resetGlobalDeliveryRule", [])

    @jsii.member(jsii_name="resetIsCompressionEnabled")
    def reset_is_compression_enabled(self) -> None:
        return jsii.invoke(self, "resetIsCompressionEnabled", [])

    @jsii.member(jsii_name="resetIsHttpAllowed")
    def reset_is_http_allowed(self) -> None:
        return jsii.invoke(self, "resetIsHttpAllowed", [])

    @jsii.member(jsii_name="resetIsHttpsAllowed")
    def reset_is_https_allowed(self) -> None:
        return jsii.invoke(self, "resetIsHttpsAllowed", [])

    @jsii.member(jsii_name="resetOptimizationType")
    def reset_optimization_type(self) -> None:
        return jsii.invoke(self, "resetOptimizationType", [])

    @jsii.member(jsii_name="resetOriginHostHeader")
    def reset_origin_host_header(self) -> None:
        return jsii.invoke(self, "resetOriginHostHeader", [])

    @jsii.member(jsii_name="resetOriginPath")
    def reset_origin_path(self) -> None:
        return jsii.invoke(self, "resetOriginPath", [])

    @jsii.member(jsii_name="resetProbePath")
    def reset_probe_path(self) -> None:
        return jsii.invoke(self, "resetProbePath", [])

    @jsii.member(jsii_name="resetQuerystringCachingBehaviour")
    def reset_querystring_caching_behaviour(self) -> None:
        return jsii.invoke(self, "resetQuerystringCachingBehaviour", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="originInput")
    def origin_input(self) -> typing.List["CdnEndpointOrigin"]:
        return jsii.get(self, "originInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileNameInput")
    def profile_name_input(self) -> builtins.str:
        return jsii.get(self, "profileNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypesToCompressInput")
    def content_types_to_compress_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "contentTypesToCompressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deliveryRuleInput")
    def delivery_rule_input(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRule"]]:
        return jsii.get(self, "deliveryRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoFilterInput")
    def geo_filter_input(self) -> typing.Optional[typing.List["CdnEndpointGeoFilter"]]:
        return jsii.get(self, "geoFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="globalDeliveryRuleInput")
    def global_delivery_rule_input(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRule"]]:
        return jsii.get(self, "globalDeliveryRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isCompressionEnabledInput")
    def is_compression_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "isCompressionEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isHttpAllowedInput")
    def is_http_allowed_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "isHttpAllowedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isHttpsAllowedInput")
    def is_https_allowed_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "isHttpsAllowedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="optimizationTypeInput")
    def optimization_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "optimizationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="originHostHeaderInput")
    def origin_host_header_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "originHostHeaderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="originPathInput")
    def origin_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "originPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="probePathInput")
    def probe_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "probePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="querystringCachingBehaviourInput")
    def querystring_caching_behaviour_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "querystringCachingBehaviourInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CdnEndpointTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypesToCompress")
    def content_types_to_compress(self) -> typing.List[builtins.str]:
        return jsii.get(self, "contentTypesToCompress")

    @content_types_to_compress.setter # type: ignore
    def content_types_to_compress(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "contentTypesToCompress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deliveryRule")
    def delivery_rule(self) -> typing.List["CdnEndpointDeliveryRule"]:
        return jsii.get(self, "deliveryRule")

    @delivery_rule.setter # type: ignore
    def delivery_rule(self, value: typing.List["CdnEndpointDeliveryRule"]) -> None:
        jsii.set(self, "deliveryRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoFilter")
    def geo_filter(self) -> typing.List["CdnEndpointGeoFilter"]:
        return jsii.get(self, "geoFilter")

    @geo_filter.setter # type: ignore
    def geo_filter(self, value: typing.List["CdnEndpointGeoFilter"]) -> None:
        jsii.set(self, "geoFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="globalDeliveryRule")
    def global_delivery_rule(self) -> typing.List["CdnEndpointGlobalDeliveryRule"]:
        return jsii.get(self, "globalDeliveryRule")

    @global_delivery_rule.setter # type: ignore
    def global_delivery_rule(
        self,
        value: typing.List["CdnEndpointGlobalDeliveryRule"],
    ) -> None:
        jsii.set(self, "globalDeliveryRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isCompressionEnabled")
    def is_compression_enabled(self) -> builtins.bool:
        return jsii.get(self, "isCompressionEnabled")

    @is_compression_enabled.setter # type: ignore
    def is_compression_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "isCompressionEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isHttpAllowed")
    def is_http_allowed(self) -> builtins.bool:
        return jsii.get(self, "isHttpAllowed")

    @is_http_allowed.setter # type: ignore
    def is_http_allowed(self, value: builtins.bool) -> None:
        jsii.set(self, "isHttpAllowed", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isHttpsAllowed")
    def is_https_allowed(self) -> builtins.bool:
        return jsii.get(self, "isHttpsAllowed")

    @is_https_allowed.setter # type: ignore
    def is_https_allowed(self, value: builtins.bool) -> None:
        jsii.set(self, "isHttpsAllowed", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="optimizationType")
    def optimization_type(self) -> builtins.str:
        return jsii.get(self, "optimizationType")

    @optimization_type.setter # type: ignore
    def optimization_type(self, value: builtins.str) -> None:
        jsii.set(self, "optimizationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="origin")
    def origin(self) -> typing.List["CdnEndpointOrigin"]:
        return jsii.get(self, "origin")

    @origin.setter # type: ignore
    def origin(self, value: typing.List["CdnEndpointOrigin"]) -> None:
        jsii.set(self, "origin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="originHostHeader")
    def origin_host_header(self) -> builtins.str:
        return jsii.get(self, "originHostHeader")

    @origin_host_header.setter # type: ignore
    def origin_host_header(self, value: builtins.str) -> None:
        jsii.set(self, "originHostHeader", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="originPath")
    def origin_path(self) -> builtins.str:
        return jsii.get(self, "originPath")

    @origin_path.setter # type: ignore
    def origin_path(self, value: builtins.str) -> None:
        jsii.set(self, "originPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="probePath")
    def probe_path(self) -> builtins.str:
        return jsii.get(self, "probePath")

    @probe_path.setter # type: ignore
    def probe_path(self, value: builtins.str) -> None:
        jsii.set(self, "probePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileName")
    def profile_name(self) -> builtins.str:
        return jsii.get(self, "profileName")

    @profile_name.setter # type: ignore
    def profile_name(self, value: builtins.str) -> None:
        jsii.set(self, "profileName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="querystringCachingBehaviour")
    def querystring_caching_behaviour(self) -> builtins.str:
        return jsii.get(self, "querystringCachingBehaviour")

    @querystring_caching_behaviour.setter # type: ignore
    def querystring_caching_behaviour(self, value: builtins.str) -> None:
        jsii.set(self, "querystringCachingBehaviour", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CdnEndpointTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CdnEndpointTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "origin": "origin",
        "profile_name": "profileName",
        "resource_group_name": "resourceGroupName",
        "content_types_to_compress": "contentTypesToCompress",
        "delivery_rule": "deliveryRule",
        "geo_filter": "geoFilter",
        "global_delivery_rule": "globalDeliveryRule",
        "is_compression_enabled": "isCompressionEnabled",
        "is_http_allowed": "isHttpAllowed",
        "is_https_allowed": "isHttpsAllowed",
        "optimization_type": "optimizationType",
        "origin_host_header": "originHostHeader",
        "origin_path": "originPath",
        "probe_path": "probePath",
        "querystring_caching_behaviour": "querystringCachingBehaviour",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class CdnEndpointConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        origin: typing.List["CdnEndpointOrigin"],
        profile_name: builtins.str,
        resource_group_name: builtins.str,
        content_types_to_compress: typing.Optional[typing.List[builtins.str]] = None,
        delivery_rule: typing.Optional[typing.List["CdnEndpointDeliveryRule"]] = None,
        geo_filter: typing.Optional[typing.List["CdnEndpointGeoFilter"]] = None,
        global_delivery_rule: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRule"]] = None,
        is_compression_enabled: typing.Optional[builtins.bool] = None,
        is_http_allowed: typing.Optional[builtins.bool] = None,
        is_https_allowed: typing.Optional[builtins.bool] = None,
        optimization_type: typing.Optional[builtins.str] = None,
        origin_host_header: typing.Optional[builtins.str] = None,
        origin_path: typing.Optional[builtins.str] = None,
        probe_path: typing.Optional[builtins.str] = None,
        querystring_caching_behaviour: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CdnEndpointTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param origin: origin block.
        :param profile_name: -
        :param resource_group_name: -
        :param content_types_to_compress: -
        :param delivery_rule: delivery_rule block.
        :param geo_filter: geo_filter block.
        :param global_delivery_rule: global_delivery_rule block.
        :param is_compression_enabled: -
        :param is_http_allowed: -
        :param is_https_allowed: -
        :param optimization_type: -
        :param origin_host_header: -
        :param origin_path: -
        :param probe_path: -
        :param querystring_caching_behaviour: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CdnEndpointTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "origin": origin,
            "profile_name": profile_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if content_types_to_compress is not None:
            self._values["content_types_to_compress"] = content_types_to_compress
        if delivery_rule is not None:
            self._values["delivery_rule"] = delivery_rule
        if geo_filter is not None:
            self._values["geo_filter"] = geo_filter
        if global_delivery_rule is not None:
            self._values["global_delivery_rule"] = global_delivery_rule
        if is_compression_enabled is not None:
            self._values["is_compression_enabled"] = is_compression_enabled
        if is_http_allowed is not None:
            self._values["is_http_allowed"] = is_http_allowed
        if is_https_allowed is not None:
            self._values["is_https_allowed"] = is_https_allowed
        if optimization_type is not None:
            self._values["optimization_type"] = optimization_type
        if origin_host_header is not None:
            self._values["origin_host_header"] = origin_host_header
        if origin_path is not None:
            self._values["origin_path"] = origin_path
        if probe_path is not None:
            self._values["probe_path"] = probe_path
        if querystring_caching_behaviour is not None:
            self._values["querystring_caching_behaviour"] = querystring_caching_behaviour
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def origin(self) -> typing.List["CdnEndpointOrigin"]:
        """origin block."""
        result = self._values.get("origin")
        assert result is not None, "Required property 'origin' is missing"
        return result

    @builtins.property
    def profile_name(self) -> builtins.str:
        result = self._values.get("profile_name")
        assert result is not None, "Required property 'profile_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def content_types_to_compress(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("content_types_to_compress")
        return result

    @builtins.property
    def delivery_rule(self) -> typing.Optional[typing.List["CdnEndpointDeliveryRule"]]:
        """delivery_rule block."""
        result = self._values.get("delivery_rule")
        return result

    @builtins.property
    def geo_filter(self) -> typing.Optional[typing.List["CdnEndpointGeoFilter"]]:
        """geo_filter block."""
        result = self._values.get("geo_filter")
        return result

    @builtins.property
    def global_delivery_rule(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRule"]]:
        """global_delivery_rule block."""
        result = self._values.get("global_delivery_rule")
        return result

    @builtins.property
    def is_compression_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("is_compression_enabled")
        return result

    @builtins.property
    def is_http_allowed(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("is_http_allowed")
        return result

    @builtins.property
    def is_https_allowed(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("is_https_allowed")
        return result

    @builtins.property
    def optimization_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("optimization_type")
        return result

    @builtins.property
    def origin_host_header(self) -> typing.Optional[builtins.str]:
        result = self._values.get("origin_host_header")
        return result

    @builtins.property
    def origin_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("origin_path")
        return result

    @builtins.property
    def probe_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("probe_path")
        return result

    @builtins.property
    def querystring_caching_behaviour(self) -> typing.Optional[builtins.str]:
        result = self._values.get("querystring_caching_behaviour")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CdnEndpointTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "order": "order",
        "cache_expiration_action": "cacheExpirationAction",
        "cache_key_query_string_action": "cacheKeyQueryStringAction",
        "cookies_condition": "cookiesCondition",
        "device_condition": "deviceCondition",
        "http_version_condition": "httpVersionCondition",
        "modify_request_header_action": "modifyRequestHeaderAction",
        "modify_response_header_action": "modifyResponseHeaderAction",
        "post_arg_condition": "postArgCondition",
        "query_string_condition": "queryStringCondition",
        "remote_address_condition": "remoteAddressCondition",
        "request_body_condition": "requestBodyCondition",
        "request_header_condition": "requestHeaderCondition",
        "request_method_condition": "requestMethodCondition",
        "request_scheme_condition": "requestSchemeCondition",
        "request_uri_condition": "requestUriCondition",
        "url_file_extension_condition": "urlFileExtensionCondition",
        "url_file_name_condition": "urlFileNameCondition",
        "url_path_condition": "urlPathCondition",
        "url_redirect_action": "urlRedirectAction",
        "url_rewrite_action": "urlRewriteAction",
    },
)
class CdnEndpointDeliveryRule:
    def __init__(
        self,
        *,
        name: builtins.str,
        order: jsii.Number,
        cache_expiration_action: typing.Optional[typing.List["CdnEndpointDeliveryRuleCacheExpirationAction"]] = None,
        cache_key_query_string_action: typing.Optional[typing.List["CdnEndpointDeliveryRuleCacheKeyQueryStringAction"]] = None,
        cookies_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleCookiesCondition"]] = None,
        device_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleDeviceCondition"]] = None,
        http_version_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleHttpVersionCondition"]] = None,
        modify_request_header_action: typing.Optional[typing.List["CdnEndpointDeliveryRuleModifyRequestHeaderAction"]] = None,
        modify_response_header_action: typing.Optional[typing.List["CdnEndpointDeliveryRuleModifyResponseHeaderAction"]] = None,
        post_arg_condition: typing.Optional[typing.List["CdnEndpointDeliveryRulePostArgCondition"]] = None,
        query_string_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleQueryStringCondition"]] = None,
        remote_address_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleRemoteAddressCondition"]] = None,
        request_body_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestBodyCondition"]] = None,
        request_header_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestHeaderCondition"]] = None,
        request_method_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestMethodCondition"]] = None,
        request_scheme_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestSchemeCondition"]] = None,
        request_uri_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestUriCondition"]] = None,
        url_file_extension_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlFileExtensionCondition"]] = None,
        url_file_name_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlFileNameCondition"]] = None,
        url_path_condition: typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlPathCondition"]] = None,
        url_redirect_action: typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlRedirectAction"]] = None,
        url_rewrite_action: typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlRewriteAction"]] = None,
    ) -> None:
        """
        :param name: -
        :param order: -
        :param cache_expiration_action: cache_expiration_action block.
        :param cache_key_query_string_action: cache_key_query_string_action block.
        :param cookies_condition: cookies_condition block.
        :param device_condition: device_condition block.
        :param http_version_condition: http_version_condition block.
        :param modify_request_header_action: modify_request_header_action block.
        :param modify_response_header_action: modify_response_header_action block.
        :param post_arg_condition: post_arg_condition block.
        :param query_string_condition: query_string_condition block.
        :param remote_address_condition: remote_address_condition block.
        :param request_body_condition: request_body_condition block.
        :param request_header_condition: request_header_condition block.
        :param request_method_condition: request_method_condition block.
        :param request_scheme_condition: request_scheme_condition block.
        :param request_uri_condition: request_uri_condition block.
        :param url_file_extension_condition: url_file_extension_condition block.
        :param url_file_name_condition: url_file_name_condition block.
        :param url_path_condition: url_path_condition block.
        :param url_redirect_action: url_redirect_action block.
        :param url_rewrite_action: url_rewrite_action block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "order": order,
        }
        if cache_expiration_action is not None:
            self._values["cache_expiration_action"] = cache_expiration_action
        if cache_key_query_string_action is not None:
            self._values["cache_key_query_string_action"] = cache_key_query_string_action
        if cookies_condition is not None:
            self._values["cookies_condition"] = cookies_condition
        if device_condition is not None:
            self._values["device_condition"] = device_condition
        if http_version_condition is not None:
            self._values["http_version_condition"] = http_version_condition
        if modify_request_header_action is not None:
            self._values["modify_request_header_action"] = modify_request_header_action
        if modify_response_header_action is not None:
            self._values["modify_response_header_action"] = modify_response_header_action
        if post_arg_condition is not None:
            self._values["post_arg_condition"] = post_arg_condition
        if query_string_condition is not None:
            self._values["query_string_condition"] = query_string_condition
        if remote_address_condition is not None:
            self._values["remote_address_condition"] = remote_address_condition
        if request_body_condition is not None:
            self._values["request_body_condition"] = request_body_condition
        if request_header_condition is not None:
            self._values["request_header_condition"] = request_header_condition
        if request_method_condition is not None:
            self._values["request_method_condition"] = request_method_condition
        if request_scheme_condition is not None:
            self._values["request_scheme_condition"] = request_scheme_condition
        if request_uri_condition is not None:
            self._values["request_uri_condition"] = request_uri_condition
        if url_file_extension_condition is not None:
            self._values["url_file_extension_condition"] = url_file_extension_condition
        if url_file_name_condition is not None:
            self._values["url_file_name_condition"] = url_file_name_condition
        if url_path_condition is not None:
            self._values["url_path_condition"] = url_path_condition
        if url_redirect_action is not None:
            self._values["url_redirect_action"] = url_redirect_action
        if url_rewrite_action is not None:
            self._values["url_rewrite_action"] = url_rewrite_action

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def order(self) -> jsii.Number:
        result = self._values.get("order")
        assert result is not None, "Required property 'order' is missing"
        return result

    @builtins.property
    def cache_expiration_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleCacheExpirationAction"]]:
        """cache_expiration_action block."""
        result = self._values.get("cache_expiration_action")
        return result

    @builtins.property
    def cache_key_query_string_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleCacheKeyQueryStringAction"]]:
        """cache_key_query_string_action block."""
        result = self._values.get("cache_key_query_string_action")
        return result

    @builtins.property
    def cookies_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleCookiesCondition"]]:
        """cookies_condition block."""
        result = self._values.get("cookies_condition")
        return result

    @builtins.property
    def device_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleDeviceCondition"]]:
        """device_condition block."""
        result = self._values.get("device_condition")
        return result

    @builtins.property
    def http_version_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleHttpVersionCondition"]]:
        """http_version_condition block."""
        result = self._values.get("http_version_condition")
        return result

    @builtins.property
    def modify_request_header_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleModifyRequestHeaderAction"]]:
        """modify_request_header_action block."""
        result = self._values.get("modify_request_header_action")
        return result

    @builtins.property
    def modify_response_header_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleModifyResponseHeaderAction"]]:
        """modify_response_header_action block."""
        result = self._values.get("modify_response_header_action")
        return result

    @builtins.property
    def post_arg_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRulePostArgCondition"]]:
        """post_arg_condition block."""
        result = self._values.get("post_arg_condition")
        return result

    @builtins.property
    def query_string_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleQueryStringCondition"]]:
        """query_string_condition block."""
        result = self._values.get("query_string_condition")
        return result

    @builtins.property
    def remote_address_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleRemoteAddressCondition"]]:
        """remote_address_condition block."""
        result = self._values.get("remote_address_condition")
        return result

    @builtins.property
    def request_body_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestBodyCondition"]]:
        """request_body_condition block."""
        result = self._values.get("request_body_condition")
        return result

    @builtins.property
    def request_header_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestHeaderCondition"]]:
        """request_header_condition block."""
        result = self._values.get("request_header_condition")
        return result

    @builtins.property
    def request_method_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestMethodCondition"]]:
        """request_method_condition block."""
        result = self._values.get("request_method_condition")
        return result

    @builtins.property
    def request_scheme_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestSchemeCondition"]]:
        """request_scheme_condition block."""
        result = self._values.get("request_scheme_condition")
        return result

    @builtins.property
    def request_uri_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleRequestUriCondition"]]:
        """request_uri_condition block."""
        result = self._values.get("request_uri_condition")
        return result

    @builtins.property
    def url_file_extension_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlFileExtensionCondition"]]:
        """url_file_extension_condition block."""
        result = self._values.get("url_file_extension_condition")
        return result

    @builtins.property
    def url_file_name_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlFileNameCondition"]]:
        """url_file_name_condition block."""
        result = self._values.get("url_file_name_condition")
        return result

    @builtins.property
    def url_path_condition(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlPathCondition"]]:
        """url_path_condition block."""
        result = self._values.get("url_path_condition")
        return result

    @builtins.property
    def url_redirect_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlRedirectAction"]]:
        """url_redirect_action block."""
        result = self._values.get("url_redirect_action")
        return result

    @builtins.property
    def url_rewrite_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointDeliveryRuleUrlRewriteAction"]]:
        """url_rewrite_action block."""
        result = self._values.get("url_rewrite_action")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleCacheExpirationAction",
    jsii_struct_bases=[],
    name_mapping={"behavior": "behavior", "duration": "duration"},
)
class CdnEndpointDeliveryRuleCacheExpirationAction:
    def __init__(
        self,
        *,
        behavior: builtins.str,
        duration: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param behavior: -
        :param duration: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "behavior": behavior,
        }
        if duration is not None:
            self._values["duration"] = duration

    @builtins.property
    def behavior(self) -> builtins.str:
        result = self._values.get("behavior")
        assert result is not None, "Required property 'behavior' is missing"
        return result

    @builtins.property
    def duration(self) -> typing.Optional[builtins.str]:
        result = self._values.get("duration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleCacheExpirationAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleCacheKeyQueryStringAction",
    jsii_struct_bases=[],
    name_mapping={"behavior": "behavior", "parameters": "parameters"},
)
class CdnEndpointDeliveryRuleCacheKeyQueryStringAction:
    def __init__(
        self,
        *,
        behavior: builtins.str,
        parameters: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param behavior: -
        :param parameters: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "behavior": behavior,
        }
        if parameters is not None:
            self._values["parameters"] = parameters

    @builtins.property
    def behavior(self) -> builtins.str:
        result = self._values.get("behavior")
        assert result is not None, "Required property 'behavior' is missing"
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleCacheKeyQueryStringAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleCookiesCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "selector": "selector",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleCookiesCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        selector: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param selector: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
            "selector": selector,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def selector(self) -> builtins.str:
        result = self._values.get("selector")
        assert result is not None, "Required property 'selector' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleCookiesCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleDeviceCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "negate_condition": "negateCondition",
        "operator": "operator",
    },
)
class CdnEndpointDeliveryRuleDeviceCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        negate_condition: typing.Optional[builtins.bool] = None,
        operator: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param match_values: -
        :param negate_condition: -
        :param operator: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if operator is not None:
            self._values["operator"] = operator

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def operator(self) -> typing.Optional[builtins.str]:
        result = self._values.get("operator")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleDeviceCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleHttpVersionCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "negate_condition": "negateCondition",
        "operator": "operator",
    },
)
class CdnEndpointDeliveryRuleHttpVersionCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        negate_condition: typing.Optional[builtins.bool] = None,
        operator: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param match_values: -
        :param negate_condition: -
        :param operator: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if operator is not None:
            self._values["operator"] = operator

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def operator(self) -> typing.Optional[builtins.str]:
        result = self._values.get("operator")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleHttpVersionCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleModifyRequestHeaderAction",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "name": "name", "value": "value"},
)
class CdnEndpointDeliveryRuleModifyRequestHeaderAction:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        value: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
        }
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleModifyRequestHeaderAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleModifyResponseHeaderAction",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "name": "name", "value": "value"},
)
class CdnEndpointDeliveryRuleModifyResponseHeaderAction:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        value: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
        }
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleModifyResponseHeaderAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRulePostArgCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "selector": "selector",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRulePostArgCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        selector: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param selector: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
            "selector": selector,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def selector(self) -> builtins.str:
        result = self._values.get("selector")
        assert result is not None, "Required property 'selector' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRulePostArgCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleQueryStringCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleQueryStringCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleQueryStringCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleRemoteAddressCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "negate_condition": "negateCondition",
    },
)
class CdnEndpointDeliveryRuleRemoteAddressCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param negate_condition: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleRemoteAddressCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleRequestBodyCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleRequestBodyCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleRequestBodyCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleRequestHeaderCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "selector": "selector",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleRequestHeaderCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        selector: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param selector: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
            "selector": selector,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def selector(self) -> builtins.str:
        result = self._values.get("selector")
        assert result is not None, "Required property 'selector' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleRequestHeaderCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleRequestMethodCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "negate_condition": "negateCondition",
        "operator": "operator",
    },
)
class CdnEndpointDeliveryRuleRequestMethodCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        negate_condition: typing.Optional[builtins.bool] = None,
        operator: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param match_values: -
        :param negate_condition: -
        :param operator: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if operator is not None:
            self._values["operator"] = operator

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def operator(self) -> typing.Optional[builtins.str]:
        result = self._values.get("operator")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleRequestMethodCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleRequestSchemeCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "negate_condition": "negateCondition",
        "operator": "operator",
    },
)
class CdnEndpointDeliveryRuleRequestSchemeCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        negate_condition: typing.Optional[builtins.bool] = None,
        operator: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param match_values: -
        :param negate_condition: -
        :param operator: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if operator is not None:
            self._values["operator"] = operator

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def operator(self) -> typing.Optional[builtins.str]:
        result = self._values.get("operator")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleRequestSchemeCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleRequestUriCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleRequestUriCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleRequestUriCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleUrlFileExtensionCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleUrlFileExtensionCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleUrlFileExtensionCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleUrlFileNameCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleUrlFileNameCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleUrlFileNameCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleUrlPathCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "operator": "operator",
        "negate_condition": "negateCondition",
        "transforms": "transforms",
    },
)
class CdnEndpointDeliveryRuleUrlPathCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        operator: builtins.str,
        negate_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param operator: -
        :param negate_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "operator": operator,
        }
        if negate_condition is not None:
            self._values["negate_condition"] = negate_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negate_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negate_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleUrlPathCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleUrlRedirectAction",
    jsii_struct_bases=[],
    name_mapping={
        "redirect_type": "redirectType",
        "fragment": "fragment",
        "hostname": "hostname",
        "path": "path",
        "protocol": "protocol",
        "query_string": "queryString",
    },
)
class CdnEndpointDeliveryRuleUrlRedirectAction:
    def __init__(
        self,
        *,
        redirect_type: builtins.str,
        fragment: typing.Optional[builtins.str] = None,
        hostname: typing.Optional[builtins.str] = None,
        path: typing.Optional[builtins.str] = None,
        protocol: typing.Optional[builtins.str] = None,
        query_string: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param redirect_type: -
        :param fragment: -
        :param hostname: -
        :param path: -
        :param protocol: -
        :param query_string: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "redirect_type": redirect_type,
        }
        if fragment is not None:
            self._values["fragment"] = fragment
        if hostname is not None:
            self._values["hostname"] = hostname
        if path is not None:
            self._values["path"] = path
        if protocol is not None:
            self._values["protocol"] = protocol
        if query_string is not None:
            self._values["query_string"] = query_string

    @builtins.property
    def redirect_type(self) -> builtins.str:
        result = self._values.get("redirect_type")
        assert result is not None, "Required property 'redirect_type' is missing"
        return result

    @builtins.property
    def fragment(self) -> typing.Optional[builtins.str]:
        result = self._values.get("fragment")
        return result

    @builtins.property
    def hostname(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hostname")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protocol")
        return result

    @builtins.property
    def query_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("query_string")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleUrlRedirectAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointDeliveryRuleUrlRewriteAction",
    jsii_struct_bases=[],
    name_mapping={
        "destination": "destination",
        "source_pattern": "sourcePattern",
        "preserve_unmatched_path": "preserveUnmatchedPath",
    },
)
class CdnEndpointDeliveryRuleUrlRewriteAction:
    def __init__(
        self,
        *,
        destination: builtins.str,
        source_pattern: builtins.str,
        preserve_unmatched_path: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param destination: -
        :param source_pattern: -
        :param preserve_unmatched_path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destination": destination,
            "source_pattern": source_pattern,
        }
        if preserve_unmatched_path is not None:
            self._values["preserve_unmatched_path"] = preserve_unmatched_path

    @builtins.property
    def destination(self) -> builtins.str:
        result = self._values.get("destination")
        assert result is not None, "Required property 'destination' is missing"
        return result

    @builtins.property
    def source_pattern(self) -> builtins.str:
        result = self._values.get("source_pattern")
        assert result is not None, "Required property 'source_pattern' is missing"
        return result

    @builtins.property
    def preserve_unmatched_path(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("preserve_unmatched_path")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointDeliveryRuleUrlRewriteAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGeoFilter",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "country_codes": "countryCodes",
        "relative_path": "relativePath",
    },
)
class CdnEndpointGeoFilter:
    def __init__(
        self,
        *,
        action: builtins.str,
        country_codes: typing.List[builtins.str],
        relative_path: builtins.str,
    ) -> None:
        """
        :param action: -
        :param country_codes: -
        :param relative_path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "country_codes": country_codes,
            "relative_path": relative_path,
        }

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def country_codes(self) -> typing.List[builtins.str]:
        result = self._values.get("country_codes")
        assert result is not None, "Required property 'country_codes' is missing"
        return result

    @builtins.property
    def relative_path(self) -> builtins.str:
        result = self._values.get("relative_path")
        assert result is not None, "Required property 'relative_path' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGeoFilter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGlobalDeliveryRule",
    jsii_struct_bases=[],
    name_mapping={
        "cache_expiration_action": "cacheExpirationAction",
        "cache_key_query_string_action": "cacheKeyQueryStringAction",
        "modify_request_header_action": "modifyRequestHeaderAction",
        "modify_response_header_action": "modifyResponseHeaderAction",
        "url_redirect_action": "urlRedirectAction",
        "url_rewrite_action": "urlRewriteAction",
    },
)
class CdnEndpointGlobalDeliveryRule:
    def __init__(
        self,
        *,
        cache_expiration_action: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleCacheExpirationAction"]] = None,
        cache_key_query_string_action: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleCacheKeyQueryStringAction"]] = None,
        modify_request_header_action: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleModifyRequestHeaderAction"]] = None,
        modify_response_header_action: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleModifyResponseHeaderAction"]] = None,
        url_redirect_action: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleUrlRedirectAction"]] = None,
        url_rewrite_action: typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleUrlRewriteAction"]] = None,
    ) -> None:
        """
        :param cache_expiration_action: cache_expiration_action block.
        :param cache_key_query_string_action: cache_key_query_string_action block.
        :param modify_request_header_action: modify_request_header_action block.
        :param modify_response_header_action: modify_response_header_action block.
        :param url_redirect_action: url_redirect_action block.
        :param url_rewrite_action: url_rewrite_action block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if cache_expiration_action is not None:
            self._values["cache_expiration_action"] = cache_expiration_action
        if cache_key_query_string_action is not None:
            self._values["cache_key_query_string_action"] = cache_key_query_string_action
        if modify_request_header_action is not None:
            self._values["modify_request_header_action"] = modify_request_header_action
        if modify_response_header_action is not None:
            self._values["modify_response_header_action"] = modify_response_header_action
        if url_redirect_action is not None:
            self._values["url_redirect_action"] = url_redirect_action
        if url_rewrite_action is not None:
            self._values["url_rewrite_action"] = url_rewrite_action

    @builtins.property
    def cache_expiration_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleCacheExpirationAction"]]:
        """cache_expiration_action block."""
        result = self._values.get("cache_expiration_action")
        return result

    @builtins.property
    def cache_key_query_string_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleCacheKeyQueryStringAction"]]:
        """cache_key_query_string_action block."""
        result = self._values.get("cache_key_query_string_action")
        return result

    @builtins.property
    def modify_request_header_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleModifyRequestHeaderAction"]]:
        """modify_request_header_action block."""
        result = self._values.get("modify_request_header_action")
        return result

    @builtins.property
    def modify_response_header_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleModifyResponseHeaderAction"]]:
        """modify_response_header_action block."""
        result = self._values.get("modify_response_header_action")
        return result

    @builtins.property
    def url_redirect_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleUrlRedirectAction"]]:
        """url_redirect_action block."""
        result = self._values.get("url_redirect_action")
        return result

    @builtins.property
    def url_rewrite_action(
        self,
    ) -> typing.Optional[typing.List["CdnEndpointGlobalDeliveryRuleUrlRewriteAction"]]:
        """url_rewrite_action block."""
        result = self._values.get("url_rewrite_action")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGlobalDeliveryRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGlobalDeliveryRuleCacheExpirationAction",
    jsii_struct_bases=[],
    name_mapping={"behavior": "behavior", "duration": "duration"},
)
class CdnEndpointGlobalDeliveryRuleCacheExpirationAction:
    def __init__(
        self,
        *,
        behavior: builtins.str,
        duration: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param behavior: -
        :param duration: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "behavior": behavior,
        }
        if duration is not None:
            self._values["duration"] = duration

    @builtins.property
    def behavior(self) -> builtins.str:
        result = self._values.get("behavior")
        assert result is not None, "Required property 'behavior' is missing"
        return result

    @builtins.property
    def duration(self) -> typing.Optional[builtins.str]:
        result = self._values.get("duration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGlobalDeliveryRuleCacheExpirationAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGlobalDeliveryRuleCacheKeyQueryStringAction",
    jsii_struct_bases=[],
    name_mapping={"behavior": "behavior", "parameters": "parameters"},
)
class CdnEndpointGlobalDeliveryRuleCacheKeyQueryStringAction:
    def __init__(
        self,
        *,
        behavior: builtins.str,
        parameters: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param behavior: -
        :param parameters: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "behavior": behavior,
        }
        if parameters is not None:
            self._values["parameters"] = parameters

    @builtins.property
    def behavior(self) -> builtins.str:
        result = self._values.get("behavior")
        assert result is not None, "Required property 'behavior' is missing"
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGlobalDeliveryRuleCacheKeyQueryStringAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGlobalDeliveryRuleModifyRequestHeaderAction",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "name": "name", "value": "value"},
)
class CdnEndpointGlobalDeliveryRuleModifyRequestHeaderAction:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        value: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
        }
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGlobalDeliveryRuleModifyRequestHeaderAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGlobalDeliveryRuleModifyResponseHeaderAction",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "name": "name", "value": "value"},
)
class CdnEndpointGlobalDeliveryRuleModifyResponseHeaderAction:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        value: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
        }
        if value is not None:
            self._values["value"] = value

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("value")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGlobalDeliveryRuleModifyResponseHeaderAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGlobalDeliveryRuleUrlRedirectAction",
    jsii_struct_bases=[],
    name_mapping={
        "redirect_type": "redirectType",
        "fragment": "fragment",
        "hostname": "hostname",
        "path": "path",
        "protocol": "protocol",
        "query_string": "queryString",
    },
)
class CdnEndpointGlobalDeliveryRuleUrlRedirectAction:
    def __init__(
        self,
        *,
        redirect_type: builtins.str,
        fragment: typing.Optional[builtins.str] = None,
        hostname: typing.Optional[builtins.str] = None,
        path: typing.Optional[builtins.str] = None,
        protocol: typing.Optional[builtins.str] = None,
        query_string: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param redirect_type: -
        :param fragment: -
        :param hostname: -
        :param path: -
        :param protocol: -
        :param query_string: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "redirect_type": redirect_type,
        }
        if fragment is not None:
            self._values["fragment"] = fragment
        if hostname is not None:
            self._values["hostname"] = hostname
        if path is not None:
            self._values["path"] = path
        if protocol is not None:
            self._values["protocol"] = protocol
        if query_string is not None:
            self._values["query_string"] = query_string

    @builtins.property
    def redirect_type(self) -> builtins.str:
        result = self._values.get("redirect_type")
        assert result is not None, "Required property 'redirect_type' is missing"
        return result

    @builtins.property
    def fragment(self) -> typing.Optional[builtins.str]:
        result = self._values.get("fragment")
        return result

    @builtins.property
    def hostname(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hostname")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protocol")
        return result

    @builtins.property
    def query_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("query_string")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGlobalDeliveryRuleUrlRedirectAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointGlobalDeliveryRuleUrlRewriteAction",
    jsii_struct_bases=[],
    name_mapping={
        "destination": "destination",
        "source_pattern": "sourcePattern",
        "preserve_unmatched_path": "preserveUnmatchedPath",
    },
)
class CdnEndpointGlobalDeliveryRuleUrlRewriteAction:
    def __init__(
        self,
        *,
        destination: builtins.str,
        source_pattern: builtins.str,
        preserve_unmatched_path: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param destination: -
        :param source_pattern: -
        :param preserve_unmatched_path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destination": destination,
            "source_pattern": source_pattern,
        }
        if preserve_unmatched_path is not None:
            self._values["preserve_unmatched_path"] = preserve_unmatched_path

    @builtins.property
    def destination(self) -> builtins.str:
        result = self._values.get("destination")
        assert result is not None, "Required property 'destination' is missing"
        return result

    @builtins.property
    def source_pattern(self) -> builtins.str:
        result = self._values.get("source_pattern")
        assert result is not None, "Required property 'source_pattern' is missing"
        return result

    @builtins.property
    def preserve_unmatched_path(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("preserve_unmatched_path")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointGlobalDeliveryRuleUrlRewriteAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointOrigin",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "name": "name",
        "http_port": "httpPort",
        "https_port": "httpsPort",
    },
)
class CdnEndpointOrigin:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        name: builtins.str,
        http_port: typing.Optional[jsii.Number] = None,
        https_port: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param host_name: -
        :param name: -
        :param http_port: -
        :param https_port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
            "name": name,
        }
        if http_port is not None:
            self._values["http_port"] = http_port
        if https_port is not None:
            self._values["https_port"] = https_port

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def http_port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("http_port")
        return result

    @builtins.property
    def https_port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("https_port")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointOrigin(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnEndpointTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CdnEndpointTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnEndpointTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CdnProfile(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CdnProfile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CdnProfileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CdnProfileConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CdnProfile, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CdnProfileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CdnProfileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CdnProfileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CdnProfileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class CdnProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CdnProfileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CdnProfileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CdnProfileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnProfileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CdnProfileTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CdnProfileTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CdnProfileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CognitiveAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CognitiveAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        kind: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        qna_runtime_endpoint: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CognitiveAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param kind: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param qna_runtime_endpoint: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CognitiveAccountConfig(
            kind=kind,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            qna_runtime_endpoint=qna_runtime_endpoint,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CognitiveAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetQnaRuntimeEndpoint")
    def reset_qna_runtime_endpoint(self) -> None:
        return jsii.invoke(self, "resetQnaRuntimeEndpoint", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kindInput")
    def kind_input(self) -> builtins.str:
        return jsii.get(self, "kindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="qnaRuntimeEndpointInput")
    def qna_runtime_endpoint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "qnaRuntimeEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CognitiveAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @kind.setter # type: ignore
    def kind(self, value: builtins.str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="qnaRuntimeEndpoint")
    def qna_runtime_endpoint(self) -> builtins.str:
        return jsii.get(self, "qnaRuntimeEndpoint")

    @qna_runtime_endpoint.setter # type: ignore
    def qna_runtime_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "qnaRuntimeEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CognitiveAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CognitiveAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CognitiveAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "kind": "kind",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "qna_runtime_endpoint": "qnaRuntimeEndpoint",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class CognitiveAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        kind: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        qna_runtime_endpoint: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CognitiveAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param kind: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param qna_runtime_endpoint: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CognitiveAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "kind": kind,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if qna_runtime_endpoint is not None:
            self._values["qna_runtime_endpoint"] = qna_runtime_endpoint
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def kind(self) -> builtins.str:
        result = self._values.get("kind")
        assert result is not None, "Required property 'kind' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def qna_runtime_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("qna_runtime_endpoint")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CognitiveAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CognitiveAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CognitiveAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CognitiveAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CognitiveAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ContainerGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ContainerGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        container: typing.List["ContainerGroupContainer"],
        location: builtins.str,
        name: builtins.str,
        os_type: builtins.str,
        resource_group_name: builtins.str,
        diagnostics: typing.Optional[typing.List["ContainerGroupDiagnostics"]] = None,
        dns_config: typing.Optional[typing.List["ContainerGroupDnsConfig"]] = None,
        dns_name_label: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["ContainerGroupIdentity"]] = None,
        image_registry_credential: typing.Optional[typing.List["ContainerGroupImageRegistryCredential"]] = None,
        ip_address_type: typing.Optional[builtins.str] = None,
        network_profile_id: typing.Optional[builtins.str] = None,
        restart_policy: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ContainerGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param container: container block.
        :param location: -
        :param name: -
        :param os_type: -
        :param resource_group_name: -
        :param diagnostics: diagnostics block.
        :param dns_config: dns_config block.
        :param dns_name_label: -
        :param identity: identity block.
        :param image_registry_credential: image_registry_credential block.
        :param ip_address_type: -
        :param network_profile_id: -
        :param restart_policy: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerGroupConfig(
            container=container,
            location=location,
            name=name,
            os_type=os_type,
            resource_group_name=resource_group_name,
            diagnostics=diagnostics,
            dns_config=dns_config,
            dns_name_label=dns_name_label,
            identity=identity,
            image_registry_credential=image_registry_credential,
            ip_address_type=ip_address_type,
            network_profile_id=network_profile_id,
            restart_policy=restart_policy,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ContainerGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetDiagnostics")
    def reset_diagnostics(self) -> None:
        return jsii.invoke(self, "resetDiagnostics", [])

    @jsii.member(jsii_name="resetDnsConfig")
    def reset_dns_config(self) -> None:
        return jsii.invoke(self, "resetDnsConfig", [])

    @jsii.member(jsii_name="resetDnsNameLabel")
    def reset_dns_name_label(self) -> None:
        return jsii.invoke(self, "resetDnsNameLabel", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetImageRegistryCredential")
    def reset_image_registry_credential(self) -> None:
        return jsii.invoke(self, "resetImageRegistryCredential", [])

    @jsii.member(jsii_name="resetIpAddressType")
    def reset_ip_address_type(self) -> None:
        return jsii.invoke(self, "resetIpAddressType", [])

    @jsii.member(jsii_name="resetNetworkProfileId")
    def reset_network_profile_id(self) -> None:
        return jsii.invoke(self, "resetNetworkProfileId", [])

    @jsii.member(jsii_name="resetRestartPolicy")
    def reset_restart_policy(self) -> None:
        return jsii.invoke(self, "resetRestartPolicy", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerInput")
    def container_input(self) -> typing.List["ContainerGroupContainer"]:
        return jsii.get(self, "containerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osTypeInput")
    def os_type_input(self) -> builtins.str:
        return jsii.get(self, "osTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diagnosticsInput")
    def diagnostics_input(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupDiagnostics"]]:
        return jsii.get(self, "diagnosticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsConfigInput")
    def dns_config_input(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupDnsConfig"]]:
        return jsii.get(self, "dnsConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsNameLabelInput")
    def dns_name_label_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dnsNameLabelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["ContainerGroupIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageRegistryCredentialInput")
    def image_registry_credential_input(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupImageRegistryCredential"]]:
        return jsii.get(self, "imageRegistryCredentialInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddressTypeInput")
    def ip_address_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "ipAddressTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfileIdInput")
    def network_profile_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "networkProfileIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restartPolicyInput")
    def restart_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "restartPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ContainerGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="container")
    def container(self) -> typing.List["ContainerGroupContainer"]:
        return jsii.get(self, "container")

    @container.setter # type: ignore
    def container(self, value: typing.List["ContainerGroupContainer"]) -> None:
        jsii.set(self, "container", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diagnostics")
    def diagnostics(self) -> typing.List["ContainerGroupDiagnostics"]:
        return jsii.get(self, "diagnostics")

    @diagnostics.setter # type: ignore
    def diagnostics(self, value: typing.List["ContainerGroupDiagnostics"]) -> None:
        jsii.set(self, "diagnostics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsConfig")
    def dns_config(self) -> typing.List["ContainerGroupDnsConfig"]:
        return jsii.get(self, "dnsConfig")

    @dns_config.setter # type: ignore
    def dns_config(self, value: typing.List["ContainerGroupDnsConfig"]) -> None:
        jsii.set(self, "dnsConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsNameLabel")
    def dns_name_label(self) -> builtins.str:
        return jsii.get(self, "dnsNameLabel")

    @dns_name_label.setter # type: ignore
    def dns_name_label(self, value: builtins.str) -> None:
        jsii.set(self, "dnsNameLabel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["ContainerGroupIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["ContainerGroupIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageRegistryCredential")
    def image_registry_credential(
        self,
    ) -> typing.List["ContainerGroupImageRegistryCredential"]:
        return jsii.get(self, "imageRegistryCredential")

    @image_registry_credential.setter # type: ignore
    def image_registry_credential(
        self,
        value: typing.List["ContainerGroupImageRegistryCredential"],
    ) -> None:
        jsii.set(self, "imageRegistryCredential", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddressType")
    def ip_address_type(self) -> builtins.str:
        return jsii.get(self, "ipAddressType")

    @ip_address_type.setter # type: ignore
    def ip_address_type(self, value: builtins.str) -> None:
        jsii.set(self, "ipAddressType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfileId")
    def network_profile_id(self) -> builtins.str:
        return jsii.get(self, "networkProfileId")

    @network_profile_id.setter # type: ignore
    def network_profile_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkProfileId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @os_type.setter # type: ignore
    def os_type(self, value: builtins.str) -> None:
        jsii.set(self, "osType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restartPolicy")
    def restart_policy(self) -> builtins.str:
        return jsii.get(self, "restartPolicy")

    @restart_policy.setter # type: ignore
    def restart_policy(self, value: builtins.str) -> None:
        jsii.set(self, "restartPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ContainerGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ContainerGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "container": "container",
        "location": "location",
        "name": "name",
        "os_type": "osType",
        "resource_group_name": "resourceGroupName",
        "diagnostics": "diagnostics",
        "dns_config": "dnsConfig",
        "dns_name_label": "dnsNameLabel",
        "identity": "identity",
        "image_registry_credential": "imageRegistryCredential",
        "ip_address_type": "ipAddressType",
        "network_profile_id": "networkProfileId",
        "restart_policy": "restartPolicy",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ContainerGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        container: typing.List["ContainerGroupContainer"],
        location: builtins.str,
        name: builtins.str,
        os_type: builtins.str,
        resource_group_name: builtins.str,
        diagnostics: typing.Optional[typing.List["ContainerGroupDiagnostics"]] = None,
        dns_config: typing.Optional[typing.List["ContainerGroupDnsConfig"]] = None,
        dns_name_label: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["ContainerGroupIdentity"]] = None,
        image_registry_credential: typing.Optional[typing.List["ContainerGroupImageRegistryCredential"]] = None,
        ip_address_type: typing.Optional[builtins.str] = None,
        network_profile_id: typing.Optional[builtins.str] = None,
        restart_policy: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ContainerGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param container: container block.
        :param location: -
        :param name: -
        :param os_type: -
        :param resource_group_name: -
        :param diagnostics: diagnostics block.
        :param dns_config: dns_config block.
        :param dns_name_label: -
        :param identity: identity block.
        :param image_registry_credential: image_registry_credential block.
        :param ip_address_type: -
        :param network_profile_id: -
        :param restart_policy: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ContainerGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "container": container,
            "location": location,
            "name": name,
            "os_type": os_type,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if diagnostics is not None:
            self._values["diagnostics"] = diagnostics
        if dns_config is not None:
            self._values["dns_config"] = dns_config
        if dns_name_label is not None:
            self._values["dns_name_label"] = dns_name_label
        if identity is not None:
            self._values["identity"] = identity
        if image_registry_credential is not None:
            self._values["image_registry_credential"] = image_registry_credential
        if ip_address_type is not None:
            self._values["ip_address_type"] = ip_address_type
        if network_profile_id is not None:
            self._values["network_profile_id"] = network_profile_id
        if restart_policy is not None:
            self._values["restart_policy"] = restart_policy
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def container(self) -> typing.List["ContainerGroupContainer"]:
        """container block."""
        result = self._values.get("container")
        assert result is not None, "Required property 'container' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def os_type(self) -> builtins.str:
        result = self._values.get("os_type")
        assert result is not None, "Required property 'os_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def diagnostics(self) -> typing.Optional[typing.List["ContainerGroupDiagnostics"]]:
        """diagnostics block."""
        result = self._values.get("diagnostics")
        return result

    @builtins.property
    def dns_config(self) -> typing.Optional[typing.List["ContainerGroupDnsConfig"]]:
        """dns_config block."""
        result = self._values.get("dns_config")
        return result

    @builtins.property
    def dns_name_label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dns_name_label")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["ContainerGroupIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def image_registry_credential(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupImageRegistryCredential"]]:
        """image_registry_credential block."""
        result = self._values.get("image_registry_credential")
        return result

    @builtins.property
    def ip_address_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address_type")
        return result

    @builtins.property
    def network_profile_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("network_profile_id")
        return result

    @builtins.property
    def restart_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("restart_policy")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ContainerGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainer",
    jsii_struct_bases=[],
    name_mapping={
        "cpu": "cpu",
        "image": "image",
        "memory": "memory",
        "name": "name",
        "commands": "commands",
        "environment_variables": "environmentVariables",
        "gpu": "gpu",
        "liveness_probe": "livenessProbe",
        "ports": "ports",
        "readiness_probe": "readinessProbe",
        "secure_environment_variables": "secureEnvironmentVariables",
        "volume": "volume",
    },
)
class ContainerGroupContainer:
    def __init__(
        self,
        *,
        cpu: jsii.Number,
        image: builtins.str,
        memory: jsii.Number,
        name: builtins.str,
        commands: typing.Optional[typing.List[builtins.str]] = None,
        environment_variables: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        gpu: typing.Optional[typing.List["ContainerGroupContainerGpu"]] = None,
        liveness_probe: typing.Optional[typing.List["ContainerGroupContainerLivenessProbe"]] = None,
        ports: typing.Optional[typing.List["ContainerGroupContainerPorts"]] = None,
        readiness_probe: typing.Optional[typing.List["ContainerGroupContainerReadinessProbe"]] = None,
        secure_environment_variables: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        volume: typing.Optional[typing.List["ContainerGroupContainerVolume"]] = None,
    ) -> None:
        """
        :param cpu: -
        :param image: -
        :param memory: -
        :param name: -
        :param commands: -
        :param environment_variables: -
        :param gpu: gpu block.
        :param liveness_probe: liveness_probe block.
        :param ports: ports block.
        :param readiness_probe: readiness_probe block.
        :param secure_environment_variables: -
        :param volume: volume block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "cpu": cpu,
            "image": image,
            "memory": memory,
            "name": name,
        }
        if commands is not None:
            self._values["commands"] = commands
        if environment_variables is not None:
            self._values["environment_variables"] = environment_variables
        if gpu is not None:
            self._values["gpu"] = gpu
        if liveness_probe is not None:
            self._values["liveness_probe"] = liveness_probe
        if ports is not None:
            self._values["ports"] = ports
        if readiness_probe is not None:
            self._values["readiness_probe"] = readiness_probe
        if secure_environment_variables is not None:
            self._values["secure_environment_variables"] = secure_environment_variables
        if volume is not None:
            self._values["volume"] = volume

    @builtins.property
    def cpu(self) -> jsii.Number:
        result = self._values.get("cpu")
        assert result is not None, "Required property 'cpu' is missing"
        return result

    @builtins.property
    def image(self) -> builtins.str:
        result = self._values.get("image")
        assert result is not None, "Required property 'image' is missing"
        return result

    @builtins.property
    def memory(self) -> jsii.Number:
        result = self._values.get("memory")
        assert result is not None, "Required property 'memory' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def commands(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("commands")
        return result

    @builtins.property
    def environment_variables(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("environment_variables")
        return result

    @builtins.property
    def gpu(self) -> typing.Optional[typing.List["ContainerGroupContainerGpu"]]:
        """gpu block."""
        result = self._values.get("gpu")
        return result

    @builtins.property
    def liveness_probe(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupContainerLivenessProbe"]]:
        """liveness_probe block."""
        result = self._values.get("liveness_probe")
        return result

    @builtins.property
    def ports(self) -> typing.Optional[typing.List["ContainerGroupContainerPorts"]]:
        """ports block."""
        result = self._values.get("ports")
        return result

    @builtins.property
    def readiness_probe(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupContainerReadinessProbe"]]:
        """readiness_probe block."""
        result = self._values.get("readiness_probe")
        return result

    @builtins.property
    def secure_environment_variables(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("secure_environment_variables")
        return result

    @builtins.property
    def volume(self) -> typing.Optional[typing.List["ContainerGroupContainerVolume"]]:
        """volume block."""
        result = self._values.get("volume")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainer(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerGpu",
    jsii_struct_bases=[],
    name_mapping={"count": "count", "sku": "sku"},
)
class ContainerGroupContainerGpu:
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        sku: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: -
        :param sku: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if sku is not None:
            self._values["sku"] = sku

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("count")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerGpu(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerLivenessProbe",
    jsii_struct_bases=[],
    name_mapping={
        "exec": "exec",
        "failure_threshold": "failureThreshold",
        "http_get": "httpGet",
        "initial_delay_seconds": "initialDelaySeconds",
        "period_seconds": "periodSeconds",
        "success_threshold": "successThreshold",
        "timeout_seconds": "timeoutSeconds",
    },
)
class ContainerGroupContainerLivenessProbe:
    def __init__(
        self,
        *,
        exec: typing.Optional[typing.List[builtins.str]] = None,
        failure_threshold: typing.Optional[jsii.Number] = None,
        http_get: typing.Optional[typing.List["ContainerGroupContainerLivenessProbeHttpGet"]] = None,
        initial_delay_seconds: typing.Optional[jsii.Number] = None,
        period_seconds: typing.Optional[jsii.Number] = None,
        success_threshold: typing.Optional[jsii.Number] = None,
        timeout_seconds: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param exec: -
        :param failure_threshold: -
        :param http_get: http_get block.
        :param initial_delay_seconds: -
        :param period_seconds: -
        :param success_threshold: -
        :param timeout_seconds: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if exec is not None:
            self._values["exec"] = exec
        if failure_threshold is not None:
            self._values["failure_threshold"] = failure_threshold
        if http_get is not None:
            self._values["http_get"] = http_get
        if initial_delay_seconds is not None:
            self._values["initial_delay_seconds"] = initial_delay_seconds
        if period_seconds is not None:
            self._values["period_seconds"] = period_seconds
        if success_threshold is not None:
            self._values["success_threshold"] = success_threshold
        if timeout_seconds is not None:
            self._values["timeout_seconds"] = timeout_seconds

    @builtins.property
    def exec(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("exec")
        return result

    @builtins.property
    def failure_threshold(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("failure_threshold")
        return result

    @builtins.property
    def http_get(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupContainerLivenessProbeHttpGet"]]:
        """http_get block."""
        result = self._values.get("http_get")
        return result

    @builtins.property
    def initial_delay_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("initial_delay_seconds")
        return result

    @builtins.property
    def period_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("period_seconds")
        return result

    @builtins.property
    def success_threshold(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("success_threshold")
        return result

    @builtins.property
    def timeout_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("timeout_seconds")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerLivenessProbe(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerLivenessProbeHttpGet",
    jsii_struct_bases=[],
    name_mapping={"path": "path", "port": "port", "scheme": "scheme"},
)
class ContainerGroupContainerLivenessProbeHttpGet:
    def __init__(
        self,
        *,
        path: typing.Optional[builtins.str] = None,
        port: typing.Optional[jsii.Number] = None,
        scheme: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param path: -
        :param port: -
        :param scheme: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if path is not None:
            self._values["path"] = path
        if port is not None:
            self._values["port"] = port
        if scheme is not None:
            self._values["scheme"] = scheme

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    @builtins.property
    def scheme(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scheme")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerLivenessProbeHttpGet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerPorts",
    jsii_struct_bases=[],
    name_mapping={"port": "port", "protocol": "protocol"},
)
class ContainerGroupContainerPorts:
    def __init__(
        self,
        *,
        port: typing.Optional[jsii.Number] = None,
        protocol: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param port: -
        :param protocol: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if port is not None:
            self._values["port"] = port
        if protocol is not None:
            self._values["protocol"] = protocol

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    @builtins.property
    def protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protocol")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerPorts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerReadinessProbe",
    jsii_struct_bases=[],
    name_mapping={
        "exec": "exec",
        "failure_threshold": "failureThreshold",
        "http_get": "httpGet",
        "initial_delay_seconds": "initialDelaySeconds",
        "period_seconds": "periodSeconds",
        "success_threshold": "successThreshold",
        "timeout_seconds": "timeoutSeconds",
    },
)
class ContainerGroupContainerReadinessProbe:
    def __init__(
        self,
        *,
        exec: typing.Optional[typing.List[builtins.str]] = None,
        failure_threshold: typing.Optional[jsii.Number] = None,
        http_get: typing.Optional[typing.List["ContainerGroupContainerReadinessProbeHttpGet"]] = None,
        initial_delay_seconds: typing.Optional[jsii.Number] = None,
        period_seconds: typing.Optional[jsii.Number] = None,
        success_threshold: typing.Optional[jsii.Number] = None,
        timeout_seconds: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param exec: -
        :param failure_threshold: -
        :param http_get: http_get block.
        :param initial_delay_seconds: -
        :param period_seconds: -
        :param success_threshold: -
        :param timeout_seconds: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if exec is not None:
            self._values["exec"] = exec
        if failure_threshold is not None:
            self._values["failure_threshold"] = failure_threshold
        if http_get is not None:
            self._values["http_get"] = http_get
        if initial_delay_seconds is not None:
            self._values["initial_delay_seconds"] = initial_delay_seconds
        if period_seconds is not None:
            self._values["period_seconds"] = period_seconds
        if success_threshold is not None:
            self._values["success_threshold"] = success_threshold
        if timeout_seconds is not None:
            self._values["timeout_seconds"] = timeout_seconds

    @builtins.property
    def exec(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("exec")
        return result

    @builtins.property
    def failure_threshold(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("failure_threshold")
        return result

    @builtins.property
    def http_get(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupContainerReadinessProbeHttpGet"]]:
        """http_get block."""
        result = self._values.get("http_get")
        return result

    @builtins.property
    def initial_delay_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("initial_delay_seconds")
        return result

    @builtins.property
    def period_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("period_seconds")
        return result

    @builtins.property
    def success_threshold(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("success_threshold")
        return result

    @builtins.property
    def timeout_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("timeout_seconds")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerReadinessProbe(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerReadinessProbeHttpGet",
    jsii_struct_bases=[],
    name_mapping={"path": "path", "port": "port", "scheme": "scheme"},
)
class ContainerGroupContainerReadinessProbeHttpGet:
    def __init__(
        self,
        *,
        path: typing.Optional[builtins.str] = None,
        port: typing.Optional[jsii.Number] = None,
        scheme: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param path: -
        :param port: -
        :param scheme: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if path is not None:
            self._values["path"] = path
        if port is not None:
            self._values["port"] = port
        if scheme is not None:
            self._values["scheme"] = scheme

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    @builtins.property
    def scheme(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scheme")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerReadinessProbeHttpGet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerVolume",
    jsii_struct_bases=[],
    name_mapping={
        "mount_path": "mountPath",
        "name": "name",
        "git_repo": "gitRepo",
        "read_only": "readOnly",
        "secret": "secret",
        "share_name": "shareName",
        "storage_account_key": "storageAccountKey",
        "storage_account_name": "storageAccountName",
    },
)
class ContainerGroupContainerVolume:
    def __init__(
        self,
        *,
        mount_path: builtins.str,
        name: builtins.str,
        git_repo: typing.Optional[typing.List["ContainerGroupContainerVolumeGitRepo"]] = None,
        read_only: typing.Optional[builtins.bool] = None,
        secret: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        share_name: typing.Optional[builtins.str] = None,
        storage_account_key: typing.Optional[builtins.str] = None,
        storage_account_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param mount_path: -
        :param name: -
        :param git_repo: git_repo block.
        :param read_only: -
        :param secret: -
        :param share_name: -
        :param storage_account_key: -
        :param storage_account_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "mount_path": mount_path,
            "name": name,
        }
        if git_repo is not None:
            self._values["git_repo"] = git_repo
        if read_only is not None:
            self._values["read_only"] = read_only
        if secret is not None:
            self._values["secret"] = secret
        if share_name is not None:
            self._values["share_name"] = share_name
        if storage_account_key is not None:
            self._values["storage_account_key"] = storage_account_key
        if storage_account_name is not None:
            self._values["storage_account_name"] = storage_account_name

    @builtins.property
    def mount_path(self) -> builtins.str:
        result = self._values.get("mount_path")
        assert result is not None, "Required property 'mount_path' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def git_repo(
        self,
    ) -> typing.Optional[typing.List["ContainerGroupContainerVolumeGitRepo"]]:
        """git_repo block."""
        result = self._values.get("git_repo")
        return result

    @builtins.property
    def read_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("read_only")
        return result

    @builtins.property
    def secret(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("secret")
        return result

    @builtins.property
    def share_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("share_name")
        return result

    @builtins.property
    def storage_account_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_key")
        return result

    @builtins.property
    def storage_account_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerVolume(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupContainerVolumeGitRepo",
    jsii_struct_bases=[],
    name_mapping={"url": "url", "directory": "directory", "revision": "revision"},
)
class ContainerGroupContainerVolumeGitRepo:
    def __init__(
        self,
        *,
        url: builtins.str,
        directory: typing.Optional[builtins.str] = None,
        revision: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param url: -
        :param directory: -
        :param revision: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "url": url,
        }
        if directory is not None:
            self._values["directory"] = directory
        if revision is not None:
            self._values["revision"] = revision

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    @builtins.property
    def directory(self) -> typing.Optional[builtins.str]:
        result = self._values.get("directory")
        return result

    @builtins.property
    def revision(self) -> typing.Optional[builtins.str]:
        result = self._values.get("revision")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupContainerVolumeGitRepo(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupDiagnostics",
    jsii_struct_bases=[],
    name_mapping={"log_analytics": "logAnalytics"},
)
class ContainerGroupDiagnostics:
    def __init__(
        self,
        *,
        log_analytics: typing.List["ContainerGroupDiagnosticsLogAnalytics"],
    ) -> None:
        """
        :param log_analytics: log_analytics block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics": log_analytics,
        }

    @builtins.property
    def log_analytics(self) -> typing.List["ContainerGroupDiagnosticsLogAnalytics"]:
        """log_analytics block."""
        result = self._values.get("log_analytics")
        assert result is not None, "Required property 'log_analytics' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupDiagnostics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupDiagnosticsLogAnalytics",
    jsii_struct_bases=[],
    name_mapping={
        "workspace_id": "workspaceId",
        "workspace_key": "workspaceKey",
        "log_type": "logType",
        "metadata": "metadata",
    },
)
class ContainerGroupDiagnosticsLogAnalytics:
    def __init__(
        self,
        *,
        workspace_id: builtins.str,
        workspace_key: builtins.str,
        log_type: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
    ) -> None:
        """
        :param workspace_id: -
        :param workspace_key: -
        :param log_type: -
        :param metadata: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "workspace_id": workspace_id,
            "workspace_key": workspace_key,
        }
        if log_type is not None:
            self._values["log_type"] = log_type
        if metadata is not None:
            self._values["metadata"] = metadata

    @builtins.property
    def workspace_id(self) -> builtins.str:
        result = self._values.get("workspace_id")
        assert result is not None, "Required property 'workspace_id' is missing"
        return result

    @builtins.property
    def workspace_key(self) -> builtins.str:
        result = self._values.get("workspace_key")
        assert result is not None, "Required property 'workspace_key' is missing"
        return result

    @builtins.property
    def log_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("log_type")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupDiagnosticsLogAnalytics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupDnsConfig",
    jsii_struct_bases=[],
    name_mapping={
        "nameservers": "nameservers",
        "options": "options",
        "search_domains": "searchDomains",
    },
)
class ContainerGroupDnsConfig:
    def __init__(
        self,
        *,
        nameservers: typing.List[builtins.str],
        options: typing.List[builtins.str],
        search_domains: typing.List[builtins.str],
    ) -> None:
        """
        :param nameservers: -
        :param options: -
        :param search_domains: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "nameservers": nameservers,
            "options": options,
            "search_domains": search_domains,
        }

    @builtins.property
    def nameservers(self) -> typing.List[builtins.str]:
        result = self._values.get("nameservers")
        assert result is not None, "Required property 'nameservers' is missing"
        return result

    @builtins.property
    def options(self) -> typing.List[builtins.str]:
        result = self._values.get("options")
        assert result is not None, "Required property 'options' is missing"
        return result

    @builtins.property
    def search_domains(self) -> typing.List[builtins.str]:
        result = self._values.get("search_domains")
        assert result is not None, "Required property 'search_domains' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupDnsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class ContainerGroupIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupImageRegistryCredential",
    jsii_struct_bases=[],
    name_mapping={"password": "password", "server": "server", "username": "username"},
)
class ContainerGroupImageRegistryCredential:
    def __init__(
        self,
        *,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupImageRegistryCredential(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ContainerGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ContainerRegistry(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ContainerRegistry",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        admin_enabled: typing.Optional[builtins.bool] = None,
        georeplication_locations: typing.Optional[typing.List[builtins.str]] = None,
        network_rule_set: typing.Optional[typing.List["ContainerRegistryNetworkRuleSet"]] = None,
        retention_policy: typing.Optional[typing.List["ContainerRegistryRetentionPolicy"]] = None,
        sku: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ContainerRegistryTimeouts"] = None,
        trust_policy: typing.Optional[typing.List["ContainerRegistryTrustPolicy"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param admin_enabled: -
        :param georeplication_locations: -
        :param network_rule_set: -
        :param retention_policy: -
        :param sku: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param trust_policy: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerRegistryConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            admin_enabled=admin_enabled,
            georeplication_locations=georeplication_locations,
            network_rule_set=network_rule_set,
            retention_policy=retention_policy,
            sku=sku,
            storage_account_id=storage_account_id,
            tags=tags,
            timeouts=timeouts,
            trust_policy=trust_policy,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ContainerRegistry, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdminEnabled")
    def reset_admin_enabled(self) -> None:
        return jsii.invoke(self, "resetAdminEnabled", [])

    @jsii.member(jsii_name="resetGeoreplicationLocations")
    def reset_georeplication_locations(self) -> None:
        return jsii.invoke(self, "resetGeoreplicationLocations", [])

    @jsii.member(jsii_name="resetNetworkRuleSet")
    def reset_network_rule_set(self) -> None:
        return jsii.invoke(self, "resetNetworkRuleSet", [])

    @jsii.member(jsii_name="resetRetentionPolicy")
    def reset_retention_policy(self) -> None:
        return jsii.invoke(self, "resetRetentionPolicy", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetStorageAccountId")
    def reset_storage_account_id(self) -> None:
        return jsii.invoke(self, "resetStorageAccountId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTrustPolicy")
    def reset_trust_policy(self) -> None:
        return jsii.invoke(self, "resetTrustPolicy", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPassword")
    def admin_password(self) -> builtins.str:
        return jsii.get(self, "adminPassword")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loginServer")
    def login_server(self) -> builtins.str:
        return jsii.get(self, "loginServer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminEnabledInput")
    def admin_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "adminEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="georeplicationLocationsInput")
    def georeplication_locations_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "georeplicationLocationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRuleSetInput")
    def network_rule_set_input(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryNetworkRuleSet"]]:
        return jsii.get(self, "networkRuleSetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionPolicyInput")
    def retention_policy_input(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryRetentionPolicy"]]:
        return jsii.get(self, "retentionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ContainerRegistryTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustPolicyInput")
    def trust_policy_input(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryTrustPolicy"]]:
        return jsii.get(self, "trustPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminEnabled")
    def admin_enabled(self) -> builtins.bool:
        return jsii.get(self, "adminEnabled")

    @admin_enabled.setter # type: ignore
    def admin_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "adminEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="georeplicationLocations")
    def georeplication_locations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "georeplicationLocations")

    @georeplication_locations.setter # type: ignore
    def georeplication_locations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "georeplicationLocations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRuleSet")
    def network_rule_set(self) -> typing.List["ContainerRegistryNetworkRuleSet"]:
        return jsii.get(self, "networkRuleSet")

    @network_rule_set.setter # type: ignore
    def network_rule_set(
        self,
        value: typing.List["ContainerRegistryNetworkRuleSet"],
    ) -> None:
        jsii.set(self, "networkRuleSet", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionPolicy")
    def retention_policy(self) -> typing.List["ContainerRegistryRetentionPolicy"]:
        return jsii.get(self, "retentionPolicy")

    @retention_policy.setter # type: ignore
    def retention_policy(
        self,
        value: typing.List["ContainerRegistryRetentionPolicy"],
    ) -> None:
        jsii.set(self, "retentionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ContainerRegistryTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ContainerRegistryTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustPolicy")
    def trust_policy(self) -> typing.List["ContainerRegistryTrustPolicy"]:
        return jsii.get(self, "trustPolicy")

    @trust_policy.setter # type: ignore
    def trust_policy(self, value: typing.List["ContainerRegistryTrustPolicy"]) -> None:
        jsii.set(self, "trustPolicy", value)


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "admin_enabled": "adminEnabled",
        "georeplication_locations": "georeplicationLocations",
        "network_rule_set": "networkRuleSet",
        "retention_policy": "retentionPolicy",
        "sku": "sku",
        "storage_account_id": "storageAccountId",
        "tags": "tags",
        "timeouts": "timeouts",
        "trust_policy": "trustPolicy",
    },
)
class ContainerRegistryConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        admin_enabled: typing.Optional[builtins.bool] = None,
        georeplication_locations: typing.Optional[typing.List[builtins.str]] = None,
        network_rule_set: typing.Optional[typing.List["ContainerRegistryNetworkRuleSet"]] = None,
        retention_policy: typing.Optional[typing.List["ContainerRegistryRetentionPolicy"]] = None,
        sku: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ContainerRegistryTimeouts"] = None,
        trust_policy: typing.Optional[typing.List["ContainerRegistryTrustPolicy"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param admin_enabled: -
        :param georeplication_locations: -
        :param network_rule_set: -
        :param retention_policy: -
        :param sku: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param trust_policy: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ContainerRegistryTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if admin_enabled is not None:
            self._values["admin_enabled"] = admin_enabled
        if georeplication_locations is not None:
            self._values["georeplication_locations"] = georeplication_locations
        if network_rule_set is not None:
            self._values["network_rule_set"] = network_rule_set
        if retention_policy is not None:
            self._values["retention_policy"] = retention_policy
        if sku is not None:
            self._values["sku"] = sku
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if trust_policy is not None:
            self._values["trust_policy"] = trust_policy

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def admin_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("admin_enabled")
        return result

    @builtins.property
    def georeplication_locations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("georeplication_locations")
        return result

    @builtins.property
    def network_rule_set(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryNetworkRuleSet"]]:
        result = self._values.get("network_rule_set")
        return result

    @builtins.property
    def retention_policy(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryRetentionPolicy"]]:
        result = self._values.get("retention_policy")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ContainerRegistryTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def trust_policy(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryTrustPolicy"]]:
        result = self._values.get("trust_policy")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryNetworkRuleSet",
    jsii_struct_bases=[],
    name_mapping={
        "default_action": "defaultAction",
        "ip_rule": "ipRule",
        "virtual_network": "virtualNetwork",
    },
)
class ContainerRegistryNetworkRuleSet:
    def __init__(
        self,
        *,
        default_action: typing.Optional[builtins.str] = None,
        ip_rule: typing.Optional[typing.List["ContainerRegistryNetworkRuleSetIpRule"]] = None,
        virtual_network: typing.Optional[typing.List["ContainerRegistryNetworkRuleSetVirtualNetwork"]] = None,
    ) -> None:
        """
        :param default_action: -
        :param ip_rule: -
        :param virtual_network: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if default_action is not None:
            self._values["default_action"] = default_action
        if ip_rule is not None:
            self._values["ip_rule"] = ip_rule
        if virtual_network is not None:
            self._values["virtual_network"] = virtual_network

    @builtins.property
    def default_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_action")
        return result

    @builtins.property
    def ip_rule(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryNetworkRuleSetIpRule"]]:
        result = self._values.get("ip_rule")
        return result

    @builtins.property
    def virtual_network(
        self,
    ) -> typing.Optional[typing.List["ContainerRegistryNetworkRuleSetVirtualNetwork"]]:
        result = self._values.get("virtual_network")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryNetworkRuleSet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryNetworkRuleSetIpRule",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "ip_range": "ipRange"},
)
class ContainerRegistryNetworkRuleSetIpRule:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_range: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_range: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_range is not None:
            self._values["ip_range"] = ip_range

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_range(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_range")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryNetworkRuleSetIpRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryNetworkRuleSetVirtualNetwork",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "subnet_id": "subnetId"},
)
class ContainerRegistryNetworkRuleSetVirtualNetwork:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryNetworkRuleSetVirtualNetwork(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={"days": "days", "enabled": "enabled"},
)
class ContainerRegistryRetentionPolicy:
    def __init__(
        self,
        *,
        days: typing.Optional[jsii.Number] = None,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param days: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if days is not None:
            self._values["days"] = days
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("days")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ContainerRegistryTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryTrustPolicy",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled"},
)
class ContainerRegistryTrustPolicy:
    def __init__(self, *, enabled: typing.Optional[builtins.bool] = None) -> None:
        """
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryTrustPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ContainerRegistryWebhook(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ContainerRegistryWebhook",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        actions: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        registry_name: builtins.str,
        resource_group_name: builtins.str,
        service_uri: builtins.str,
        custom_headers: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        scope: typing.Optional[builtins.str] = None,
        status: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ContainerRegistryWebhookTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param actions: -
        :param location: -
        :param name: -
        :param registry_name: -
        :param resource_group_name: -
        :param service_uri: -
        :param custom_headers: -
        :param scope: -
        :param status: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerRegistryWebhookConfig(
            actions=actions,
            location=location,
            name=name,
            registry_name=registry_name,
            resource_group_name=resource_group_name,
            service_uri=service_uri,
            custom_headers=custom_headers,
            scope=scope,
            status=status,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ContainerRegistryWebhook, self, [scope_, id, config])

    @jsii.member(jsii_name="resetCustomHeaders")
    def reset_custom_headers(self) -> None:
        return jsii.invoke(self, "resetCustomHeaders", [])

    @jsii.member(jsii_name="resetScope")
    def reset_scope(self) -> None:
        return jsii.invoke(self, "resetScope", [])

    @jsii.member(jsii_name="resetStatus")
    def reset_status(self) -> None:
        return jsii.invoke(self, "resetStatus", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionsInput")
    def actions_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "actionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registryNameInput")
    def registry_name_input(self) -> builtins.str:
        return jsii.get(self, "registryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceUriInput")
    def service_uri_input(self) -> builtins.str:
        return jsii.get(self, "serviceUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHeadersInput")
    def custom_headers_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "customHeadersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="statusInput")
    def status_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "statusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ContainerRegistryWebhookTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actions")
    def actions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "actions")

    @actions.setter # type: ignore
    def actions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "actions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHeaders")
    def custom_headers(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "customHeaders")

    @custom_headers.setter # type: ignore
    def custom_headers(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "customHeaders", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registryName")
    def registry_name(self) -> builtins.str:
        return jsii.get(self, "registryName")

    @registry_name.setter # type: ignore
    def registry_name(self, value: builtins.str) -> None:
        jsii.set(self, "registryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceUri")
    def service_uri(self) -> builtins.str:
        return jsii.get(self, "serviceUri")

    @service_uri.setter # type: ignore
    def service_uri(self, value: builtins.str) -> None:
        jsii.set(self, "serviceUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")

    @status.setter # type: ignore
    def status(self, value: builtins.str) -> None:
        jsii.set(self, "status", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ContainerRegistryWebhookTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ContainerRegistryWebhookTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryWebhookConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "actions": "actions",
        "location": "location",
        "name": "name",
        "registry_name": "registryName",
        "resource_group_name": "resourceGroupName",
        "service_uri": "serviceUri",
        "custom_headers": "customHeaders",
        "scope": "scope",
        "status": "status",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ContainerRegistryWebhookConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        actions: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        registry_name: builtins.str,
        resource_group_name: builtins.str,
        service_uri: builtins.str,
        custom_headers: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        scope: typing.Optional[builtins.str] = None,
        status: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ContainerRegistryWebhookTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param actions: -
        :param location: -
        :param name: -
        :param registry_name: -
        :param resource_group_name: -
        :param service_uri: -
        :param custom_headers: -
        :param scope: -
        :param status: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ContainerRegistryWebhookTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "actions": actions,
            "location": location,
            "name": name,
            "registry_name": registry_name,
            "resource_group_name": resource_group_name,
            "service_uri": service_uri,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if custom_headers is not None:
            self._values["custom_headers"] = custom_headers
        if scope is not None:
            self._values["scope"] = scope
        if status is not None:
            self._values["status"] = status
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def actions(self) -> typing.List[builtins.str]:
        result = self._values.get("actions")
        assert result is not None, "Required property 'actions' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def registry_name(self) -> builtins.str:
        result = self._values.get("registry_name")
        assert result is not None, "Required property 'registry_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_uri(self) -> builtins.str:
        result = self._values.get("service_uri")
        assert result is not None, "Required property 'service_uri' is missing"
        return result

    @builtins.property
    def custom_headers(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("custom_headers")
        return result

    @builtins.property
    def scope(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scope")
        return result

    @builtins.property
    def status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("status")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ContainerRegistryWebhookTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryWebhookConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ContainerRegistryWebhookTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ContainerRegistryWebhookTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ContainerRegistryWebhookTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        consistency_policy: typing.List["CosmosdbAccountConsistencyPolicy"],
        geo_location: typing.List["CosmosdbAccountGeoLocation"],
        location: builtins.str,
        name: builtins.str,
        offer_type: builtins.str,
        resource_group_name: builtins.str,
        capabilities: typing.Optional[typing.List["CosmosdbAccountCapabilities"]] = None,
        enable_automatic_failover: typing.Optional[builtins.bool] = None,
        enable_free_tier: typing.Optional[builtins.bool] = None,
        enable_multiple_write_locations: typing.Optional[builtins.bool] = None,
        ip_range_filter: typing.Optional[builtins.str] = None,
        is_virtual_network_filter_enabled: typing.Optional[builtins.bool] = None,
        key_vault_key_id: typing.Optional[builtins.str] = None,
        kind: typing.Optional[builtins.str] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CosmosdbAccountTimeouts"] = None,
        virtual_network_rule: typing.Optional[typing.List["CosmosdbAccountVirtualNetworkRule"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param consistency_policy: consistency_policy block.
        :param geo_location: geo_location block.
        :param location: -
        :param name: -
        :param offer_type: -
        :param resource_group_name: -
        :param capabilities: capabilities block.
        :param enable_automatic_failover: -
        :param enable_free_tier: -
        :param enable_multiple_write_locations: -
        :param ip_range_filter: -
        :param is_virtual_network_filter_enabled: -
        :param key_vault_key_id: -
        :param kind: -
        :param public_network_access_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_network_rule: virtual_network_rule block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbAccountConfig(
            consistency_policy=consistency_policy,
            geo_location=geo_location,
            location=location,
            name=name,
            offer_type=offer_type,
            resource_group_name=resource_group_name,
            capabilities=capabilities,
            enable_automatic_failover=enable_automatic_failover,
            enable_free_tier=enable_free_tier,
            enable_multiple_write_locations=enable_multiple_write_locations,
            ip_range_filter=ip_range_filter,
            is_virtual_network_filter_enabled=is_virtual_network_filter_enabled,
            key_vault_key_id=key_vault_key_id,
            kind=kind,
            public_network_access_enabled=public_network_access_enabled,
            tags=tags,
            timeouts=timeouts,
            virtual_network_rule=virtual_network_rule,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetCapabilities")
    def reset_capabilities(self) -> None:
        return jsii.invoke(self, "resetCapabilities", [])

    @jsii.member(jsii_name="resetEnableAutomaticFailover")
    def reset_enable_automatic_failover(self) -> None:
        return jsii.invoke(self, "resetEnableAutomaticFailover", [])

    @jsii.member(jsii_name="resetEnableFreeTier")
    def reset_enable_free_tier(self) -> None:
        return jsii.invoke(self, "resetEnableFreeTier", [])

    @jsii.member(jsii_name="resetEnableMultipleWriteLocations")
    def reset_enable_multiple_write_locations(self) -> None:
        return jsii.invoke(self, "resetEnableMultipleWriteLocations", [])

    @jsii.member(jsii_name="resetIpRangeFilter")
    def reset_ip_range_filter(self) -> None:
        return jsii.invoke(self, "resetIpRangeFilter", [])

    @jsii.member(jsii_name="resetIsVirtualNetworkFilterEnabled")
    def reset_is_virtual_network_filter_enabled(self) -> None:
        return jsii.invoke(self, "resetIsVirtualNetworkFilterEnabled", [])

    @jsii.member(jsii_name="resetKeyVaultKeyId")
    def reset_key_vault_key_id(self) -> None:
        return jsii.invoke(self, "resetKeyVaultKeyId", [])

    @jsii.member(jsii_name="resetKind")
    def reset_kind(self) -> None:
        return jsii.invoke(self, "resetKind", [])

    @jsii.member(jsii_name="resetPublicNetworkAccessEnabled")
    def reset_public_network_access_enabled(self) -> None:
        return jsii.invoke(self, "resetPublicNetworkAccessEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVirtualNetworkRule")
    def reset_virtual_network_rule(self) -> None:
        return jsii.invoke(self, "resetVirtualNetworkRule", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStrings")
    def connection_strings(self) -> typing.List[builtins.str]:
        return jsii.get(self, "connectionStrings")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="consistencyPolicyInput")
    def consistency_policy_input(
        self,
    ) -> typing.List["CosmosdbAccountConsistencyPolicy"]:
        return jsii.get(self, "consistencyPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoLocationInput")
    def geo_location_input(self) -> typing.List["CosmosdbAccountGeoLocation"]:
        return jsii.get(self, "geoLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offerTypeInput")
    def offer_type_input(self) -> builtins.str:
        return jsii.get(self, "offerTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryMasterKey")
    def primary_master_key(self) -> builtins.str:
        return jsii.get(self, "primaryMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryReadonlyKey")
    def primary_readonly_key(self) -> builtins.str:
        return jsii.get(self, "primaryReadonlyKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryReadonlyMasterKey")
    def primary_readonly_master_key(self) -> builtins.str:
        return jsii.get(self, "primaryReadonlyMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readEndpoints")
    def read_endpoints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "readEndpoints")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryMasterKey")
    def secondary_master_key(self) -> builtins.str:
        return jsii.get(self, "secondaryMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryReadonlyKey")
    def secondary_readonly_key(self) -> builtins.str:
        return jsii.get(self, "secondaryReadonlyKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryReadonlyMasterKey")
    def secondary_readonly_master_key(self) -> builtins.str:
        return jsii.get(self, "secondaryReadonlyMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="writeEndpoints")
    def write_endpoints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "writeEndpoints")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capabilitiesInput")
    def capabilities_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbAccountCapabilities"]]:
        return jsii.get(self, "capabilitiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutomaticFailoverInput")
    def enable_automatic_failover_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableAutomaticFailoverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFreeTierInput")
    def enable_free_tier_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableFreeTierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableMultipleWriteLocationsInput")
    def enable_multiple_write_locations_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableMultipleWriteLocationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRangeFilterInput")
    def ip_range_filter_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "ipRangeFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isVirtualNetworkFilterEnabledInput")
    def is_virtual_network_filter_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "isVirtualNetworkFilterEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyIdInput")
    def key_vault_key_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "keyVaultKeyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kindInput")
    def kind_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "kindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabledInput")
    def public_network_access_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "publicNetworkAccessEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkRuleInput")
    def virtual_network_rule_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbAccountVirtualNetworkRule"]]:
        return jsii.get(self, "virtualNetworkRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capabilities")
    def capabilities(self) -> typing.List["CosmosdbAccountCapabilities"]:
        return jsii.get(self, "capabilities")

    @capabilities.setter # type: ignore
    def capabilities(self, value: typing.List["CosmosdbAccountCapabilities"]) -> None:
        jsii.set(self, "capabilities", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="consistencyPolicy")
    def consistency_policy(self) -> typing.List["CosmosdbAccountConsistencyPolicy"]:
        return jsii.get(self, "consistencyPolicy")

    @consistency_policy.setter # type: ignore
    def consistency_policy(
        self,
        value: typing.List["CosmosdbAccountConsistencyPolicy"],
    ) -> None:
        jsii.set(self, "consistencyPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutomaticFailover")
    def enable_automatic_failover(self) -> builtins.bool:
        return jsii.get(self, "enableAutomaticFailover")

    @enable_automatic_failover.setter # type: ignore
    def enable_automatic_failover(self, value: builtins.bool) -> None:
        jsii.set(self, "enableAutomaticFailover", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFreeTier")
    def enable_free_tier(self) -> builtins.bool:
        return jsii.get(self, "enableFreeTier")

    @enable_free_tier.setter # type: ignore
    def enable_free_tier(self, value: builtins.bool) -> None:
        jsii.set(self, "enableFreeTier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableMultipleWriteLocations")
    def enable_multiple_write_locations(self) -> builtins.bool:
        return jsii.get(self, "enableMultipleWriteLocations")

    @enable_multiple_write_locations.setter # type: ignore
    def enable_multiple_write_locations(self, value: builtins.bool) -> None:
        jsii.set(self, "enableMultipleWriteLocations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoLocation")
    def geo_location(self) -> typing.List["CosmosdbAccountGeoLocation"]:
        return jsii.get(self, "geoLocation")

    @geo_location.setter # type: ignore
    def geo_location(self, value: typing.List["CosmosdbAccountGeoLocation"]) -> None:
        jsii.set(self, "geoLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRangeFilter")
    def ip_range_filter(self) -> builtins.str:
        return jsii.get(self, "ipRangeFilter")

    @ip_range_filter.setter # type: ignore
    def ip_range_filter(self, value: builtins.str) -> None:
        jsii.set(self, "ipRangeFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isVirtualNetworkFilterEnabled")
    def is_virtual_network_filter_enabled(self) -> builtins.bool:
        return jsii.get(self, "isVirtualNetworkFilterEnabled")

    @is_virtual_network_filter_enabled.setter # type: ignore
    def is_virtual_network_filter_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "isVirtualNetworkFilterEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @key_vault_key_id.setter # type: ignore
    def key_vault_key_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultKeyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @kind.setter # type: ignore
    def kind(self, value: builtins.str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offerType")
    def offer_type(self) -> builtins.str:
        return jsii.get(self, "offerType")

    @offer_type.setter # type: ignore
    def offer_type(self, value: builtins.str) -> None:
        jsii.set(self, "offerType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @public_network_access_enabled.setter # type: ignore
    def public_network_access_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "publicNetworkAccessEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkRule")
    def virtual_network_rule(self) -> typing.List["CosmosdbAccountVirtualNetworkRule"]:
        return jsii.get(self, "virtualNetworkRule")

    @virtual_network_rule.setter # type: ignore
    def virtual_network_rule(
        self,
        value: typing.List["CosmosdbAccountVirtualNetworkRule"],
    ) -> None:
        jsii.set(self, "virtualNetworkRule", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbAccountCapabilities",
    jsii_struct_bases=[],
    name_mapping={"name": "name"},
)
class CosmosdbAccountCapabilities:
    def __init__(self, *, name: builtins.str) -> None:
        """
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbAccountCapabilities(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "consistency_policy": "consistencyPolicy",
        "geo_location": "geoLocation",
        "location": "location",
        "name": "name",
        "offer_type": "offerType",
        "resource_group_name": "resourceGroupName",
        "capabilities": "capabilities",
        "enable_automatic_failover": "enableAutomaticFailover",
        "enable_free_tier": "enableFreeTier",
        "enable_multiple_write_locations": "enableMultipleWriteLocations",
        "ip_range_filter": "ipRangeFilter",
        "is_virtual_network_filter_enabled": "isVirtualNetworkFilterEnabled",
        "key_vault_key_id": "keyVaultKeyId",
        "kind": "kind",
        "public_network_access_enabled": "publicNetworkAccessEnabled",
        "tags": "tags",
        "timeouts": "timeouts",
        "virtual_network_rule": "virtualNetworkRule",
    },
)
class CosmosdbAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        consistency_policy: typing.List["CosmosdbAccountConsistencyPolicy"],
        geo_location: typing.List["CosmosdbAccountGeoLocation"],
        location: builtins.str,
        name: builtins.str,
        offer_type: builtins.str,
        resource_group_name: builtins.str,
        capabilities: typing.Optional[typing.List[CosmosdbAccountCapabilities]] = None,
        enable_automatic_failover: typing.Optional[builtins.bool] = None,
        enable_free_tier: typing.Optional[builtins.bool] = None,
        enable_multiple_write_locations: typing.Optional[builtins.bool] = None,
        ip_range_filter: typing.Optional[builtins.str] = None,
        is_virtual_network_filter_enabled: typing.Optional[builtins.bool] = None,
        key_vault_key_id: typing.Optional[builtins.str] = None,
        kind: typing.Optional[builtins.str] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CosmosdbAccountTimeouts"] = None,
        virtual_network_rule: typing.Optional[typing.List["CosmosdbAccountVirtualNetworkRule"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param consistency_policy: consistency_policy block.
        :param geo_location: geo_location block.
        :param location: -
        :param name: -
        :param offer_type: -
        :param resource_group_name: -
        :param capabilities: capabilities block.
        :param enable_automatic_failover: -
        :param enable_free_tier: -
        :param enable_multiple_write_locations: -
        :param ip_range_filter: -
        :param is_virtual_network_filter_enabled: -
        :param key_vault_key_id: -
        :param kind: -
        :param public_network_access_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_network_rule: virtual_network_rule block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "consistency_policy": consistency_policy,
            "geo_location": geo_location,
            "location": location,
            "name": name,
            "offer_type": offer_type,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if capabilities is not None:
            self._values["capabilities"] = capabilities
        if enable_automatic_failover is not None:
            self._values["enable_automatic_failover"] = enable_automatic_failover
        if enable_free_tier is not None:
            self._values["enable_free_tier"] = enable_free_tier
        if enable_multiple_write_locations is not None:
            self._values["enable_multiple_write_locations"] = enable_multiple_write_locations
        if ip_range_filter is not None:
            self._values["ip_range_filter"] = ip_range_filter
        if is_virtual_network_filter_enabled is not None:
            self._values["is_virtual_network_filter_enabled"] = is_virtual_network_filter_enabled
        if key_vault_key_id is not None:
            self._values["key_vault_key_id"] = key_vault_key_id
        if kind is not None:
            self._values["kind"] = kind
        if public_network_access_enabled is not None:
            self._values["public_network_access_enabled"] = public_network_access_enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if virtual_network_rule is not None:
            self._values["virtual_network_rule"] = virtual_network_rule

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def consistency_policy(self) -> typing.List["CosmosdbAccountConsistencyPolicy"]:
        """consistency_policy block."""
        result = self._values.get("consistency_policy")
        assert result is not None, "Required property 'consistency_policy' is missing"
        return result

    @builtins.property
    def geo_location(self) -> typing.List["CosmosdbAccountGeoLocation"]:
        """geo_location block."""
        result = self._values.get("geo_location")
        assert result is not None, "Required property 'geo_location' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def offer_type(self) -> builtins.str:
        result = self._values.get("offer_type")
        assert result is not None, "Required property 'offer_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def capabilities(self) -> typing.Optional[typing.List[CosmosdbAccountCapabilities]]:
        """capabilities block."""
        result = self._values.get("capabilities")
        return result

    @builtins.property
    def enable_automatic_failover(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_automatic_failover")
        return result

    @builtins.property
    def enable_free_tier(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_free_tier")
        return result

    @builtins.property
    def enable_multiple_write_locations(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_multiple_write_locations")
        return result

    @builtins.property
    def ip_range_filter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_range_filter")
        return result

    @builtins.property
    def is_virtual_network_filter_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("is_virtual_network_filter_enabled")
        return result

    @builtins.property
    def key_vault_key_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_key_id")
        return result

    @builtins.property
    def kind(self) -> typing.Optional[builtins.str]:
        result = self._values.get("kind")
        return result

    @builtins.property
    def public_network_access_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("public_network_access_enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def virtual_network_rule(
        self,
    ) -> typing.Optional[typing.List["CosmosdbAccountVirtualNetworkRule"]]:
        """virtual_network_rule block."""
        result = self._values.get("virtual_network_rule")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbAccountConsistencyPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "consistency_level": "consistencyLevel",
        "max_interval_in_seconds": "maxIntervalInSeconds",
        "max_staleness_prefix": "maxStalenessPrefix",
    },
)
class CosmosdbAccountConsistencyPolicy:
    def __init__(
        self,
        *,
        consistency_level: builtins.str,
        max_interval_in_seconds: typing.Optional[jsii.Number] = None,
        max_staleness_prefix: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param consistency_level: -
        :param max_interval_in_seconds: -
        :param max_staleness_prefix: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "consistency_level": consistency_level,
        }
        if max_interval_in_seconds is not None:
            self._values["max_interval_in_seconds"] = max_interval_in_seconds
        if max_staleness_prefix is not None:
            self._values["max_staleness_prefix"] = max_staleness_prefix

    @builtins.property
    def consistency_level(self) -> builtins.str:
        result = self._values.get("consistency_level")
        assert result is not None, "Required property 'consistency_level' is missing"
        return result

    @builtins.property
    def max_interval_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_interval_in_seconds")
        return result

    @builtins.property
    def max_staleness_prefix(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_staleness_prefix")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbAccountConsistencyPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbAccountGeoLocation",
    jsii_struct_bases=[],
    name_mapping={
        "failover_priority": "failoverPriority",
        "location": "location",
        "prefix": "prefix",
        "zone_redundant": "zoneRedundant",
    },
)
class CosmosdbAccountGeoLocation:
    def __init__(
        self,
        *,
        failover_priority: jsii.Number,
        location: builtins.str,
        prefix: typing.Optional[builtins.str] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param failover_priority: -
        :param location: -
        :param prefix: -
        :param zone_redundant: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "failover_priority": failover_priority,
            "location": location,
        }
        if prefix is not None:
            self._values["prefix"] = prefix
        if zone_redundant is not None:
            self._values["zone_redundant"] = zone_redundant

    @builtins.property
    def failover_priority(self) -> jsii.Number:
        result = self._values.get("failover_priority")
        assert result is not None, "Required property 'failover_priority' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("prefix")
        return result

    @builtins.property
    def zone_redundant(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_redundant")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbAccountGeoLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbAccountVirtualNetworkRule",
    jsii_struct_bases=[],
    name_mapping={
        "id": "id",
        "ignore_missing_vnet_service_endpoint": "ignoreMissingVnetServiceEndpoint",
    },
)
class CosmosdbAccountVirtualNetworkRule:
    def __init__(
        self,
        *,
        id: builtins.str,
        ignore_missing_vnet_service_endpoint: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param id: -
        :param ignore_missing_vnet_service_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
        }
        if ignore_missing_vnet_service_endpoint is not None:
            self._values["ignore_missing_vnet_service_endpoint"] = ignore_missing_vnet_service_endpoint

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    @builtins.property
    def ignore_missing_vnet_service_endpoint(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ignore_missing_vnet_service_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbAccountVirtualNetworkRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbCassandraKeyspace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbCassandraKeyspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbCassandraKeyspaceAutoscaleSettings"]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbCassandraKeyspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbCassandraKeyspaceConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            throughput=throughput,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbCassandraKeyspace, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbCassandraKeyspaceAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbCassandraKeyspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(
        self,
    ) -> typing.List["CosmosdbCassandraKeyspaceAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbCassandraKeyspaceAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbCassandraKeyspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbCassandraKeyspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbCassandraKeyspaceAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbCassandraKeyspaceAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbCassandraKeyspaceAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbCassandraKeyspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "throughput": "throughput",
        "timeouts": "timeouts",
    },
)
class CosmosdbCassandraKeyspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbCassandraKeyspaceAutoscaleSettings]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbCassandraKeyspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbCassandraKeyspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbCassandraKeyspaceAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbCassandraKeyspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbCassandraKeyspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbCassandraKeyspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbCassandraKeyspaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbCassandraKeyspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbGremlinDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbGremlinDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbGremlinDatabaseAutoscaleSettings"]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbGremlinDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbGremlinDatabaseConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            throughput=throughput,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbGremlinDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbGremlinDatabaseAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbGremlinDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(
        self,
    ) -> typing.List["CosmosdbGremlinDatabaseAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbGremlinDatabaseAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbGremlinDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbGremlinDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinDatabaseAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbGremlinDatabaseAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinDatabaseAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "throughput": "throughput",
        "timeouts": "timeouts",
    },
)
class CosmosdbGremlinDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbGremlinDatabaseAutoscaleSettings]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbGremlinDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbGremlinDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbGremlinDatabaseAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbGremlinDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbGremlinDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbGremlinGraph(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbGremlinGraph",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        conflict_resolution_policy: typing.List["CosmosdbGremlinGraphConflictResolutionPolicy"],
        database_name: builtins.str,
        index_policy: typing.List["CosmosdbGremlinGraphIndexPolicy"],
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbGremlinGraphAutoscaleSettings"]] = None,
        partition_key_path: typing.Optional[builtins.str] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbGremlinGraphTimeouts"] = None,
        unique_key: typing.Optional[typing.List["CosmosdbGremlinGraphUniqueKey"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param conflict_resolution_policy: conflict_resolution_policy block.
        :param database_name: -
        :param index_policy: index_policy block.
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param partition_key_path: -
        :param throughput: -
        :param timeouts: timeouts block.
        :param unique_key: unique_key block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbGremlinGraphConfig(
            account_name=account_name,
            conflict_resolution_policy=conflict_resolution_policy,
            database_name=database_name,
            index_policy=index_policy,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            partition_key_path=partition_key_path,
            throughput=throughput,
            timeouts=timeouts,
            unique_key=unique_key,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbGremlinGraph, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetPartitionKeyPath")
    def reset_partition_key_path(self) -> None:
        return jsii.invoke(self, "resetPartitionKeyPath", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUniqueKey")
    def reset_unique_key(self) -> None:
        return jsii.invoke(self, "resetUniqueKey", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="conflictResolutionPolicyInput")
    def conflict_resolution_policy_input(
        self,
    ) -> typing.List["CosmosdbGremlinGraphConflictResolutionPolicy"]:
        return jsii.get(self, "conflictResolutionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="indexPolicyInput")
    def index_policy_input(self) -> typing.List["CosmosdbGremlinGraphIndexPolicy"]:
        return jsii.get(self, "indexPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbGremlinGraphAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyPathInput")
    def partition_key_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "partitionKeyPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbGremlinGraphTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueKeyInput")
    def unique_key_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbGremlinGraphUniqueKey"]]:
        return jsii.get(self, "uniqueKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(
        self,
    ) -> typing.List["CosmosdbGremlinGraphAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbGremlinGraphAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="conflictResolutionPolicy")
    def conflict_resolution_policy(
        self,
    ) -> typing.List["CosmosdbGremlinGraphConflictResolutionPolicy"]:
        return jsii.get(self, "conflictResolutionPolicy")

    @conflict_resolution_policy.setter # type: ignore
    def conflict_resolution_policy(
        self,
        value: typing.List["CosmosdbGremlinGraphConflictResolutionPolicy"],
    ) -> None:
        jsii.set(self, "conflictResolutionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="indexPolicy")
    def index_policy(self) -> typing.List["CosmosdbGremlinGraphIndexPolicy"]:
        return jsii.get(self, "indexPolicy")

    @index_policy.setter # type: ignore
    def index_policy(
        self,
        value: typing.List["CosmosdbGremlinGraphIndexPolicy"],
    ) -> None:
        jsii.set(self, "indexPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyPath")
    def partition_key_path(self) -> builtins.str:
        return jsii.get(self, "partitionKeyPath")

    @partition_key_path.setter # type: ignore
    def partition_key_path(self, value: builtins.str) -> None:
        jsii.set(self, "partitionKeyPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbGremlinGraphTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbGremlinGraphTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueKey")
    def unique_key(self) -> typing.List["CosmosdbGremlinGraphUniqueKey"]:
        return jsii.get(self, "uniqueKey")

    @unique_key.setter # type: ignore
    def unique_key(self, value: typing.List["CosmosdbGremlinGraphUniqueKey"]) -> None:
        jsii.set(self, "uniqueKey", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinGraphAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbGremlinGraphAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinGraphAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinGraphConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "conflict_resolution_policy": "conflictResolutionPolicy",
        "database_name": "databaseName",
        "index_policy": "indexPolicy",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "partition_key_path": "partitionKeyPath",
        "throughput": "throughput",
        "timeouts": "timeouts",
        "unique_key": "uniqueKey",
    },
)
class CosmosdbGremlinGraphConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        conflict_resolution_policy: typing.List["CosmosdbGremlinGraphConflictResolutionPolicy"],
        database_name: builtins.str,
        index_policy: typing.List["CosmosdbGremlinGraphIndexPolicy"],
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbGremlinGraphAutoscaleSettings]] = None,
        partition_key_path: typing.Optional[builtins.str] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbGremlinGraphTimeouts"] = None,
        unique_key: typing.Optional[typing.List["CosmosdbGremlinGraphUniqueKey"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param conflict_resolution_policy: conflict_resolution_policy block.
        :param database_name: -
        :param index_policy: index_policy block.
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param partition_key_path: -
        :param throughput: -
        :param timeouts: timeouts block.
        :param unique_key: unique_key block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbGremlinGraphTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "conflict_resolution_policy": conflict_resolution_policy,
            "database_name": database_name,
            "index_policy": index_policy,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if partition_key_path is not None:
            self._values["partition_key_path"] = partition_key_path
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if unique_key is not None:
            self._values["unique_key"] = unique_key

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def conflict_resolution_policy(
        self,
    ) -> typing.List["CosmosdbGremlinGraphConflictResolutionPolicy"]:
        """conflict_resolution_policy block."""
        result = self._values.get("conflict_resolution_policy")
        assert result is not None, "Required property 'conflict_resolution_policy' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def index_policy(self) -> typing.List["CosmosdbGremlinGraphIndexPolicy"]:
        """index_policy block."""
        result = self._values.get("index_policy")
        assert result is not None, "Required property 'index_policy' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbGremlinGraphAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def partition_key_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("partition_key_path")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbGremlinGraphTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def unique_key(
        self,
    ) -> typing.Optional[typing.List["CosmosdbGremlinGraphUniqueKey"]]:
        """unique_key block."""
        result = self._values.get("unique_key")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinGraphConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinGraphConflictResolutionPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "mode": "mode",
        "conflict_resolution_path": "conflictResolutionPath",
        "conflict_resolution_procedure": "conflictResolutionProcedure",
    },
)
class CosmosdbGremlinGraphConflictResolutionPolicy:
    def __init__(
        self,
        *,
        mode: builtins.str,
        conflict_resolution_path: typing.Optional[builtins.str] = None,
        conflict_resolution_procedure: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param mode: -
        :param conflict_resolution_path: -
        :param conflict_resolution_procedure: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "mode": mode,
        }
        if conflict_resolution_path is not None:
            self._values["conflict_resolution_path"] = conflict_resolution_path
        if conflict_resolution_procedure is not None:
            self._values["conflict_resolution_procedure"] = conflict_resolution_procedure

    @builtins.property
    def mode(self) -> builtins.str:
        result = self._values.get("mode")
        assert result is not None, "Required property 'mode' is missing"
        return result

    @builtins.property
    def conflict_resolution_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("conflict_resolution_path")
        return result

    @builtins.property
    def conflict_resolution_procedure(self) -> typing.Optional[builtins.str]:
        result = self._values.get("conflict_resolution_procedure")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinGraphConflictResolutionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinGraphIndexPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "indexing_mode": "indexingMode",
        "automatic": "automatic",
        "excluded_paths": "excludedPaths",
        "included_paths": "includedPaths",
    },
)
class CosmosdbGremlinGraphIndexPolicy:
    def __init__(
        self,
        *,
        indexing_mode: builtins.str,
        automatic: typing.Optional[builtins.bool] = None,
        excluded_paths: typing.Optional[typing.List[builtins.str]] = None,
        included_paths: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param indexing_mode: -
        :param automatic: -
        :param excluded_paths: -
        :param included_paths: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "indexing_mode": indexing_mode,
        }
        if automatic is not None:
            self._values["automatic"] = automatic
        if excluded_paths is not None:
            self._values["excluded_paths"] = excluded_paths
        if included_paths is not None:
            self._values["included_paths"] = included_paths

    @builtins.property
    def indexing_mode(self) -> builtins.str:
        result = self._values.get("indexing_mode")
        assert result is not None, "Required property 'indexing_mode' is missing"
        return result

    @builtins.property
    def automatic(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("automatic")
        return result

    @builtins.property
    def excluded_paths(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("excluded_paths")
        return result

    @builtins.property
    def included_paths(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("included_paths")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinGraphIndexPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinGraphTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbGremlinGraphTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinGraphTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbGremlinGraphUniqueKey",
    jsii_struct_bases=[],
    name_mapping={"paths": "paths"},
)
class CosmosdbGremlinGraphUniqueKey:
    def __init__(self, *, paths: typing.List[builtins.str]) -> None:
        """
        :param paths: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "paths": paths,
        }

    @builtins.property
    def paths(self) -> typing.List[builtins.str]:
        result = self._values.get("paths")
        assert result is not None, "Required property 'paths' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbGremlinGraphUniqueKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbMongoCollection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbMongoCollection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbMongoCollectionAutoscaleSettings"]] = None,
        default_ttl_seconds: typing.Optional[jsii.Number] = None,
        index: typing.Optional[typing.List["CosmosdbMongoCollectionIndex"]] = None,
        shard_key: typing.Optional[builtins.str] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbMongoCollectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param database_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param default_ttl_seconds: -
        :param index: index block.
        :param shard_key: -
        :param throughput: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbMongoCollectionConfig(
            account_name=account_name,
            database_name=database_name,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            default_ttl_seconds=default_ttl_seconds,
            index=index,
            shard_key=shard_key,
            throughput=throughput,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbMongoCollection, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetDefaultTtlSeconds")
    def reset_default_ttl_seconds(self) -> None:
        return jsii.invoke(self, "resetDefaultTtlSeconds", [])

    @jsii.member(jsii_name="resetIndex")
    def reset_index(self) -> None:
        return jsii.invoke(self, "resetIndex", [])

    @jsii.member(jsii_name="resetShardKey")
    def reset_shard_key(self) -> None:
        return jsii.invoke(self, "resetShardKey", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="systemIndexes")
    def system_indexes(
        self,
        index: builtins.str,
    ) -> "CosmosdbMongoCollectionSystemIndexes":
        """
        :param index: -
        """
        return jsii.invoke(self, "systemIndexes", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbMongoCollectionAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultTtlSecondsInput")
    def default_ttl_seconds_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "defaultTtlSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="indexInput")
    def index_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbMongoCollectionIndex"]]:
        return jsii.get(self, "indexInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shardKeyInput")
    def shard_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "shardKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbMongoCollectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(
        self,
    ) -> typing.List["CosmosdbMongoCollectionAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbMongoCollectionAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultTtlSeconds")
    def default_ttl_seconds(self) -> jsii.Number:
        return jsii.get(self, "defaultTtlSeconds")

    @default_ttl_seconds.setter # type: ignore
    def default_ttl_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "defaultTtlSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="index")
    def index(self) -> typing.List["CosmosdbMongoCollectionIndex"]:
        return jsii.get(self, "index")

    @index.setter # type: ignore
    def index(self, value: typing.List["CosmosdbMongoCollectionIndex"]) -> None:
        jsii.set(self, "index", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shardKey")
    def shard_key(self) -> builtins.str:
        return jsii.get(self, "shardKey")

    @shard_key.setter # type: ignore
    def shard_key(self, value: builtins.str) -> None:
        jsii.set(self, "shardKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbMongoCollectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbMongoCollectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbMongoCollectionAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbMongoCollectionAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbMongoCollectionAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbMongoCollectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "database_name": "databaseName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "default_ttl_seconds": "defaultTtlSeconds",
        "index": "index",
        "shard_key": "shardKey",
        "throughput": "throughput",
        "timeouts": "timeouts",
    },
)
class CosmosdbMongoCollectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbMongoCollectionAutoscaleSettings]] = None,
        default_ttl_seconds: typing.Optional[jsii.Number] = None,
        index: typing.Optional[typing.List["CosmosdbMongoCollectionIndex"]] = None,
        shard_key: typing.Optional[builtins.str] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbMongoCollectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param database_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param default_ttl_seconds: -
        :param index: index block.
        :param shard_key: -
        :param throughput: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbMongoCollectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "database_name": database_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if default_ttl_seconds is not None:
            self._values["default_ttl_seconds"] = default_ttl_seconds
        if index is not None:
            self._values["index"] = index
        if shard_key is not None:
            self._values["shard_key"] = shard_key
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbMongoCollectionAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def default_ttl_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("default_ttl_seconds")
        return result

    @builtins.property
    def index(self) -> typing.Optional[typing.List["CosmosdbMongoCollectionIndex"]]:
        """index block."""
        result = self._values.get("index")
        return result

    @builtins.property
    def shard_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("shard_key")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbMongoCollectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbMongoCollectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbMongoCollectionIndex",
    jsii_struct_bases=[],
    name_mapping={"keys": "keys", "unique": "unique"},
)
class CosmosdbMongoCollectionIndex:
    def __init__(
        self,
        *,
        keys: typing.List[builtins.str],
        unique: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param keys: -
        :param unique: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "keys": keys,
        }
        if unique is not None:
            self._values["unique"] = unique

    @builtins.property
    def keys(self) -> typing.List[builtins.str]:
        result = self._values.get("keys")
        assert result is not None, "Required property 'keys' is missing"
        return result

    @builtins.property
    def unique(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("unique")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbMongoCollectionIndex(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbMongoCollectionSystemIndexes(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbMongoCollectionSystemIndexes",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(CosmosdbMongoCollectionSystemIndexes, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keys")
    def keys(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keys")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="unique")
    def unique(self) -> builtins.bool:
        return jsii.get(self, "unique")


@jsii.data_type(
    jsii_type="azurerm.CosmosdbMongoCollectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbMongoCollectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbMongoCollectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbMongoDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbMongoDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbMongoDatabaseAutoscaleSettings"]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbMongoDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbMongoDatabaseConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            throughput=throughput,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbMongoDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbMongoDatabaseAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbMongoDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(
        self,
    ) -> typing.List["CosmosdbMongoDatabaseAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbMongoDatabaseAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbMongoDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbMongoDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbMongoDatabaseAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbMongoDatabaseAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbMongoDatabaseAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbMongoDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "throughput": "throughput",
        "timeouts": "timeouts",
    },
)
class CosmosdbMongoDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbMongoDatabaseAutoscaleSettings]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbMongoDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbMongoDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbMongoDatabaseAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbMongoDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbMongoDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbMongoDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbMongoDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbMongoDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbSqlContainer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbSqlContainer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbSqlContainerAutoscaleSettings"]] = None,
        default_ttl: typing.Optional[jsii.Number] = None,
        indexing_policy: typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicy"]] = None,
        partition_key_path: typing.Optional[builtins.str] = None,
        partition_key_version: typing.Optional[jsii.Number] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbSqlContainerTimeouts"] = None,
        unique_key: typing.Optional[typing.List["CosmosdbSqlContainerUniqueKey"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param database_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param default_ttl: -
        :param indexing_policy: indexing_policy block.
        :param partition_key_path: -
        :param partition_key_version: -
        :param throughput: -
        :param timeouts: timeouts block.
        :param unique_key: unique_key block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbSqlContainerConfig(
            account_name=account_name,
            database_name=database_name,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            default_ttl=default_ttl,
            indexing_policy=indexing_policy,
            partition_key_path=partition_key_path,
            partition_key_version=partition_key_version,
            throughput=throughput,
            timeouts=timeouts,
            unique_key=unique_key,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbSqlContainer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetDefaultTtl")
    def reset_default_ttl(self) -> None:
        return jsii.invoke(self, "resetDefaultTtl", [])

    @jsii.member(jsii_name="resetIndexingPolicy")
    def reset_indexing_policy(self) -> None:
        return jsii.invoke(self, "resetIndexingPolicy", [])

    @jsii.member(jsii_name="resetPartitionKeyPath")
    def reset_partition_key_path(self) -> None:
        return jsii.invoke(self, "resetPartitionKeyPath", [])

    @jsii.member(jsii_name="resetPartitionKeyVersion")
    def reset_partition_key_version(self) -> None:
        return jsii.invoke(self, "resetPartitionKeyVersion", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUniqueKey")
    def reset_unique_key(self) -> None:
        return jsii.invoke(self, "resetUniqueKey", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultTtlInput")
    def default_ttl_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "defaultTtlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="indexingPolicyInput")
    def indexing_policy_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicy"]]:
        return jsii.get(self, "indexingPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyPathInput")
    def partition_key_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "partitionKeyPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyVersionInput")
    def partition_key_version_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "partitionKeyVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbSqlContainerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueKeyInput")
    def unique_key_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerUniqueKey"]]:
        return jsii.get(self, "uniqueKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(
        self,
    ) -> typing.List["CosmosdbSqlContainerAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbSqlContainerAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultTtl")
    def default_ttl(self) -> jsii.Number:
        return jsii.get(self, "defaultTtl")

    @default_ttl.setter # type: ignore
    def default_ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "defaultTtl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="indexingPolicy")
    def indexing_policy(self) -> typing.List["CosmosdbSqlContainerIndexingPolicy"]:
        return jsii.get(self, "indexingPolicy")

    @indexing_policy.setter # type: ignore
    def indexing_policy(
        self,
        value: typing.List["CosmosdbSqlContainerIndexingPolicy"],
    ) -> None:
        jsii.set(self, "indexingPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyPath")
    def partition_key_path(self) -> builtins.str:
        return jsii.get(self, "partitionKeyPath")

    @partition_key_path.setter # type: ignore
    def partition_key_path(self, value: builtins.str) -> None:
        jsii.set(self, "partitionKeyPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyVersion")
    def partition_key_version(self) -> jsii.Number:
        return jsii.get(self, "partitionKeyVersion")

    @partition_key_version.setter # type: ignore
    def partition_key_version(self, value: jsii.Number) -> None:
        jsii.set(self, "partitionKeyVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbSqlContainerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbSqlContainerTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueKey")
    def unique_key(self) -> typing.List["CosmosdbSqlContainerUniqueKey"]:
        return jsii.get(self, "uniqueKey")

    @unique_key.setter # type: ignore
    def unique_key(self, value: typing.List["CosmosdbSqlContainerUniqueKey"]) -> None:
        jsii.set(self, "uniqueKey", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbSqlContainerAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "database_name": "databaseName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "default_ttl": "defaultTtl",
        "indexing_policy": "indexingPolicy",
        "partition_key_path": "partitionKeyPath",
        "partition_key_version": "partitionKeyVersion",
        "throughput": "throughput",
        "timeouts": "timeouts",
        "unique_key": "uniqueKey",
    },
)
class CosmosdbSqlContainerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbSqlContainerAutoscaleSettings]] = None,
        default_ttl: typing.Optional[jsii.Number] = None,
        indexing_policy: typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicy"]] = None,
        partition_key_path: typing.Optional[builtins.str] = None,
        partition_key_version: typing.Optional[jsii.Number] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbSqlContainerTimeouts"] = None,
        unique_key: typing.Optional[typing.List["CosmosdbSqlContainerUniqueKey"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param database_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param default_ttl: -
        :param indexing_policy: indexing_policy block.
        :param partition_key_path: -
        :param partition_key_version: -
        :param throughput: -
        :param timeouts: timeouts block.
        :param unique_key: unique_key block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbSqlContainerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "database_name": database_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if default_ttl is not None:
            self._values["default_ttl"] = default_ttl
        if indexing_policy is not None:
            self._values["indexing_policy"] = indexing_policy
        if partition_key_path is not None:
            self._values["partition_key_path"] = partition_key_path
        if partition_key_version is not None:
            self._values["partition_key_version"] = partition_key_version
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if unique_key is not None:
            self._values["unique_key"] = unique_key

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbSqlContainerAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def default_ttl(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("default_ttl")
        return result

    @builtins.property
    def indexing_policy(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicy"]]:
        """indexing_policy block."""
        result = self._values.get("indexing_policy")
        return result

    @builtins.property
    def partition_key_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("partition_key_path")
        return result

    @builtins.property
    def partition_key_version(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("partition_key_version")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbSqlContainerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def unique_key(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerUniqueKey"]]:
        """unique_key block."""
        result = self._values.get("unique_key")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerIndexingPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "composite_index": "compositeIndex",
        "excluded_path": "excludedPath",
        "included_path": "includedPath",
        "indexing_mode": "indexingMode",
    },
)
class CosmosdbSqlContainerIndexingPolicy:
    def __init__(
        self,
        *,
        composite_index: typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicyCompositeIndex"]] = None,
        excluded_path: typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicyExcludedPath"]] = None,
        included_path: typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicyIncludedPath"]] = None,
        indexing_mode: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param composite_index: composite_index block.
        :param excluded_path: excluded_path block.
        :param included_path: included_path block.
        :param indexing_mode: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if composite_index is not None:
            self._values["composite_index"] = composite_index
        if excluded_path is not None:
            self._values["excluded_path"] = excluded_path
        if included_path is not None:
            self._values["included_path"] = included_path
        if indexing_mode is not None:
            self._values["indexing_mode"] = indexing_mode

    @builtins.property
    def composite_index(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicyCompositeIndex"]]:
        """composite_index block."""
        result = self._values.get("composite_index")
        return result

    @builtins.property
    def excluded_path(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicyExcludedPath"]]:
        """excluded_path block."""
        result = self._values.get("excluded_path")
        return result

    @builtins.property
    def included_path(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlContainerIndexingPolicyIncludedPath"]]:
        """included_path block."""
        result = self._values.get("included_path")
        return result

    @builtins.property
    def indexing_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("indexing_mode")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerIndexingPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerIndexingPolicyCompositeIndex",
    jsii_struct_bases=[],
    name_mapping={"index": "index"},
)
class CosmosdbSqlContainerIndexingPolicyCompositeIndex:
    def __init__(
        self,
        *,
        index: typing.List["CosmosdbSqlContainerIndexingPolicyCompositeIndexIndex"],
    ) -> None:
        """
        :param index: index block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "index": index,
        }

    @builtins.property
    def index(
        self,
    ) -> typing.List["CosmosdbSqlContainerIndexingPolicyCompositeIndexIndex"]:
        """index block."""
        result = self._values.get("index")
        assert result is not None, "Required property 'index' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerIndexingPolicyCompositeIndex(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerIndexingPolicyCompositeIndexIndex",
    jsii_struct_bases=[],
    name_mapping={"order": "order", "path": "path"},
)
class CosmosdbSqlContainerIndexingPolicyCompositeIndexIndex:
    def __init__(self, *, order: builtins.str, path: builtins.str) -> None:
        """
        :param order: -
        :param path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "order": order,
            "path": path,
        }

    @builtins.property
    def order(self) -> builtins.str:
        result = self._values.get("order")
        assert result is not None, "Required property 'order' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerIndexingPolicyCompositeIndexIndex(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerIndexingPolicyExcludedPath",
    jsii_struct_bases=[],
    name_mapping={"path": "path"},
)
class CosmosdbSqlContainerIndexingPolicyExcludedPath:
    def __init__(self, *, path: builtins.str) -> None:
        """
        :param path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "path": path,
        }

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerIndexingPolicyExcludedPath(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerIndexingPolicyIncludedPath",
    jsii_struct_bases=[],
    name_mapping={"path": "path"},
)
class CosmosdbSqlContainerIndexingPolicyIncludedPath:
    def __init__(self, *, path: builtins.str) -> None:
        """
        :param path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "path": path,
        }

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerIndexingPolicyIncludedPath(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbSqlContainerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlContainerUniqueKey",
    jsii_struct_bases=[],
    name_mapping={"paths": "paths"},
)
class CosmosdbSqlContainerUniqueKey:
    def __init__(self, *, paths: typing.List[builtins.str]) -> None:
        """
        :param paths: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "paths": paths,
        }

    @builtins.property
    def paths(self) -> typing.List[builtins.str]:
        result = self._values.get("paths")
        assert result is not None, "Required property 'paths' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlContainerUniqueKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbSqlDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbSqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbSqlDatabaseAutoscaleSettings"]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbSqlDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbSqlDatabaseConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            throughput=throughput,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbSqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbSqlDatabaseAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbSqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(self) -> typing.List["CosmosdbSqlDatabaseAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbSqlDatabaseAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbSqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbSqlDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlDatabaseAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbSqlDatabaseAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlDatabaseAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "throughput": "throughput",
        "timeouts": "timeouts",
    },
)
class CosmosdbSqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbSqlDatabaseAutoscaleSettings]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbSqlDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbSqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbSqlDatabaseAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbSqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbSqlDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbSqlStoredProcedure(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbSqlStoredProcedure",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        body: builtins.str,
        container_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["CosmosdbSqlStoredProcedureTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param body: -
        :param container_name: -
        :param database_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbSqlStoredProcedureConfig(
            account_name=account_name,
            body=body,
            container_name=container_name,
            database_name=database_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbSqlStoredProcedure, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bodyInput")
    def body_input(self) -> builtins.str:
        return jsii.get(self, "bodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerNameInput")
    def container_name_input(self) -> builtins.str:
        return jsii.get(self, "containerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbSqlStoredProcedureTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="body")
    def body(self) -> builtins.str:
        return jsii.get(self, "body")

    @body.setter # type: ignore
    def body(self, value: builtins.str) -> None:
        jsii.set(self, "body", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerName")
    def container_name(self) -> builtins.str:
        return jsii.get(self, "containerName")

    @container_name.setter # type: ignore
    def container_name(self, value: builtins.str) -> None:
        jsii.set(self, "containerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbSqlStoredProcedureTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbSqlStoredProcedureTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlStoredProcedureConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "body": "body",
        "container_name": "containerName",
        "database_name": "databaseName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class CosmosdbSqlStoredProcedureConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        body: builtins.str,
        container_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["CosmosdbSqlStoredProcedureTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param body: -
        :param container_name: -
        :param database_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbSqlStoredProcedureTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "body": body,
            "container_name": container_name,
            "database_name": database_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def body(self) -> builtins.str:
        result = self._values.get("body")
        assert result is not None, "Required property 'body' is missing"
        return result

    @builtins.property
    def container_name(self) -> builtins.str:
        result = self._values.get("container_name")
        assert result is not None, "Required property 'container_name' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbSqlStoredProcedureTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlStoredProcedureConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbSqlStoredProcedureTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbSqlStoredProcedureTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbSqlStoredProcedureTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CosmosdbTable(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CosmosdbTable",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List["CosmosdbTableAutoscaleSettings"]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbTableTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CosmosdbTableConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            autoscale_settings=autoscale_settings,
            throughput=throughput,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CosmosdbTable, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoscaleSettings")
    def reset_autoscale_settings(self) -> None:
        return jsii.invoke(self, "resetAutoscaleSettings", [])

    @jsii.member(jsii_name="resetThroughput")
    def reset_throughput(self) -> None:
        return jsii.invoke(self, "resetThroughput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettingsInput")
    def autoscale_settings_input(
        self,
    ) -> typing.Optional[typing.List["CosmosdbTableAutoscaleSettings"]]:
        return jsii.get(self, "autoscaleSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughputInput")
    def throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CosmosdbTableTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoscaleSettings")
    def autoscale_settings(self) -> typing.List["CosmosdbTableAutoscaleSettings"]:
        return jsii.get(self, "autoscaleSettings")

    @autoscale_settings.setter # type: ignore
    def autoscale_settings(
        self,
        value: typing.List["CosmosdbTableAutoscaleSettings"],
    ) -> None:
        jsii.set(self, "autoscaleSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throughput")
    def throughput(self) -> jsii.Number:
        return jsii.get(self, "throughput")

    @throughput.setter # type: ignore
    def throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "throughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CosmosdbTableTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CosmosdbTableTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CosmosdbTableAutoscaleSettings",
    jsii_struct_bases=[],
    name_mapping={"max_throughput": "maxThroughput"},
)
class CosmosdbTableAutoscaleSettings:
    def __init__(self, *, max_throughput: typing.Optional[jsii.Number] = None) -> None:
        """
        :param max_throughput: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_throughput is not None:
            self._values["max_throughput"] = max_throughput

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_throughput")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbTableAutoscaleSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbTableConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "autoscale_settings": "autoscaleSettings",
        "throughput": "throughput",
        "timeouts": "timeouts",
    },
)
class CosmosdbTableConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        autoscale_settings: typing.Optional[typing.List[CosmosdbTableAutoscaleSettings]] = None,
        throughput: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["CosmosdbTableTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param autoscale_settings: autoscale_settings block.
        :param throughput: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CosmosdbTableTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if autoscale_settings is not None:
            self._values["autoscale_settings"] = autoscale_settings
        if throughput is not None:
            self._values["throughput"] = throughput
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def autoscale_settings(
        self,
    ) -> typing.Optional[typing.List[CosmosdbTableAutoscaleSettings]]:
        """autoscale_settings block."""
        result = self._values.get("autoscale_settings")
        return result

    @builtins.property
    def throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throughput")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CosmosdbTableTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbTableConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CosmosdbTableTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CosmosdbTableTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CosmosdbTableTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CostManagementExportResourceGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CostManagementExportResourceGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        delivery_info: typing.List["CostManagementExportResourceGroupDeliveryInfo"],
        name: builtins.str,
        query: typing.List["CostManagementExportResourceGroupQuery"],
        recurrence_period_end: builtins.str,
        recurrence_period_start: builtins.str,
        recurrence_type: builtins.str,
        resource_group_id: builtins.str,
        active: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["CostManagementExportResourceGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param delivery_info: delivery_info block.
        :param name: -
        :param query: query block.
        :param recurrence_period_end: -
        :param recurrence_period_start: -
        :param recurrence_type: -
        :param resource_group_id: -
        :param active: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CostManagementExportResourceGroupConfig(
            delivery_info=delivery_info,
            name=name,
            query=query,
            recurrence_period_end=recurrence_period_end,
            recurrence_period_start=recurrence_period_start,
            recurrence_type=recurrence_type,
            resource_group_id=resource_group_id,
            active=active,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CostManagementExportResourceGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetActive")
    def reset_active(self) -> None:
        return jsii.invoke(self, "resetActive", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deliveryInfoInput")
    def delivery_info_input(
        self,
    ) -> typing.List["CostManagementExportResourceGroupDeliveryInfo"]:
        return jsii.get(self, "deliveryInfoInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryInput")
    def query_input(self) -> typing.List["CostManagementExportResourceGroupQuery"]:
        return jsii.get(self, "queryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurrencePeriodEndInput")
    def recurrence_period_end_input(self) -> builtins.str:
        return jsii.get(self, "recurrencePeriodEndInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurrencePeriodStartInput")
    def recurrence_period_start_input(self) -> builtins.str:
        return jsii.get(self, "recurrencePeriodStartInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurrenceTypeInput")
    def recurrence_type_input(self) -> builtins.str:
        return jsii.get(self, "recurrenceTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupIdInput")
    def resource_group_id_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activeInput")
    def active_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "activeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["CostManagementExportResourceGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="active")
    def active(self) -> builtins.bool:
        return jsii.get(self, "active")

    @active.setter # type: ignore
    def active(self, value: builtins.bool) -> None:
        jsii.set(self, "active", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deliveryInfo")
    def delivery_info(
        self,
    ) -> typing.List["CostManagementExportResourceGroupDeliveryInfo"]:
        return jsii.get(self, "deliveryInfo")

    @delivery_info.setter # type: ignore
    def delivery_info(
        self,
        value: typing.List["CostManagementExportResourceGroupDeliveryInfo"],
    ) -> None:
        jsii.set(self, "deliveryInfo", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="query")
    def query(self) -> typing.List["CostManagementExportResourceGroupQuery"]:
        return jsii.get(self, "query")

    @query.setter # type: ignore
    def query(
        self,
        value: typing.List["CostManagementExportResourceGroupQuery"],
    ) -> None:
        jsii.set(self, "query", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurrencePeriodEnd")
    def recurrence_period_end(self) -> builtins.str:
        return jsii.get(self, "recurrencePeriodEnd")

    @recurrence_period_end.setter # type: ignore
    def recurrence_period_end(self, value: builtins.str) -> None:
        jsii.set(self, "recurrencePeriodEnd", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurrencePeriodStart")
    def recurrence_period_start(self) -> builtins.str:
        return jsii.get(self, "recurrencePeriodStart")

    @recurrence_period_start.setter # type: ignore
    def recurrence_period_start(self, value: builtins.str) -> None:
        jsii.set(self, "recurrencePeriodStart", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurrenceType")
    def recurrence_type(self) -> builtins.str:
        return jsii.get(self, "recurrenceType")

    @recurrence_type.setter # type: ignore
    def recurrence_type(self, value: builtins.str) -> None:
        jsii.set(self, "recurrenceType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupId")
    def resource_group_id(self) -> builtins.str:
        return jsii.get(self, "resourceGroupId")

    @resource_group_id.setter # type: ignore
    def resource_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CostManagementExportResourceGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CostManagementExportResourceGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.CostManagementExportResourceGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "delivery_info": "deliveryInfo",
        "name": "name",
        "query": "query",
        "recurrence_period_end": "recurrencePeriodEnd",
        "recurrence_period_start": "recurrencePeriodStart",
        "recurrence_type": "recurrenceType",
        "resource_group_id": "resourceGroupId",
        "active": "active",
        "timeouts": "timeouts",
    },
)
class CostManagementExportResourceGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        delivery_info: typing.List["CostManagementExportResourceGroupDeliveryInfo"],
        name: builtins.str,
        query: typing.List["CostManagementExportResourceGroupQuery"],
        recurrence_period_end: builtins.str,
        recurrence_period_start: builtins.str,
        recurrence_type: builtins.str,
        resource_group_id: builtins.str,
        active: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["CostManagementExportResourceGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param delivery_info: delivery_info block.
        :param name: -
        :param query: query block.
        :param recurrence_period_end: -
        :param recurrence_period_start: -
        :param recurrence_type: -
        :param resource_group_id: -
        :param active: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CostManagementExportResourceGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "delivery_info": delivery_info,
            "name": name,
            "query": query,
            "recurrence_period_end": recurrence_period_end,
            "recurrence_period_start": recurrence_period_start,
            "recurrence_type": recurrence_type,
            "resource_group_id": resource_group_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if active is not None:
            self._values["active"] = active
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def delivery_info(
        self,
    ) -> typing.List["CostManagementExportResourceGroupDeliveryInfo"]:
        """delivery_info block."""
        result = self._values.get("delivery_info")
        assert result is not None, "Required property 'delivery_info' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def query(self) -> typing.List["CostManagementExportResourceGroupQuery"]:
        """query block."""
        result = self._values.get("query")
        assert result is not None, "Required property 'query' is missing"
        return result

    @builtins.property
    def recurrence_period_end(self) -> builtins.str:
        result = self._values.get("recurrence_period_end")
        assert result is not None, "Required property 'recurrence_period_end' is missing"
        return result

    @builtins.property
    def recurrence_period_start(self) -> builtins.str:
        result = self._values.get("recurrence_period_start")
        assert result is not None, "Required property 'recurrence_period_start' is missing"
        return result

    @builtins.property
    def recurrence_type(self) -> builtins.str:
        result = self._values.get("recurrence_type")
        assert result is not None, "Required property 'recurrence_type' is missing"
        return result

    @builtins.property
    def resource_group_id(self) -> builtins.str:
        result = self._values.get("resource_group_id")
        assert result is not None, "Required property 'resource_group_id' is missing"
        return result

    @builtins.property
    def active(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("active")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CostManagementExportResourceGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CostManagementExportResourceGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CostManagementExportResourceGroupDeliveryInfo",
    jsii_struct_bases=[],
    name_mapping={
        "container_name": "containerName",
        "root_folder_path": "rootFolderPath",
        "storage_account_id": "storageAccountId",
    },
)
class CostManagementExportResourceGroupDeliveryInfo:
    def __init__(
        self,
        *,
        container_name: builtins.str,
        root_folder_path: builtins.str,
        storage_account_id: builtins.str,
    ) -> None:
        """
        :param container_name: -
        :param root_folder_path: -
        :param storage_account_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "container_name": container_name,
            "root_folder_path": root_folder_path,
            "storage_account_id": storage_account_id,
        }

    @builtins.property
    def container_name(self) -> builtins.str:
        result = self._values.get("container_name")
        assert result is not None, "Required property 'container_name' is missing"
        return result

    @builtins.property
    def root_folder_path(self) -> builtins.str:
        result = self._values.get("root_folder_path")
        assert result is not None, "Required property 'root_folder_path' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CostManagementExportResourceGroupDeliveryInfo(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CostManagementExportResourceGroupQuery",
    jsii_struct_bases=[],
    name_mapping={"time_frame": "timeFrame", "type": "type"},
)
class CostManagementExportResourceGroupQuery:
    def __init__(self, *, time_frame: builtins.str, type: builtins.str) -> None:
        """
        :param time_frame: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "time_frame": time_frame,
            "type": type,
        }

    @builtins.property
    def time_frame(self) -> builtins.str:
        result = self._values.get("time_frame")
        assert result is not None, "Required property 'time_frame' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CostManagementExportResourceGroupQuery(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CostManagementExportResourceGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CostManagementExportResourceGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CostManagementExportResourceGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class CustomProvider(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.CustomProvider",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        action: typing.Optional[typing.List["CustomProviderAction"]] = None,
        resource_type: typing.Optional[typing.List["CustomProviderResourceType"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CustomProviderTimeouts"] = None,
        validation: typing.Optional[typing.List["CustomProviderValidation"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param action: action block.
        :param resource_type: resource_type block.
        :param tags: -
        :param timeouts: timeouts block.
        :param validation: validation block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CustomProviderConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            action=action,
            resource_type=resource_type,
            tags=tags,
            timeouts=timeouts,
            validation=validation,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(CustomProvider, self, [scope, id, config])

    @jsii.member(jsii_name="resetAction")
    def reset_action(self) -> None:
        return jsii.invoke(self, "resetAction", [])

    @jsii.member(jsii_name="resetResourceType")
    def reset_resource_type(self) -> None:
        return jsii.invoke(self, "resetResourceType", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetValidation")
    def reset_validation(self) -> None:
        return jsii.invoke(self, "resetValidation", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> typing.Optional[typing.List["CustomProviderAction"]]:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceTypeInput")
    def resource_type_input(
        self,
    ) -> typing.Optional[typing.List["CustomProviderResourceType"]]:
        return jsii.get(self, "resourceTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["CustomProviderTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validationInput")
    def validation_input(
        self,
    ) -> typing.Optional[typing.List["CustomProviderValidation"]]:
        return jsii.get(self, "validationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> typing.List["CustomProviderAction"]:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: typing.List["CustomProviderAction"]) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceType")
    def resource_type(self) -> typing.List["CustomProviderResourceType"]:
        return jsii.get(self, "resourceType")

    @resource_type.setter # type: ignore
    def resource_type(self, value: typing.List["CustomProviderResourceType"]) -> None:
        jsii.set(self, "resourceType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "CustomProviderTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "CustomProviderTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validation")
    def validation(self) -> typing.List["CustomProviderValidation"]:
        return jsii.get(self, "validation")

    @validation.setter # type: ignore
    def validation(self, value: typing.List["CustomProviderValidation"]) -> None:
        jsii.set(self, "validation", value)


@jsii.data_type(
    jsii_type="azurerm.CustomProviderAction",
    jsii_struct_bases=[],
    name_mapping={"endpoint": "endpoint", "name": "name"},
)
class CustomProviderAction:
    def __init__(self, *, endpoint: builtins.str, name: builtins.str) -> None:
        """
        :param endpoint: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "endpoint": endpoint,
            "name": name,
        }

    @builtins.property
    def endpoint(self) -> builtins.str:
        result = self._values.get("endpoint")
        assert result is not None, "Required property 'endpoint' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CustomProviderAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CustomProviderConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "action": "action",
        "resource_type": "resourceType",
        "tags": "tags",
        "timeouts": "timeouts",
        "validation": "validation",
    },
)
class CustomProviderConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        action: typing.Optional[typing.List[CustomProviderAction]] = None,
        resource_type: typing.Optional[typing.List["CustomProviderResourceType"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["CustomProviderTimeouts"] = None,
        validation: typing.Optional[typing.List["CustomProviderValidation"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param action: action block.
        :param resource_type: resource_type block.
        :param tags: -
        :param timeouts: timeouts block.
        :param validation: validation block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = CustomProviderTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if action is not None:
            self._values["action"] = action
        if resource_type is not None:
            self._values["resource_type"] = resource_type
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if validation is not None:
            self._values["validation"] = validation

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def action(self) -> typing.Optional[typing.List[CustomProviderAction]]:
        """action block."""
        result = self._values.get("action")
        return result

    @builtins.property
    def resource_type(
        self,
    ) -> typing.Optional[typing.List["CustomProviderResourceType"]]:
        """resource_type block."""
        result = self._values.get("resource_type")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["CustomProviderTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def validation(self) -> typing.Optional[typing.List["CustomProviderValidation"]]:
        """validation block."""
        result = self._values.get("validation")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CustomProviderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CustomProviderResourceType",
    jsii_struct_bases=[],
    name_mapping={
        "endpoint": "endpoint",
        "name": "name",
        "routing_type": "routingType",
    },
)
class CustomProviderResourceType:
    def __init__(
        self,
        *,
        endpoint: builtins.str,
        name: builtins.str,
        routing_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param endpoint: -
        :param name: -
        :param routing_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "endpoint": endpoint,
            "name": name,
        }
        if routing_type is not None:
            self._values["routing_type"] = routing_type

    @builtins.property
    def endpoint(self) -> builtins.str:
        result = self._values.get("endpoint")
        assert result is not None, "Required property 'endpoint' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def routing_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("routing_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CustomProviderResourceType(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CustomProviderTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class CustomProviderTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CustomProviderTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.CustomProviderValidation",
    jsii_struct_bases=[],
    name_mapping={"specification": "specification"},
)
class CustomProviderValidation:
    def __init__(self, *, specification: builtins.str) -> None:
        """
        :param specification: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "specification": specification,
        }

    @builtins.property
    def specification(self) -> builtins.str:
        result = self._values.get("specification")
        assert result is not None, "Required property 'specification' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "CustomProviderValidation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Dashboard(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Dashboard",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        dashboard_properties: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DashboardTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param dashboard_properties: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DashboardConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            dashboard_properties=dashboard_properties,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Dashboard, self, [scope, id, config])

    @jsii.member(jsii_name="resetDashboardProperties")
    def reset_dashboard_properties(self) -> None:
        return jsii.invoke(self, "resetDashboardProperties", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dashboardPropertiesInput")
    def dashboard_properties_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dashboardPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DashboardTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dashboardProperties")
    def dashboard_properties(self) -> builtins.str:
        return jsii.get(self, "dashboardProperties")

    @dashboard_properties.setter # type: ignore
    def dashboard_properties(self, value: builtins.str) -> None:
        jsii.set(self, "dashboardProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DashboardTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DashboardTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DashboardConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "dashboard_properties": "dashboardProperties",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DashboardConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        dashboard_properties: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DashboardTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param dashboard_properties: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DashboardTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if dashboard_properties is not None:
            self._values["dashboard_properties"] = dashboard_properties
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def dashboard_properties(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dashboard_properties")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DashboardTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DashboardConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DashboardTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DashboardTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DashboardTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAdvisorRecommendations(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAdvisorRecommendations",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        filter_by_category: typing.Optional[typing.List[builtins.str]] = None,
        filter_by_resource_groups: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermAdvisorRecommendationsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param filter_by_category: -
        :param filter_by_resource_groups: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAdvisorRecommendationsConfig(
            filter_by_category=filter_by_category,
            filter_by_resource_groups=filter_by_resource_groups,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAdvisorRecommendations, self, [scope, id, config])

    @jsii.member(jsii_name="recommendations")
    def recommendations(
        self,
        index: builtins.str,
    ) -> "DataAzurermAdvisorRecommendationsRecommendations":
        """
        :param index: -
        """
        return jsii.invoke(self, "recommendations", [index])

    @jsii.member(jsii_name="resetFilterByCategory")
    def reset_filter_by_category(self) -> None:
        return jsii.invoke(self, "resetFilterByCategory", [])

    @jsii.member(jsii_name="resetFilterByResourceGroups")
    def reset_filter_by_resource_groups(self) -> None:
        return jsii.invoke(self, "resetFilterByResourceGroups", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterByCategoryInput")
    def filter_by_category_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "filterByCategoryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterByResourceGroupsInput")
    def filter_by_resource_groups_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "filterByResourceGroupsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAdvisorRecommendationsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterByCategory")
    def filter_by_category(self) -> typing.List[builtins.str]:
        return jsii.get(self, "filterByCategory")

    @filter_by_category.setter # type: ignore
    def filter_by_category(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "filterByCategory", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterByResourceGroups")
    def filter_by_resource_groups(self) -> typing.List[builtins.str]:
        return jsii.get(self, "filterByResourceGroups")

    @filter_by_resource_groups.setter # type: ignore
    def filter_by_resource_groups(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "filterByResourceGroups", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAdvisorRecommendationsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAdvisorRecommendationsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAdvisorRecommendationsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "filter_by_category": "filterByCategory",
        "filter_by_resource_groups": "filterByResourceGroups",
        "timeouts": "timeouts",
    },
)
class DataAzurermAdvisorRecommendationsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        filter_by_category: typing.Optional[typing.List[builtins.str]] = None,
        filter_by_resource_groups: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermAdvisorRecommendationsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filter_by_category: -
        :param filter_by_resource_groups: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAdvisorRecommendationsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if filter_by_category is not None:
            self._values["filter_by_category"] = filter_by_category
        if filter_by_resource_groups is not None:
            self._values["filter_by_resource_groups"] = filter_by_resource_groups
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def filter_by_category(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("filter_by_category")
        return result

    @builtins.property
    def filter_by_resource_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("filter_by_resource_groups")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAdvisorRecommendationsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAdvisorRecommendationsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAdvisorRecommendationsRecommendations(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAdvisorRecommendationsRecommendations",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAdvisorRecommendationsRecommendations, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="category")
    def category(self) -> builtins.str:
        return jsii.get(self, "category")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="impact")
    def impact(self) -> builtins.str:
        return jsii.get(self, "impact")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recommendationName")
    def recommendation_name(self) -> builtins.str:
        return jsii.get(self, "recommendationName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recommendationTypeId")
    def recommendation_type_id(self) -> builtins.str:
        return jsii.get(self, "recommendationTypeId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceName")
    def resource_name(self) -> builtins.str:
        return jsii.get(self, "resourceName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceType")
    def resource_type(self) -> builtins.str:
        return jsii.get(self, "resourceType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="suppressionNames")
    def suppression_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "suppressionNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="updatedTime")
    def updated_time(self) -> builtins.str:
        return jsii.get(self, "updatedTime")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAdvisorRecommendationsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAdvisorRecommendationsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAdvisorRecommendationsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApiManagement(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagement",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApiManagementConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApiManagement, self, [scope, id, config])

    @jsii.member(jsii_name="additionalLocation")
    def additional_location(
        self,
        index: builtins.str,
    ) -> "DataAzurermApiManagementAdditionalLocation":
        """
        :param index: -
        """
        return jsii.invoke(self, "additionalLocation", [index])

    @jsii.member(jsii_name="hostnameConfiguration")
    def hostname_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermApiManagementHostnameConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "hostnameConfiguration", [index])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermApiManagementIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerPortalUrl")
    def developer_portal_url(self) -> builtins.str:
        return jsii.get(self, "developerPortalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayRegionalUrl")
    def gateway_regional_url(self) -> builtins.str:
        return jsii.get(self, "gatewayRegionalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayUrl")
    def gateway_url(self) -> builtins.str:
        return jsii.get(self, "gatewayUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementApiUrl")
    def management_api_url(self) -> builtins.str:
        return jsii.get(self, "managementApiUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationSenderEmail")
    def notification_sender_email(self) -> builtins.str:
        return jsii.get(self, "notificationSenderEmail")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portalUrl")
    def portal_url(self) -> builtins.str:
        return jsii.get(self, "portalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddresses")
    def public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherEmail")
    def publisher_email(self) -> builtins.str:
        return jsii.get(self, "publisherEmail")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherName")
    def publisher_name(self) -> builtins.str:
        return jsii.get(self, "publisherName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmUrl")
    def scm_url(self) -> builtins.str:
        return jsii.get(self, "scmUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermApiManagementTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApiManagementTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApiManagementTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermApiManagementAdditionalLocation(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementAdditionalLocation",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementAdditionalLocation, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayRegionalUrl")
    def gateway_regional_url(self) -> builtins.str:
        return jsii.get(self, "gatewayRegionalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddresses")
    def public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddresses")


class DataAzurermApiManagementApi(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementApi",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        revision: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementApiTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param revision: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApiManagementApiConfig(
            api_management_name=api_management_name,
            name=name,
            resource_group_name=resource_group_name,
            revision=revision,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApiManagementApi, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="subscriptionKeyParameterNames")
    def subscription_key_parameter_names(
        self,
        index: builtins.str,
    ) -> "DataAzurermApiManagementApiSubscriptionKeyParameterNames":
        """
        :param index: -
        """
        return jsii.invoke(self, "subscriptionKeyParameterNames", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isCurrent")
    def is_current(self) -> builtins.bool:
        return jsii.get(self, "isCurrent")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isOnline")
    def is_online(self) -> builtins.bool:
        return jsii.get(self, "isOnline")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="path")
    def path(self) -> builtins.str:
        return jsii.get(self, "path")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocols")
    def protocols(self) -> typing.List[builtins.str]:
        return jsii.get(self, "protocols")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="revisionInput")
    def revision_input(self) -> builtins.str:
        return jsii.get(self, "revisionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceUrl")
    def service_url(self) -> builtins.str:
        return jsii.get(self, "serviceUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="soapPassThrough")
    def soap_pass_through(self) -> builtins.bool:
        return jsii.get(self, "soapPassThrough")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionRequired")
    def subscription_required(self) -> builtins.bool:
        return jsii.get(self, "subscriptionRequired")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionSetId")
    def version_set_id(self) -> builtins.str:
        return jsii.get(self, "versionSetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermApiManagementApiTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="revision")
    def revision(self) -> builtins.str:
        return jsii.get(self, "revision")

    @revision.setter # type: ignore
    def revision(self, value: builtins.str) -> None:
        jsii.set(self, "revision", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApiManagementApiTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApiManagementApiTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementApiConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "revision": "revision",
        "timeouts": "timeouts",
    },
)
class DataAzurermApiManagementApiConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        revision: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementApiTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param revision: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApiManagementApiTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "revision": revision,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def revision(self) -> builtins.str:
        result = self._values.get("revision")
        assert result is not None, "Required property 'revision' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermApiManagementApiTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementApiConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApiManagementApiSubscriptionKeyParameterNames(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementApiSubscriptionKeyParameterNames",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementApiSubscriptionKeyParameterNames, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="header")
    def header(self) -> builtins.str:
        return jsii.get(self, "header")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="query")
    def query(self) -> builtins.str:
        return jsii.get(self, "query")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementApiTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApiManagementApiTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementApiTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApiManagementApiVersionSet(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementApiVersionSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementApiVersionSetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApiManagementApiVersionSetConfig(
            api_management_name=api_management_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApiManagementApiVersionSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionHeaderName")
    def version_header_name(self) -> builtins.str:
        return jsii.get(self, "versionHeaderName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versioningScheme")
    def versioning_scheme(self) -> builtins.str:
        return jsii.get(self, "versioningScheme")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionQueryName")
    def version_query_name(self) -> builtins.str:
        return jsii.get(self, "versionQueryName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermApiManagementApiVersionSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApiManagementApiVersionSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApiManagementApiVersionSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementApiVersionSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermApiManagementApiVersionSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementApiVersionSetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApiManagementApiVersionSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermApiManagementApiVersionSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementApiVersionSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementApiVersionSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApiManagementApiVersionSetTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementApiVersionSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermApiManagementConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApiManagementTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermApiManagementTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApiManagementGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApiManagementGroupConfig(
            api_management_name=api_management_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApiManagementGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="externalId")
    def external_id(self) -> builtins.str:
        return jsii.get(self, "externalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermApiManagementGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApiManagementGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApiManagementGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermApiManagementGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApiManagementGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermApiManagementGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApiManagementGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApiManagementHostnameConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementHostnameConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementHostnameConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="developerPortal")
    def developer_portal(self) -> typing.Any:
        return jsii.get(self, "developerPortal")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="management")
    def management(self) -> typing.Any:
        return jsii.get(self, "management")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portal")
    def portal(self) -> typing.Any:
        return jsii.get(self, "portal")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proxy")
    def proxy(self) -> typing.Any:
        return jsii.get(self, "proxy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scm")
    def scm(self) -> typing.Any:
        return jsii.get(self, "scm")


class DataAzurermApiManagementHostnameConfigurationDeveloperPortal(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementHostnameConfigurationDeveloperPortal",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementHostnameConfigurationDeveloperPortal, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="negotiateClientCertificate")
    def negotiate_client_certificate(self) -> builtins.bool:
        return jsii.get(self, "negotiateClientCertificate")


class DataAzurermApiManagementHostnameConfigurationManagement(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementHostnameConfigurationManagement",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementHostnameConfigurationManagement, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="negotiateClientCertificate")
    def negotiate_client_certificate(self) -> builtins.bool:
        return jsii.get(self, "negotiateClientCertificate")


class DataAzurermApiManagementHostnameConfigurationPortal(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementHostnameConfigurationPortal",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementHostnameConfigurationPortal, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="negotiateClientCertificate")
    def negotiate_client_certificate(self) -> builtins.bool:
        return jsii.get(self, "negotiateClientCertificate")


class DataAzurermApiManagementHostnameConfigurationProxy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementHostnameConfigurationProxy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementHostnameConfigurationProxy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSslBinding")
    def default_ssl_binding(self) -> builtins.bool:
        return jsii.get(self, "defaultSslBinding")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="negotiateClientCertificate")
    def negotiate_client_certificate(self) -> builtins.bool:
        return jsii.get(self, "negotiateClientCertificate")


class DataAzurermApiManagementHostnameConfigurationScm(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementHostnameConfigurationScm",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementHostnameConfigurationScm, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="negotiateClientCertificate")
    def negotiate_client_certificate(self) -> builtins.bool:
        return jsii.get(self, "negotiateClientCertificate")


class DataAzurermApiManagementIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermApiManagementIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityIds")
    def identity_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "identityIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


class DataAzurermApiManagementProduct(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementProduct",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementProductTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApiManagementProductConfig(
            api_management_name=api_management_name,
            product_id=product_id,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApiManagementProduct, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="approvalRequired")
    def approval_required(self) -> builtins.bool:
        return jsii.get(self, "approvalRequired")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productIdInput")
    def product_id_input(self) -> builtins.str:
        return jsii.get(self, "productIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="published")
    def published(self) -> builtins.bool:
        return jsii.get(self, "published")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionRequired")
    def subscription_required(self) -> builtins.bool:
        return jsii.get(self, "subscriptionRequired")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionsLimit")
    def subscriptions_limit(self) -> jsii.Number:
        return jsii.get(self, "subscriptionsLimit")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terms")
    def terms(self) -> builtins.str:
        return jsii.get(self, "terms")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermApiManagementProductTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productId")
    def product_id(self) -> builtins.str:
        return jsii.get(self, "productId")

    @product_id.setter # type: ignore
    def product_id(self, value: builtins.str) -> None:
        jsii.set(self, "productId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApiManagementProductTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApiManagementProductTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementProductConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "product_id": "productId",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermApiManagementProductConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        product_id: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementProductTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param product_id: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApiManagementProductTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "product_id": product_id,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def product_id(self) -> builtins.str:
        result = self._values.get("product_id")
        assert result is not None, "Required property 'product_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermApiManagementProductTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementProductConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementProductTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApiManagementProductTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementProductTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApiManagementTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApiManagementUser(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApiManagementUser",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        api_management_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementUserTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param api_management_name: -
        :param resource_group_name: -
        :param user_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApiManagementUserConfig(
            api_management_name=api_management_name,
            resource_group_name=resource_group_name,
            user_id=user_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApiManagementUser, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementNameInput")
    def api_management_name_input(self) -> builtins.str:
        return jsii.get(self, "apiManagementNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="email")
    def email(self) -> builtins.str:
        return jsii.get(self, "email")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firstName")
    def first_name(self) -> builtins.str:
        return jsii.get(self, "firstName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lastName")
    def last_name(self) -> builtins.str:
        return jsii.get(self, "lastName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="note")
    def note(self) -> builtins.str:
        return jsii.get(self, "note")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="state")
    def state(self) -> builtins.str:
        return jsii.get(self, "state")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userIdInput")
    def user_id_input(self) -> builtins.str:
        return jsii.get(self, "userIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermApiManagementUserTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiManagementName")
    def api_management_name(self) -> builtins.str:
        return jsii.get(self, "apiManagementName")

    @api_management_name.setter # type: ignore
    def api_management_name(self, value: builtins.str) -> None:
        jsii.set(self, "apiManagementName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApiManagementUserTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApiManagementUserTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userId")
    def user_id(self) -> builtins.str:
        return jsii.get(self, "userId")

    @user_id.setter # type: ignore
    def user_id(self, value: builtins.str) -> None:
        jsii.set(self, "userId", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementUserConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "api_management_name": "apiManagementName",
        "resource_group_name": "resourceGroupName",
        "user_id": "userId",
        "timeouts": "timeouts",
    },
)
class DataAzurermApiManagementUserConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        api_management_name: builtins.str,
        resource_group_name: builtins.str,
        user_id: builtins.str,
        timeouts: typing.Optional["DataAzurermApiManagementUserTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param api_management_name: -
        :param resource_group_name: -
        :param user_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApiManagementUserTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "api_management_name": api_management_name,
            "resource_group_name": resource_group_name,
            "user_id": user_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def api_management_name(self) -> builtins.str:
        result = self._values.get("api_management_name")
        assert result is not None, "Required property 'api_management_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def user_id(self) -> builtins.str:
        result = self._values.get("user_id")
        assert result is not None, "Required property 'user_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermApiManagementUserTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementUserConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApiManagementUserTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApiManagementUserTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApiManagementUserTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppConfiguration(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAppConfigurationConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAppConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="primaryReadKey")
    def primary_read_key(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppConfigurationPrimaryReadKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "primaryReadKey", [index])

    @jsii.member(jsii_name="primaryWriteKey")
    def primary_write_key(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppConfigurationPrimaryWriteKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "primaryWriteKey", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="secondaryReadKey")
    def secondary_read_key(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppConfigurationSecondaryReadKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "secondaryReadKey", [index])

    @jsii.member(jsii_name="secondaryWriteKey")
    def secondary_write_key(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppConfigurationSecondaryWriteKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "secondaryWriteKey", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermAppConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAppConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAppConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAppConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAppConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAppConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppConfigurationPrimaryReadKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppConfigurationPrimaryReadKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppConfigurationPrimaryReadKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


class DataAzurermAppConfigurationPrimaryWriteKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppConfigurationPrimaryWriteKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppConfigurationPrimaryWriteKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


class DataAzurermAppConfigurationSecondaryReadKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppConfigurationSecondaryReadKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppConfigurationSecondaryReadKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


class DataAzurermAppConfigurationSecondaryWriteKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppConfigurationSecondaryWriteKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppConfigurationSecondaryWriteKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> builtins.str:
        return jsii.get(self, "secret")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAppConfigurationTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppService(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAppServiceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAppService, self, [scope, id, config])

    @jsii.member(jsii_name="appSettings")
    def app_settings(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "appSettings", [key])

    @jsii.member(jsii_name="connectionString")
    def connection_string(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppServiceConnectionString":
        """
        :param index: -
        """
        return jsii.invoke(self, "connectionString", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="siteConfig")
    def site_config(self, index: builtins.str) -> "DataAzurermAppServiceSiteConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteConfig", [index])

    @jsii.member(jsii_name="siteCredential")
    def site_credential(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppServiceSiteCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteCredential", [index])

    @jsii.member(jsii_name="sourceControl")
    def source_control(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppServiceSourceControl":
        """
        :param index: -
        """
        return jsii.invoke(self, "sourceControl", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanId")
    def app_service_plan_id(self) -> builtins.str:
        return jsii.get(self, "appServicePlanId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabled")
    def client_affinity_enabled(self) -> builtins.bool:
        return jsii.get(self, "clientAffinityEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertEnabled")
    def client_cert_enabled(self) -> builtins.bool:
        return jsii.get(self, "clientCertEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDomainVerificationId")
    def custom_domain_verification_id(self) -> builtins.str:
        return jsii.get(self, "customDomainVerificationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSiteHostname")
    def default_site_hostname(self) -> builtins.str:
        return jsii.get(self, "defaultSiteHostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnly")
    def https_only(self) -> builtins.bool:
        return jsii.get(self, "httpsOnly")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundIpAddresses")
    def outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "outboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="possibleOutboundIpAddresses")
    def possible_outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "possibleOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermAppServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAppServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAppServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermAppServiceCertificate(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermAppServiceCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAppServiceCertificateConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAppServiceCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationDate")
    def expiration_date(self) -> builtins.str:
        return jsii.get(self, "expirationDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostNames")
    def host_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "hostNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="issueDate")
    def issue_date(self) -> builtins.str:
        return jsii.get(self, "issueDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="issuer")
    def issuer(self) -> builtins.str:
        return jsii.get(self, "issuer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subjectName")
    def subject_name(self) -> builtins.str:
        return jsii.get(self, "subjectName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAppServiceCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAppServiceCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAppServiceCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermAppServiceCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermAppServiceCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAppServiceCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAppServiceCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppServiceCertificateOrder(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceCertificateOrder",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServiceCertificateOrderTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAppServiceCertificateOrderConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAppServiceCertificateOrder, self, [scope, id, config])

    @jsii.member(jsii_name="certificates")
    def certificates(
        self,
        index: builtins.str,
    ) -> "DataAzurermAppServiceCertificateOrderCertificates":
        """
        :param index: -
        """
        return jsii.invoke(self, "certificates", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceCertificateNotRenewableReasons")
    def app_service_certificate_not_renewable_reasons(
        self,
    ) -> typing.List[builtins.str]:
        return jsii.get(self, "appServiceCertificateNotRenewableReasons")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoRenew")
    def auto_renew(self) -> builtins.bool:
        return jsii.get(self, "autoRenew")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="csr")
    def csr(self) -> builtins.str:
        return jsii.get(self, "csr")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="distinguishedName")
    def distinguished_name(self) -> builtins.str:
        return jsii.get(self, "distinguishedName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainVerificationToken")
    def domain_verification_token(self) -> builtins.str:
        return jsii.get(self, "domainVerificationToken")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> builtins.str:
        return jsii.get(self, "expirationTime")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intermediateThumbprint")
    def intermediate_thumbprint(self) -> builtins.str:
        return jsii.get(self, "intermediateThumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isPrivateKeyExternal")
    def is_private_key_external(self) -> builtins.bool:
        return jsii.get(self, "isPrivateKeyExternal")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keySize")
    def key_size(self) -> jsii.Number:
        return jsii.get(self, "keySize")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productType")
    def product_type(self) -> builtins.str:
        return jsii.get(self, "productType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rootThumbprint")
    def root_thumbprint(self) -> builtins.str:
        return jsii.get(self, "rootThumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signedCertificateThumbprint")
    def signed_certificate_thumbprint(self) -> builtins.str:
        return jsii.get(self, "signedCertificateThumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validityInYears")
    def validity_in_years(self) -> jsii.Number:
        return jsii.get(self, "validityInYears")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAppServiceCertificateOrderTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAppServiceCertificateOrderTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAppServiceCertificateOrderTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermAppServiceCertificateOrderCertificates(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceCertificateOrderCertificates",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceCertificateOrderCertificates, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateName")
    def certificate_name(self) -> builtins.str:
        return jsii.get(self, "certificateName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultSecretName")
    def key_vault_secret_name(self) -> builtins.str:
        return jsii.get(self, "keyVaultSecretName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisioningState")
    def provisioning_state(self) -> builtins.str:
        return jsii.get(self, "provisioningState")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceCertificateOrderConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAppServiceCertificateOrderConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServiceCertificateOrderTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAppServiceCertificateOrderTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermAppServiceCertificateOrderTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceCertificateOrderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceCertificateOrderTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAppServiceCertificateOrderTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceCertificateOrderTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAppServiceCertificateTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAppServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAppServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAppServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppServiceConnectionString(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceConnectionString",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceConnectionString, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")


class DataAzurermAppServiceEnvironment(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceEnvironment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServiceEnvironmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAppServiceEnvironmentConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAppServiceEnvironment, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontEndScaleFactor")
    def front_end_scale_factor(self) -> jsii.Number:
        return jsii.get(self, "frontEndScaleFactor")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internalIpAddress")
    def internal_ip_address(self) -> builtins.str:
        return jsii.get(self, "internalIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundIpAddresses")
    def outbound_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "outboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pricingTier")
    def pricing_tier(self) -> builtins.str:
        return jsii.get(self, "pricingTier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceIpAddress")
    def service_ip_address(self) -> builtins.str:
        return jsii.get(self, "serviceIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAppServiceEnvironmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAppServiceEnvironmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAppServiceEnvironmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceEnvironmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAppServiceEnvironmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServiceEnvironmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAppServiceEnvironmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAppServiceEnvironmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceEnvironmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceEnvironmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAppServiceEnvironmentTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceEnvironmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppServicePlan(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServicePlan",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServicePlanTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAppServicePlanConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAppServicePlan, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="sku")
    def sku(self, index: builtins.str) -> "DataAzurermAppServicePlanSku":
        """
        :param index: -
        """
        return jsii.invoke(self, "sku", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServiceEnvironmentId")
    def app_service_environment_id(self) -> builtins.str:
        return jsii.get(self, "appServiceEnvironmentId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isXenon")
    def is_xenon(self) -> builtins.bool:
        return jsii.get(self, "isXenon")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumElasticWorkerCount")
    def maximum_elastic_worker_count(self) -> jsii.Number:
        return jsii.get(self, "maximumElasticWorkerCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumNumberOfWorkers")
    def maximum_number_of_workers(self) -> jsii.Number:
        return jsii.get(self, "maximumNumberOfWorkers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="perSiteScaling")
    def per_site_scaling(self) -> builtins.bool:
        return jsii.get(self, "perSiteScaling")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reserved")
    def reserved(self) -> builtins.bool:
        return jsii.get(self, "reserved")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermAppServicePlanTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAppServicePlanTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAppServicePlanTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServicePlanConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAppServicePlanConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAppServicePlanTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAppServicePlanTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAppServicePlanTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServicePlanConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppServicePlanSku(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServicePlanSku",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServicePlanSku, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacity")
    def capacity(self) -> jsii.Number:
        return jsii.get(self, "capacity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="size")
    def size(self) -> builtins.str:
        return jsii.get(self, "size")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServicePlanTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAppServicePlanTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServicePlanTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAppServiceSiteConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceSiteConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceSiteConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alwaysOn")
    def always_on(self) -> builtins.bool:
        return jsii.get(self, "alwaysOn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appCommandLine")
    def app_command_line(self) -> builtins.str:
        return jsii.get(self, "appCommandLine")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cors")
    def cors(self) -> typing.Any:
        return jsii.get(self, "cors")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultDocuments")
    def default_documents(self) -> typing.List[builtins.str]:
        return jsii.get(self, "defaultDocuments")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dotnetFrameworkVersion")
    def dotnet_framework_version(self) -> builtins.str:
        return jsii.get(self, "dotnetFrameworkVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ftpsState")
    def ftps_state(self) -> builtins.str:
        return jsii.get(self, "ftpsState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthCheckPath")
    def health_check_path(self) -> builtins.str:
        return jsii.get(self, "healthCheckPath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="http2Enabled")
    def http2_enabled(self) -> builtins.bool:
        return jsii.get(self, "http2Enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRestriction")
    def ip_restriction(self) -> typing.Any:
        return jsii.get(self, "ipRestriction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="javaContainer")
    def java_container(self) -> builtins.str:
        return jsii.get(self, "javaContainer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="javaContainerVersion")
    def java_container_version(self) -> builtins.str:
        return jsii.get(self, "javaContainerVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="javaVersion")
    def java_version(self) -> builtins.str:
        return jsii.get(self, "javaVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linuxFxVersion")
    def linux_fx_version(self) -> builtins.str:
        return jsii.get(self, "linuxFxVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localMysqlEnabled")
    def local_mysql_enabled(self) -> builtins.bool:
        return jsii.get(self, "localMysqlEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedPipelineMode")
    def managed_pipeline_mode(self) -> builtins.str:
        return jsii.get(self, "managedPipelineMode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersion")
    def min_tls_version(self) -> builtins.str:
        return jsii.get(self, "minTlsVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="phpVersion")
    def php_version(self) -> builtins.str:
        return jsii.get(self, "phpVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pythonVersion")
    def python_version(self) -> builtins.str:
        return jsii.get(self, "pythonVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteDebuggingEnabled")
    def remote_debugging_enabled(self) -> builtins.bool:
        return jsii.get(self, "remoteDebuggingEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteDebuggingVersion")
    def remote_debugging_version(self) -> builtins.str:
        return jsii.get(self, "remoteDebuggingVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmIpRestriction")
    def scm_ip_restriction(self) -> typing.Any:
        return jsii.get(self, "scmIpRestriction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmType")
    def scm_type(self) -> builtins.str:
        return jsii.get(self, "scmType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmUseMainIpRestriction")
    def scm_use_main_ip_restriction(self) -> builtins.bool:
        return jsii.get(self, "scmUseMainIpRestriction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="use32BitWorkerProcess")
    def use32_bit_worker_process(self) -> builtins.bool:
        return jsii.get(self, "use32BitWorkerProcess")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="websocketsEnabled")
    def websockets_enabled(self) -> builtins.bool:
        return jsii.get(self, "websocketsEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="windowsFxVersion")
    def windows_fx_version(self) -> builtins.str:
        return jsii.get(self, "windowsFxVersion")


class DataAzurermAppServiceSiteConfigCors(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceSiteConfigCors",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceSiteConfigCors, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedOrigins")
    def allowed_origins(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedOrigins")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="supportCredentials")
    def support_credentials(self) -> builtins.bool:
        return jsii.get(self, "supportCredentials")


class DataAzurermAppServiceSiteConfigIpRestriction(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceSiteConfigIpRestriction",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceSiteConfigIpRestriction, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetId")
    def virtual_network_subnet_id(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkSubnetId")


class DataAzurermAppServiceSiteConfigScmIpRestriction(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceSiteConfigScmIpRestriction",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceSiteConfigScmIpRestriction, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetId")
    def virtual_network_subnet_id(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkSubnetId")


class DataAzurermAppServiceSiteCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceSiteCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceSiteCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class DataAzurermAppServiceSourceControl(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAppServiceSourceControl",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermAppServiceSourceControl, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="branch")
    def branch(self) -> builtins.str:
        return jsii.get(self, "branch")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manualIntegration")
    def manual_integration(self) -> builtins.bool:
        return jsii.get(self, "manualIntegration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="repoUrl")
    def repo_url(self) -> builtins.str:
        return jsii.get(self, "repoUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollbackEnabled")
    def rollback_enabled(self) -> builtins.bool:
        return jsii.get(self, "rollbackEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useMercurial")
    def use_mercurial(self) -> builtins.bool:
        return jsii.get(self, "useMercurial")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAppServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAppServiceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAppServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApplicationInsights(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApplicationInsights",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApplicationInsightsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApplicationInsightsConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApplicationInsights, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appId")
    def app_id(self) -> builtins.str:
        return jsii.get(self, "appId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationType")
    def application_type(self) -> builtins.str:
        return jsii.get(self, "applicationType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instrumentationKey")
    def instrumentation_key(self) -> builtins.str:
        return jsii.get(self, "instrumentationKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDays")
    def retention_in_days(self) -> jsii.Number:
        return jsii.get(self, "retentionInDays")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermApplicationInsightsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApplicationInsightsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApplicationInsightsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApplicationInsightsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermApplicationInsightsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApplicationInsightsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApplicationInsightsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermApplicationInsightsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApplicationInsightsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApplicationInsightsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApplicationInsightsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApplicationInsightsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermApplicationSecurityGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermApplicationSecurityGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApplicationSecurityGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermApplicationSecurityGroupConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermApplicationSecurityGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermApplicationSecurityGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermApplicationSecurityGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermApplicationSecurityGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApplicationSecurityGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermApplicationSecurityGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermApplicationSecurityGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermApplicationSecurityGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermApplicationSecurityGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApplicationSecurityGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermApplicationSecurityGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermApplicationSecurityGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermApplicationSecurityGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAttestationProvider(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAttestationProvider",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAttestationProviderTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAttestationProviderConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAttestationProvider, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="attestationUri")
    def attestation_uri(self) -> builtins.str:
        return jsii.get(self, "attestationUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustModel")
    def trust_model(self) -> builtins.str:
        return jsii.get(self, "trustModel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAttestationProviderTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAttestationProviderTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAttestationProviderTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAttestationProviderConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAttestationProviderConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAttestationProviderTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAttestationProviderTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAttestationProviderTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAttestationProviderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAttestationProviderTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAttestationProviderTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAttestationProviderTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAutomationAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAutomationAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAutomationAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAutomationAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermAutomationAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAutomationAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAutomationAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAutomationAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAutomationAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAutomationAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAutomationAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAutomationVariableBool(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAutomationVariableBool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableBoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAutomationVariableBoolConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAutomationVariableBool, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.bool:
        return jsii.get(self, "value")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAutomationVariableBoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAutomationVariableBoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAutomationVariableBoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableBoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAutomationVariableBoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableBoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAutomationVariableBoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAutomationVariableBoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableBoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableBoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAutomationVariableBoolTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableBoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAutomationVariableDatetime(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAutomationVariableDatetime",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableDatetimeTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAutomationVariableDatetimeConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAutomationVariableDatetime, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAutomationVariableDatetimeTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAutomationVariableDatetimeTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAutomationVariableDatetimeTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableDatetimeConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAutomationVariableDatetimeConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableDatetimeTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAutomationVariableDatetimeTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermAutomationVariableDatetimeTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableDatetimeConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableDatetimeTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAutomationVariableDatetimeTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableDatetimeTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAutomationVariableInt(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAutomationVariableInt",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableIntTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAutomationVariableIntConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAutomationVariableInt, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> jsii.Number:
        return jsii.get(self, "value")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAutomationVariableIntTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAutomationVariableIntTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAutomationVariableIntTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableIntConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAutomationVariableIntConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableIntTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAutomationVariableIntTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAutomationVariableIntTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableIntConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableIntTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAutomationVariableIntTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableIntTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAutomationVariableString(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAutomationVariableString",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableStringTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAutomationVariableStringConfig(
            automation_account_name=automation_account_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAutomationVariableString, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountNameInput")
    def automation_account_name_input(self) -> builtins.str:
        return jsii.get(self, "automationAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encrypted")
    def encrypted(self) -> builtins.bool:
        return jsii.get(self, "encrypted")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermAutomationVariableStringTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountName")
    def automation_account_name(self) -> builtins.str:
        return jsii.get(self, "automationAccountName")

    @automation_account_name.setter # type: ignore
    def automation_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "automationAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAutomationVariableStringTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAutomationVariableStringTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableStringConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "automation_account_name": "automationAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAutomationVariableStringConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        automation_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAutomationVariableStringTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param automation_account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAutomationVariableStringTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_name": automation_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def automation_account_name(self) -> builtins.str:
        result = self._values.get("automation_account_name")
        assert result is not None, "Required property 'automation_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermAutomationVariableStringTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableStringConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAutomationVariableStringTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAutomationVariableStringTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAutomationVariableStringTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermAvailabilitySet(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermAvailabilitySet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAvailabilitySetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermAvailabilitySetConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermAvailabilitySet, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managed")
    def managed(self) -> builtins.bool:
        return jsii.get(self, "managed")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCount")
    def platform_fault_domain_count(self) -> builtins.str:
        return jsii.get(self, "platformFaultDomainCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformUpdateDomainCount")
    def platform_update_domain_count(self) -> builtins.str:
        return jsii.get(self, "platformUpdateDomainCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermAvailabilitySetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermAvailabilitySetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermAvailabilitySetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAvailabilitySetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermAvailabilitySetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermAvailabilitySetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermAvailabilitySetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermAvailabilitySetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAvailabilitySetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermAvailabilitySetTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermAvailabilitySetTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermAvailabilitySetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBackupPolicyVm(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBackupPolicyVm",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermBackupPolicyVmTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermBackupPolicyVmConfig(
            name=name,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermBackupPolicyVm, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermBackupPolicyVmTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermBackupPolicyVmTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermBackupPolicyVmTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBackupPolicyVmConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermBackupPolicyVmConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermBackupPolicyVmTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermBackupPolicyVmTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermBackupPolicyVmTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBackupPolicyVmConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBackupPolicyVmTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermBackupPolicyVmTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBackupPolicyVmTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBatchAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermBatchAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermBatchAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermBatchAccount, self, [scope, id, config])

    @jsii.member(jsii_name="keyVaultReference")
    def key_vault_reference(
        self,
        index: builtins.str,
    ) -> "DataAzurermBatchAccountKeyVaultReference":
        """
        :param index: -
        """
        return jsii.invoke(self, "keyVaultReference", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountEndpoint")
    def account_endpoint(self) -> builtins.str:
        return jsii.get(self, "accountEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolAllocationMode")
    def pool_allocation_mode(self) -> builtins.str:
        return jsii.get(self, "poolAllocationMode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermBatchAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermBatchAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermBatchAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermBatchAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermBatchAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermBatchAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermBatchAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBatchAccountKeyVaultReference(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchAccountKeyVaultReference",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermBatchAccountKeyVaultReference, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="url")
    def url(self) -> builtins.str:
        return jsii.get(self, "url")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermBatchAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBatchCertificate(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermBatchCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermBatchCertificateConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermBatchCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="format")
    def format(self) -> builtins.str:
        return jsii.get(self, "format")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicData")
    def public_data(self) -> builtins.str:
        return jsii.get(self, "publicData")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprintAlgorithm")
    def thumbprint_algorithm(self) -> builtins.str:
        return jsii.get(self, "thumbprintAlgorithm")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermBatchCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermBatchCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermBatchCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermBatchCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermBatchCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermBatchCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermBatchCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermBatchCertificateTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBatchPool(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        certificate: typing.Optional[typing.List["DataAzurermBatchPoolCertificate"]] = None,
        network_configuration: typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfiguration"]] = None,
        start_task: typing.Optional[typing.List["DataAzurermBatchPoolStartTask"]] = None,
        timeouts: typing.Optional["DataAzurermBatchPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param certificate: certificate block.
        :param network_configuration: network_configuration block.
        :param start_task: start_task block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermBatchPoolConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            certificate=certificate,
            network_configuration=network_configuration,
            start_task=start_task,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermBatchPool, self, [scope, id, config])

    @jsii.member(jsii_name="autoScale")
    def auto_scale(self, index: builtins.str) -> "DataAzurermBatchPoolAutoScale":
        """
        :param index: -
        """
        return jsii.invoke(self, "autoScale", [index])

    @jsii.member(jsii_name="containerConfiguration")
    def container_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermBatchPoolContainerConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "containerConfiguration", [index])

    @jsii.member(jsii_name="fixedScale")
    def fixed_scale(self, index: builtins.str) -> "DataAzurermBatchPoolFixedScale":
        """
        :param index: -
        """
        return jsii.invoke(self, "fixedScale", [index])

    @jsii.member(jsii_name="metadata")
    def metadata(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "metadata", [key])

    @jsii.member(jsii_name="resetCertificate")
    def reset_certificate(self) -> None:
        return jsii.invoke(self, "resetCertificate", [])

    @jsii.member(jsii_name="resetNetworkConfiguration")
    def reset_network_configuration(self) -> None:
        return jsii.invoke(self, "resetNetworkConfiguration", [])

    @jsii.member(jsii_name="resetStartTask")
    def reset_start_task(self) -> None:
        return jsii.invoke(self, "resetStartTask", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="storageImageReference")
    def storage_image_reference(
        self,
        index: builtins.str,
    ) -> "DataAzurermBatchPoolStorageImageReference":
        """
        :param index: -
        """
        return jsii.invoke(self, "storageImageReference", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxTasksPerNode")
    def max_tasks_per_node(self) -> jsii.Number:
        return jsii.get(self, "maxTasksPerNode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeAgentSkuId")
    def node_agent_sku_id(self) -> builtins.str:
        return jsii.get(self, "nodeAgentSkuId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSize")
    def vm_size(self) -> builtins.str:
        return jsii.get(self, "vmSize")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateInput")
    def certificate_input(
        self,
    ) -> typing.Optional[typing.List["DataAzurermBatchPoolCertificate"]]:
        return jsii.get(self, "certificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkConfigurationInput")
    def network_configuration_input(
        self,
    ) -> typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfiguration"]]:
        return jsii.get(self, "networkConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTaskInput")
    def start_task_input(
        self,
    ) -> typing.Optional[typing.List["DataAzurermBatchPoolStartTask"]]:
        return jsii.get(self, "startTaskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermBatchPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> typing.List["DataAzurermBatchPoolCertificate"]:
        return jsii.get(self, "certificate")

    @certificate.setter # type: ignore
    def certificate(
        self,
        value: typing.List["DataAzurermBatchPoolCertificate"],
    ) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkConfiguration")
    def network_configuration(
        self,
    ) -> typing.List["DataAzurermBatchPoolNetworkConfiguration"]:
        return jsii.get(self, "networkConfiguration")

    @network_configuration.setter # type: ignore
    def network_configuration(
        self,
        value: typing.List["DataAzurermBatchPoolNetworkConfiguration"],
    ) -> None:
        jsii.set(self, "networkConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTask")
    def start_task(self) -> typing.List["DataAzurermBatchPoolStartTask"]:
        return jsii.get(self, "startTask")

    @start_task.setter # type: ignore
    def start_task(self, value: typing.List["DataAzurermBatchPoolStartTask"]) -> None:
        jsii.set(self, "startTask", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermBatchPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermBatchPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermBatchPoolAutoScale(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchPoolAutoScale",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermBatchPoolAutoScale, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evaluationInterval")
    def evaluation_interval(self) -> builtins.str:
        return jsii.get(self, "evaluationInterval")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="formula")
    def formula(self) -> builtins.str:
        return jsii.get(self, "formula")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchPoolCertificate",
    jsii_struct_bases=[],
    name_mapping={
        "id": "id",
        "store_location": "storeLocation",
        "store_name": "storeName",
        "visibility": "visibility",
    },
)
class DataAzurermBatchPoolCertificate:
    def __init__(
        self,
        *,
        id: builtins.str,
        store_location: builtins.str,
        store_name: typing.Optional[builtins.str] = None,
        visibility: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param id: -
        :param store_location: -
        :param store_name: -
        :param visibility: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
            "store_location": store_location,
        }
        if store_name is not None:
            self._values["store_name"] = store_name
        if visibility is not None:
            self._values["visibility"] = visibility

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    @builtins.property
    def store_location(self) -> builtins.str:
        result = self._values.get("store_location")
        assert result is not None, "Required property 'store_location' is missing"
        return result

    @builtins.property
    def store_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("store_name")
        return result

    @builtins.property
    def visibility(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("visibility")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchPoolCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "certificate": "certificate",
        "network_configuration": "networkConfiguration",
        "start_task": "startTask",
        "timeouts": "timeouts",
    },
)
class DataAzurermBatchPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        certificate: typing.Optional[typing.List[DataAzurermBatchPoolCertificate]] = None,
        network_configuration: typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfiguration"]] = None,
        start_task: typing.Optional[typing.List["DataAzurermBatchPoolStartTask"]] = None,
        timeouts: typing.Optional["DataAzurermBatchPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param certificate: certificate block.
        :param network_configuration: network_configuration block.
        :param start_task: start_task block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermBatchPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if certificate is not None:
            self._values["certificate"] = certificate
        if network_configuration is not None:
            self._values["network_configuration"] = network_configuration
        if start_task is not None:
            self._values["start_task"] = start_task
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def certificate(
        self,
    ) -> typing.Optional[typing.List[DataAzurermBatchPoolCertificate]]:
        """certificate block."""
        result = self._values.get("certificate")
        return result

    @builtins.property
    def network_configuration(
        self,
    ) -> typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfiguration"]]:
        """network_configuration block."""
        result = self._values.get("network_configuration")
        return result

    @builtins.property
    def start_task(
        self,
    ) -> typing.Optional[typing.List["DataAzurermBatchPoolStartTask"]]:
        """start_task block."""
        result = self._values.get("start_task")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermBatchPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBatchPoolContainerConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchPoolContainerConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermBatchPoolContainerConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerImageNames")
    def container_image_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "containerImageNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerRegistries")
    def container_registries(self) -> typing.Any:
        return jsii.get(self, "containerRegistries")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


class DataAzurermBatchPoolContainerConfigurationContainerRegistries(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchPoolContainerConfigurationContainerRegistries",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermBatchPoolContainerConfigurationContainerRegistries, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registryServer")
    def registry_server(self) -> builtins.str:
        return jsii.get(self, "registryServer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userName")
    def user_name(self) -> builtins.str:
        return jsii.get(self, "userName")


class DataAzurermBatchPoolFixedScale(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchPoolFixedScale",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermBatchPoolFixedScale, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resizeTimeout")
    def resize_timeout(self) -> builtins.str:
        return jsii.get(self, "resizeTimeout")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetDedicatedNodes")
    def target_dedicated_nodes(self) -> jsii.Number:
        return jsii.get(self, "targetDedicatedNodes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetLowPriorityNodes")
    def target_low_priority_nodes(self) -> jsii.Number:
        return jsii.get(self, "targetLowPriorityNodes")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchPoolNetworkConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "endpoint_configuration": "endpointConfiguration",
        "subnet_id": "subnetId",
    },
)
class DataAzurermBatchPoolNetworkConfiguration:
    def __init__(
        self,
        *,
        endpoint_configuration: typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfigurationEndpointConfiguration"]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param endpoint_configuration: endpoint_configuration block.
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if endpoint_configuration is not None:
            self._values["endpoint_configuration"] = endpoint_configuration
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id

    @builtins.property
    def endpoint_configuration(
        self,
    ) -> typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfigurationEndpointConfiguration"]]:
        """endpoint_configuration block."""
        result = self._values.get("endpoint_configuration")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchPoolNetworkConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchPoolNetworkConfigurationEndpointConfiguration",
    jsii_struct_bases=[],
    name_mapping={"network_security_group_rules": "networkSecurityGroupRules"},
)
class DataAzurermBatchPoolNetworkConfigurationEndpointConfiguration:
    def __init__(
        self,
        *,
        network_security_group_rules: typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules"]] = None,
    ) -> None:
        """
        :param network_security_group_rules: network_security_group_rules block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if network_security_group_rules is not None:
            self._values["network_security_group_rules"] = network_security_group_rules

    @builtins.property
    def network_security_group_rules(
        self,
    ) -> typing.Optional[typing.List["DataAzurermBatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules"]]:
        """network_security_group_rules block."""
        result = self._values.get("network_security_group_rules")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchPoolNetworkConfigurationEndpointConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules",
    jsii_struct_bases=[],
    name_mapping={},
)
class DataAzurermBatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules:
    def __init__(self) -> None:
        self._values: typing.Dict[str, typing.Any] = {}

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchPoolStartTask",
    jsii_struct_bases=[],
    name_mapping={
        "command_line": "commandLine",
        "environment": "environment",
        "max_task_retry_count": "maxTaskRetryCount",
        "wait_for_success": "waitForSuccess",
    },
)
class DataAzurermBatchPoolStartTask:
    def __init__(
        self,
        *,
        command_line: builtins.str,
        environment: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        max_task_retry_count: typing.Optional[jsii.Number] = None,
        wait_for_success: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param command_line: -
        :param environment: -
        :param max_task_retry_count: -
        :param wait_for_success: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "command_line": command_line,
        }
        if environment is not None:
            self._values["environment"] = environment
        if max_task_retry_count is not None:
            self._values["max_task_retry_count"] = max_task_retry_count
        if wait_for_success is not None:
            self._values["wait_for_success"] = wait_for_success

    @builtins.property
    def command_line(self) -> builtins.str:
        result = self._values.get("command_line")
        assert result is not None, "Required property 'command_line' is missing"
        return result

    @builtins.property
    def environment(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("environment")
        return result

    @builtins.property
    def max_task_retry_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_task_retry_count")
        return result

    @builtins.property
    def wait_for_success(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("wait_for_success")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchPoolStartTask(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBatchPoolStorageImageReference(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBatchPoolStorageImageReference",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermBatchPoolStorageImageReference, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offer")
    def offer(self) -> builtins.str:
        return jsii.get(self, "offer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisher")
    def publisher(self) -> builtins.str:
        return jsii.get(self, "publisher")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBatchPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermBatchPoolTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBatchPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBlueprintDefinition(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBlueprintDefinition",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        scope_id: builtins.str,
        timeouts: typing.Optional["DataAzurermBlueprintDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param scope_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermBlueprintDefinitionConfig(
            name=name,
            scope_id=scope_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermBlueprintDefinition, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lastModified")
    def last_modified(self) -> builtins.str:
        return jsii.get(self, "lastModified")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeIdInput")
    def scope_id_input(self) -> builtins.str:
        return jsii.get(self, "scopeIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetScope")
    def target_scope(self) -> builtins.str:
        return jsii.get(self, "targetScope")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeCreated")
    def time_created(self) -> builtins.str:
        return jsii.get(self, "timeCreated")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versions")
    def versions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "versions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermBlueprintDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeId")
    def scope_id(self) -> builtins.str:
        return jsii.get(self, "scopeId")

    @scope_id.setter # type: ignore
    def scope_id(self, value: builtins.str) -> None:
        jsii.set(self, "scopeId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermBlueprintDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermBlueprintDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBlueprintDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "scope_id": "scopeId",
        "timeouts": "timeouts",
    },
)
class DataAzurermBlueprintDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        scope_id: builtins.str,
        timeouts: typing.Optional["DataAzurermBlueprintDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param scope_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermBlueprintDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "scope_id": scope_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def scope_id(self) -> builtins.str:
        result = self._values.get("scope_id")
        assert result is not None, "Required property 'scope_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermBlueprintDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBlueprintDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBlueprintDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermBlueprintDefinitionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBlueprintDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermBlueprintPublishedVersion(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermBlueprintPublishedVersion",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        blueprint_name: builtins.str,
        scope_id: builtins.str,
        version: builtins.str,
        timeouts: typing.Optional["DataAzurermBlueprintPublishedVersionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param blueprint_name: -
        :param scope_id: -
        :param version: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermBlueprintPublishedVersionConfig(
            blueprint_name=blueprint_name,
            scope_id=scope_id,
            version=version,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermBlueprintPublishedVersion, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blueprintNameInput")
    def blueprint_name_input(self) -> builtins.str:
        return jsii.get(self, "blueprintNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lastModified")
    def last_modified(self) -> builtins.str:
        return jsii.get(self, "lastModified")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeIdInput")
    def scope_id_input(self) -> builtins.str:
        return jsii.get(self, "scopeIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetScope")
    def target_scope(self) -> builtins.str:
        return jsii.get(self, "targetScope")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeCreated")
    def time_created(self) -> builtins.str:
        return jsii.get(self, "timeCreated")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> builtins.str:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermBlueprintPublishedVersionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blueprintName")
    def blueprint_name(self) -> builtins.str:
        return jsii.get(self, "blueprintName")

    @blueprint_name.setter # type: ignore
    def blueprint_name(self, value: builtins.str) -> None:
        jsii.set(self, "blueprintName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeId")
    def scope_id(self) -> builtins.str:
        return jsii.get(self, "scopeId")

    @scope_id.setter # type: ignore
    def scope_id(self, value: builtins.str) -> None:
        jsii.set(self, "scopeId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermBlueprintPublishedVersionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermBlueprintPublishedVersionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBlueprintPublishedVersionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "blueprint_name": "blueprintName",
        "scope_id": "scopeId",
        "version": "version",
        "timeouts": "timeouts",
    },
)
class DataAzurermBlueprintPublishedVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        blueprint_name: builtins.str,
        scope_id: builtins.str,
        version: builtins.str,
        timeouts: typing.Optional["DataAzurermBlueprintPublishedVersionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param blueprint_name: -
        :param scope_id: -
        :param version: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermBlueprintPublishedVersionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "blueprint_name": blueprint_name,
            "scope_id": scope_id,
            "version": version,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def blueprint_name(self) -> builtins.str:
        result = self._values.get("blueprint_name")
        assert result is not None, "Required property 'blueprint_name' is missing"
        return result

    @builtins.property
    def scope_id(self) -> builtins.str:
        result = self._values.get("scope_id")
        assert result is not None, "Required property 'scope_id' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermBlueprintPublishedVersionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBlueprintPublishedVersionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermBlueprintPublishedVersionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermBlueprintPublishedVersionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermBlueprintPublishedVersionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermCdnProfile(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermCdnProfile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermCdnProfileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermCdnProfileConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermCdnProfile, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermCdnProfileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermCdnProfileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermCdnProfileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermCdnProfileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermCdnProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermCdnProfileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermCdnProfileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermCdnProfileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermCdnProfileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermCdnProfileTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermCdnProfileTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermCdnProfileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermClientConfig(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermClientConfig",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        timeouts: typing.Optional["DataAzurermClientConfigTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermClientConfigConfig(
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermClientConfig, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermClientConfigTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermClientConfigTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermClientConfigTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermClientConfigConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "timeouts": "timeouts",
    },
)
class DataAzurermClientConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        timeouts: typing.Optional["DataAzurermClientConfigTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermClientConfigTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermClientConfigTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermClientConfigConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermClientConfigTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermClientConfigTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermClientConfigTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermCognitiveAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermCognitiveAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermCognitiveAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermCognitiveAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermCognitiveAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="qnaRuntimeEndpoint")
    def qna_runtime_endpoint(self) -> builtins.str:
        return jsii.get(self, "qnaRuntimeEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermCognitiveAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermCognitiveAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermCognitiveAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermCognitiveAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermCognitiveAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermCognitiveAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermCognitiveAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermCognitiveAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermCognitiveAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermCognitiveAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermCognitiveAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermCognitiveAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermContainerRegistry(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermContainerRegistry",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermContainerRegistryTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermContainerRegistryConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermContainerRegistry, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminEnabled")
    def admin_enabled(self) -> builtins.bool:
        return jsii.get(self, "adminEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPassword")
    def admin_password(self) -> builtins.str:
        return jsii.get(self, "adminPassword")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loginServer")
    def login_server(self) -> builtins.str:
        return jsii.get(self, "loginServer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermContainerRegistryTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermContainerRegistryTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermContainerRegistryTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermContainerRegistryConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermContainerRegistryConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermContainerRegistryTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermContainerRegistryTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermContainerRegistryTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermContainerRegistryConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermContainerRegistryTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermContainerRegistryTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermContainerRegistryTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermCosmosdbAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermCosmosdbAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermCosmosdbAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermCosmosdbAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermCosmosdbAccount, self, [scope, id, config])

    @jsii.member(jsii_name="capabilities")
    def capabilities(
        self,
        index: builtins.str,
    ) -> "DataAzurermCosmosdbAccountCapabilities":
        """
        :param index: -
        """
        return jsii.invoke(self, "capabilities", [index])

    @jsii.member(jsii_name="consistencyPolicy")
    def consistency_policy(
        self,
        index: builtins.str,
    ) -> "DataAzurermCosmosdbAccountConsistencyPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "consistencyPolicy", [index])

    @jsii.member(jsii_name="geoLocation")
    def geo_location(
        self,
        index: builtins.str,
    ) -> "DataAzurermCosmosdbAccountGeoLocation":
        """
        :param index: -
        """
        return jsii.invoke(self, "geoLocation", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="virtualNetworkRule")
    def virtual_network_rule(
        self,
        index: builtins.str,
    ) -> "DataAzurermCosmosdbAccountVirtualNetworkRule":
        """
        :param index: -
        """
        return jsii.invoke(self, "virtualNetworkRule", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutomaticFailover")
    def enable_automatic_failover(self) -> builtins.bool:
        return jsii.get(self, "enableAutomaticFailover")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFreeTier")
    def enable_free_tier(self) -> builtins.bool:
        return jsii.get(self, "enableFreeTier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableMultipleWriteLocations")
    def enable_multiple_write_locations(self) -> builtins.bool:
        return jsii.get(self, "enableMultipleWriteLocations")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRangeFilter")
    def ip_range_filter(self) -> builtins.str:
        return jsii.get(self, "ipRangeFilter")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isVirtualNetworkFilterEnabled")
    def is_virtual_network_filter_enabled(self) -> builtins.bool:
        return jsii.get(self, "isVirtualNetworkFilterEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offerType")
    def offer_type(self) -> builtins.str:
        return jsii.get(self, "offerType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryMasterKey")
    def primary_master_key(self) -> builtins.str:
        return jsii.get(self, "primaryMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryReadonlyKey")
    def primary_readonly_key(self) -> builtins.str:
        return jsii.get(self, "primaryReadonlyKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryReadonlyMasterKey")
    def primary_readonly_master_key(self) -> builtins.str:
        return jsii.get(self, "primaryReadonlyMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readEndpoints")
    def read_endpoints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "readEndpoints")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryMasterKey")
    def secondary_master_key(self) -> builtins.str:
        return jsii.get(self, "secondaryMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryReadonlyKey")
    def secondary_readonly_key(self) -> builtins.str:
        return jsii.get(self, "secondaryReadonlyKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryReadonlyMasterKey")
    def secondary_readonly_master_key(self) -> builtins.str:
        return jsii.get(self, "secondaryReadonlyMasterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="writeEndpoints")
    def write_endpoints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "writeEndpoints")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermCosmosdbAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermCosmosdbAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermCosmosdbAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermCosmosdbAccountCapabilities(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermCosmosdbAccountCapabilities",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermCosmosdbAccountCapabilities, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermCosmosdbAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermCosmosdbAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermCosmosdbAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermCosmosdbAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermCosmosdbAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermCosmosdbAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermCosmosdbAccountConsistencyPolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermCosmosdbAccountConsistencyPolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermCosmosdbAccountConsistencyPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="consistencyLevel")
    def consistency_level(self) -> builtins.str:
        return jsii.get(self, "consistencyLevel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxIntervalInSeconds")
    def max_interval_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "maxIntervalInSeconds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxStalenessPrefix")
    def max_staleness_prefix(self) -> jsii.Number:
        return jsii.get(self, "maxStalenessPrefix")


class DataAzurermCosmosdbAccountGeoLocation(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermCosmosdbAccountGeoLocation",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermCosmosdbAccountGeoLocation, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="failoverPriority")
    def failover_priority(self) -> jsii.Number:
        return jsii.get(self, "failoverPriority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermCosmosdbAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermCosmosdbAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermCosmosdbAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermCosmosdbAccountVirtualNetworkRule(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermCosmosdbAccountVirtualNetworkRule",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermCosmosdbAccountVirtualNetworkRule, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")


class DataAzurermDataFactory(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataFactory",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataFactoryTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataFactoryConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataFactory, self, [scope, id, config])

    @jsii.member(jsii_name="githubConfiguration")
    def github_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermDataFactoryGithubConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "githubConfiguration", [index])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermDataFactoryIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="vstsConfiguration")
    def vsts_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermDataFactoryVstsConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "vstsConfiguration", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDataFactoryTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataFactoryTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDataFactoryTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataFactoryConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataFactoryConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataFactoryTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataFactoryTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDataFactoryTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataFactoryConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataFactoryGithubConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataFactoryGithubConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDataFactoryGithubConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="branchName")
    def branch_name(self) -> builtins.str:
        return jsii.get(self, "branchName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gitUrl")
    def git_url(self) -> builtins.str:
        return jsii.get(self, "gitUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="repositoryName")
    def repository_name(self) -> builtins.str:
        return jsii.get(self, "repositoryName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rootFolder")
    def root_folder(self) -> builtins.str:
        return jsii.get(self, "rootFolder")


class DataAzurermDataFactoryIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataFactoryIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDataFactoryIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataFactoryTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataFactoryTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataFactoryTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataFactoryVstsConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataFactoryVstsConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDataFactoryVstsConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="branchName")
    def branch_name(self) -> builtins.str:
        return jsii.get(self, "branchName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="projectName")
    def project_name(self) -> builtins.str:
        return jsii.get(self, "projectName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="repositoryName")
    def repository_name(self) -> builtins.str:
        return jsii.get(self, "repositoryName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rootFolder")
    def root_folder(self) -> builtins.str:
        return jsii.get(self, "rootFolder")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")


class DataAzurermDataLakeStore(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataLakeStore",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataLakeStoreTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataLakeStoreConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataLakeStore, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionState")
    def encryption_state(self) -> builtins.str:
        return jsii.get(self, "encryptionState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionType")
    def encryption_type(self) -> builtins.str:
        return jsii.get(self, "encryptionType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallAllowAzureIps")
    def firewall_allow_azure_ips(self) -> builtins.str:
        return jsii.get(self, "firewallAllowAzureIps")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallState")
    def firewall_state(self) -> builtins.str:
        return jsii.get(self, "firewallState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDataLakeStoreTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataLakeStoreTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDataLakeStoreTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataLakeStoreConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataLakeStoreConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataLakeStoreTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataLakeStoreTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDataLakeStoreTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataLakeStoreConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataLakeStoreTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataLakeStoreTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataLakeStoreTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShare(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShare",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataShareConfig(
            account_id=account_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataShare, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="snapshotSchedule")
    def snapshot_schedule(
        self,
        index: builtins.str,
    ) -> "DataAzurermDataShareSnapshotSchedule":
        """
        :param index: -
        """
        return jsii.invoke(self, "snapshotSchedule", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountIdInput")
    def account_id_input(self) -> builtins.str:
        return jsii.get(self, "accountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terms")
    def terms(self) -> builtins.str:
        return jsii.get(self, "terms")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDataShareTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountId")
    def account_id(self) -> builtins.str:
        return jsii.get(self, "accountId")

    @account_id.setter # type: ignore
    def account_id(self, value: builtins.str) -> None:
        jsii.set(self, "accountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataShareTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDataShareTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermDataShareAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataShareAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataShareAccount, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermDataShareAccountIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDataShareAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataShareAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDataShareAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataShareAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataShareAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDataShareAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareAccountIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareAccountIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDataShareAccountIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataShareAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_id": "accountId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataShareConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataShareTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_id": account_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_id(self) -> builtins.str:
        result = self._values.get("account_id")
        assert result is not None, "Required property 'account_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDataShareTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareDatasetBlobStorage(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareDatasetBlobStorage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_share_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetBlobStorageTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_share_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataShareDatasetBlobStorageConfig(
            data_share_id=data_share_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataShareDatasetBlobStorage, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="storageAccount")
    def storage_account(
        self,
        index: builtins.str,
    ) -> "DataAzurermDataShareDatasetBlobStorageStorageAccount":
        """
        :param index: -
        """
        return jsii.invoke(self, "storageAccount", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerName")
    def container_name(self) -> builtins.str:
        return jsii.get(self, "containerName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareIdInput")
    def data_share_id_input(self) -> builtins.str:
        return jsii.get(self, "dataShareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filePath")
    def file_path(self) -> builtins.str:
        return jsii.get(self, "filePath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPath")
    def folder_path(self) -> builtins.str:
        return jsii.get(self, "folderPath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetBlobStorageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareId")
    def data_share_id(self) -> builtins.str:
        return jsii.get(self, "dataShareId")

    @data_share_id.setter # type: ignore
    def data_share_id(self, value: builtins.str) -> None:
        jsii.set(self, "dataShareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataShareDatasetBlobStorageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDataShareDatasetBlobStorageTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetBlobStorageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_share_id": "dataShareId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataShareDatasetBlobStorageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_share_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetBlobStorageTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_share_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataShareDatasetBlobStorageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_share_id": data_share_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_share_id(self) -> builtins.str:
        result = self._values.get("data_share_id")
        assert result is not None, "Required property 'data_share_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetBlobStorageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetBlobStorageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareDatasetBlobStorageStorageAccount(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareDatasetBlobStorageStorageAccount",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDataShareDatasetBlobStorageStorageAccount, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetBlobStorageTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataShareDatasetBlobStorageTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetBlobStorageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareDatasetDataLakeGen1(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareDatasetDataLakeGen1",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_share_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetDataLakeGen1Timeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_share_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataShareDatasetDataLakeGen1Config(
            data_share_id=data_share_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataShareDatasetDataLakeGen1, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataLakeStoreId")
    def data_lake_store_id(self) -> builtins.str:
        return jsii.get(self, "dataLakeStoreId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareIdInput")
    def data_share_id_input(self) -> builtins.str:
        return jsii.get(self, "dataShareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileName")
    def file_name(self) -> builtins.str:
        return jsii.get(self, "fileName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPath")
    def folder_path(self) -> builtins.str:
        return jsii.get(self, "folderPath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetDataLakeGen1Timeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareId")
    def data_share_id(self) -> builtins.str:
        return jsii.get(self, "dataShareId")

    @data_share_id.setter # type: ignore
    def data_share_id(self, value: builtins.str) -> None:
        jsii.set(self, "dataShareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataShareDatasetDataLakeGen1Timeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermDataShareDatasetDataLakeGen1Timeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetDataLakeGen1Config",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_share_id": "dataShareId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataShareDatasetDataLakeGen1Config(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_share_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetDataLakeGen1Timeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_share_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataShareDatasetDataLakeGen1Timeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_share_id": data_share_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_share_id(self) -> builtins.str:
        result = self._values.get("data_share_id")
        assert result is not None, "Required property 'data_share_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetDataLakeGen1Timeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetDataLakeGen1Config(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetDataLakeGen1Timeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataShareDatasetDataLakeGen1Timeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetDataLakeGen1Timeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareDatasetDataLakeGen2(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareDatasetDataLakeGen2",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetDataLakeGen2Timeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataShareDatasetDataLakeGen2Config(
            name=name,
            share_id=share_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataShareDatasetDataLakeGen2, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filePath")
    def file_path(self) -> builtins.str:
        return jsii.get(self, "filePath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileSystemName")
    def file_system_name(self) -> builtins.str:
        return jsii.get(self, "fileSystemName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPath")
    def folder_path(self) -> builtins.str:
        return jsii.get(self, "folderPath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareIdInput")
    def share_id_input(self) -> builtins.str:
        return jsii.get(self, "shareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetDataLakeGen2Timeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareId")
    def share_id(self) -> builtins.str:
        return jsii.get(self, "shareId")

    @share_id.setter # type: ignore
    def share_id(self, value: builtins.str) -> None:
        jsii.set(self, "shareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataShareDatasetDataLakeGen2Timeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermDataShareDatasetDataLakeGen2Timeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetDataLakeGen2Config",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "share_id": "shareId",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataShareDatasetDataLakeGen2Config(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetDataLakeGen2Timeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataShareDatasetDataLakeGen2Timeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "share_id": share_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_id(self) -> builtins.str:
        result = self._values.get("share_id")
        assert result is not None, "Required property 'share_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetDataLakeGen2Timeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetDataLakeGen2Config(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetDataLakeGen2Timeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataShareDatasetDataLakeGen2Timeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetDataLakeGen2Timeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareDatasetKustoCluster(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareDatasetKustoCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetKustoClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataShareDatasetKustoClusterConfig(
            name=name,
            share_id=share_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataShareDatasetKustoCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoClusterId")
    def kusto_cluster_id(self) -> builtins.str:
        return jsii.get(self, "kustoClusterId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoClusterLocation")
    def kusto_cluster_location(self) -> builtins.str:
        return jsii.get(self, "kustoClusterLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareIdInput")
    def share_id_input(self) -> builtins.str:
        return jsii.get(self, "shareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetKustoClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareId")
    def share_id(self) -> builtins.str:
        return jsii.get(self, "shareId")

    @share_id.setter # type: ignore
    def share_id(self, value: builtins.str) -> None:
        jsii.set(self, "shareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataShareDatasetKustoClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermDataShareDatasetKustoClusterTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetKustoClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "share_id": "shareId",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataShareDatasetKustoClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetKustoClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataShareDatasetKustoClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "share_id": share_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_id(self) -> builtins.str:
        result = self._values.get("share_id")
        assert result is not None, "Required property 'share_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetKustoClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetKustoClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetKustoClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataShareDatasetKustoClusterTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetKustoClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareDatasetKustoDatabase(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareDatasetKustoDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetKustoDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDataShareDatasetKustoDatabaseConfig(
            name=name,
            share_id=share_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDataShareDatasetKustoDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoClusterLocation")
    def kusto_cluster_location(self) -> builtins.str:
        return jsii.get(self, "kustoClusterLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoDatabaseId")
    def kusto_database_id(self) -> builtins.str:
        return jsii.get(self, "kustoDatabaseId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareIdInput")
    def share_id_input(self) -> builtins.str:
        return jsii.get(self, "shareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetKustoDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareId")
    def share_id(self) -> builtins.str:
        return jsii.get(self, "shareId")

    @share_id.setter # type: ignore
    def share_id(self, value: builtins.str) -> None:
        jsii.set(self, "shareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDataShareDatasetKustoDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermDataShareDatasetKustoDatabaseTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetKustoDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "share_id": "shareId",
        "timeouts": "timeouts",
    },
)
class DataAzurermDataShareDatasetKustoDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataAzurermDataShareDatasetKustoDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDataShareDatasetKustoDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "share_id": share_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_id(self) -> builtins.str:
        result = self._values.get("share_id")
        assert result is not None, "Required property 'share_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermDataShareDatasetKustoDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetKustoDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareDatasetKustoDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataShareDatasetKustoDatabaseTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareDatasetKustoDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDataShareSnapshotSchedule(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDataShareSnapshotSchedule",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDataShareSnapshotSchedule, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurrence")
    def recurrence(self) -> builtins.str:
        return jsii.get(self, "recurrence")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTime")
    def start_time(self) -> builtins.str:
        return jsii.get(self, "startTime")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDataShareTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDataShareTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDataShareTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDatabaseMigrationProject(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDatabaseMigrationProject",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDatabaseMigrationProjectTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDatabaseMigrationProjectConfig(
            name=name,
            resource_group_name=resource_group_name,
            service_name=service_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDatabaseMigrationProject, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceNameInput")
    def service_name_input(self) -> builtins.str:
        return jsii.get(self, "serviceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePlatform")
    def source_platform(self) -> builtins.str:
        return jsii.get(self, "sourcePlatform")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetPlatform")
    def target_platform(self) -> builtins.str:
        return jsii.get(self, "targetPlatform")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDatabaseMigrationProjectTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> builtins.str:
        return jsii.get(self, "serviceName")

    @service_name.setter # type: ignore
    def service_name(self, value: builtins.str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDatabaseMigrationProjectTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDatabaseMigrationProjectTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDatabaseMigrationProjectConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "service_name": "serviceName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDatabaseMigrationProjectConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDatabaseMigrationProjectTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDatabaseMigrationProjectTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "service_name": service_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_name(self) -> builtins.str:
        result = self._values.get("service_name")
        assert result is not None, "Required property 'service_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermDatabaseMigrationProjectTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDatabaseMigrationProjectConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDatabaseMigrationProjectTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDatabaseMigrationProjectTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDatabaseMigrationProjectTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDatabaseMigrationService(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDatabaseMigrationService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDatabaseMigrationServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDatabaseMigrationServiceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDatabaseMigrationService, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDatabaseMigrationServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDatabaseMigrationServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDatabaseMigrationServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDatabaseMigrationServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDatabaseMigrationServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDatabaseMigrationServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDatabaseMigrationServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermDatabaseMigrationServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDatabaseMigrationServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDatabaseMigrationServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDatabaseMigrationServiceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDatabaseMigrationServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDatabricksWorkspace(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDatabricksWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDatabricksWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDatabricksWorkspaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDatabricksWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceUrl")
    def workspace_url(self) -> builtins.str:
        return jsii.get(self, "workspaceUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDatabricksWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDatabricksWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDatabricksWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDatabricksWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDatabricksWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDatabricksWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDatabricksWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDatabricksWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDatabricksWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDatabricksWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDatabricksWorkspaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDatabricksWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDedicatedHost(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDedicatedHost",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        dedicated_host_group_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDedicatedHostTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param dedicated_host_group_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDedicatedHostConfig(
            dedicated_host_group_name=dedicated_host_group_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDedicatedHost, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostGroupNameInput")
    def dedicated_host_group_name_input(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDedicatedHostTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostGroupName")
    def dedicated_host_group_name(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostGroupName")

    @dedicated_host_group_name.setter # type: ignore
    def dedicated_host_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "dedicatedHostGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDedicatedHostTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDedicatedHostTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDedicatedHostConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "dedicated_host_group_name": "dedicatedHostGroupName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDedicatedHostConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        dedicated_host_group_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDedicatedHostTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dedicated_host_group_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDedicatedHostTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "dedicated_host_group_name": dedicated_host_group_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def dedicated_host_group_name(self) -> builtins.str:
        result = self._values.get("dedicated_host_group_name")
        assert result is not None, "Required property 'dedicated_host_group_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDedicatedHostTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDedicatedHostConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDedicatedHostGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDedicatedHostGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDedicatedHostGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDedicatedHostGroupConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDedicatedHostGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCount")
    def platform_fault_domain_count(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDedicatedHostGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDedicatedHostGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDedicatedHostGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDedicatedHostGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDedicatedHostGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDedicatedHostGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDedicatedHostGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDedicatedHostGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDedicatedHostGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDedicatedHostGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDedicatedHostGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDedicatedHostGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDedicatedHostTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDedicatedHostTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDedicatedHostTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDevTestLab(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDevTestLab",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDevTestLabTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDevTestLabConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDevTestLab, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="artifactsStorageAccountId")
    def artifacts_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "artifactsStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPremiumStorageAccountId")
    def default_premium_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "defaultPremiumStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultStorageAccountId")
    def default_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "defaultStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="premiumDataDiskStorageAccountId")
    def premium_data_disk_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "premiumDataDiskStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageType")
    def storage_type(self) -> builtins.str:
        return jsii.get(self, "storageType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueIdentifier")
    def unique_identifier(self) -> builtins.str:
        return jsii.get(self, "uniqueIdentifier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDevTestLabTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDevTestLabTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDevTestLabTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDevTestLabConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDevTestLabConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDevTestLabTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDevTestLabTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDevTestLabTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDevTestLabConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDevTestLabTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDevTestLabTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDevTestLabTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDevTestVirtualNetwork(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDevTestVirtualNetwork",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        lab_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDevTestVirtualNetworkTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param lab_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDevTestVirtualNetworkConfig(
            lab_name=lab_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDevTestVirtualNetwork, self, [scope, id, config])

    @jsii.member(jsii_name="allowedSubnets")
    def allowed_subnets(
        self,
        index: builtins.str,
    ) -> "DataAzurermDevTestVirtualNetworkAllowedSubnets":
        """
        :param index: -
        """
        return jsii.invoke(self, "allowedSubnets", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="subnetOverrides")
    def subnet_overrides(
        self,
        index: builtins.str,
    ) -> "DataAzurermDevTestVirtualNetworkSubnetOverrides":
        """
        :param index: -
        """
        return jsii.invoke(self, "subnetOverrides", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labNameInput")
    def lab_name_input(self) -> builtins.str:
        return jsii.get(self, "labNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueIdentifier")
    def unique_identifier(self) -> builtins.str:
        return jsii.get(self, "uniqueIdentifier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDevTestVirtualNetworkTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labName")
    def lab_name(self) -> builtins.str:
        return jsii.get(self, "labName")

    @lab_name.setter # type: ignore
    def lab_name(self, value: builtins.str) -> None:
        jsii.set(self, "labName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDevTestVirtualNetworkTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDevTestVirtualNetworkTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermDevTestVirtualNetworkAllowedSubnets(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDevTestVirtualNetworkAllowedSubnets",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDevTestVirtualNetworkAllowedSubnets, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowPublicIp")
    def allow_public_ip(self) -> builtins.str:
        return jsii.get(self, "allowPublicIp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labSubnetName")
    def lab_subnet_name(self) -> builtins.str:
        return jsii.get(self, "labSubnetName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceId")
    def resource_id(self) -> builtins.str:
        return jsii.get(self, "resourceId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDevTestVirtualNetworkConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "lab_name": "labName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDevTestVirtualNetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        lab_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDevTestVirtualNetworkTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param lab_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDevTestVirtualNetworkTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "lab_name": lab_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def lab_name(self) -> builtins.str:
        result = self._values.get("lab_name")
        assert result is not None, "Required property 'lab_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDevTestVirtualNetworkTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDevTestVirtualNetworkConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDevTestVirtualNetworkSubnetOverrides(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDevTestVirtualNetworkSubnetOverrides",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermDevTestVirtualNetworkSubnetOverrides, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labSubnetName")
    def lab_subnet_name(self) -> builtins.str:
        return jsii.get(self, "labSubnetName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceId")
    def resource_id(self) -> builtins.str:
        return jsii.get(self, "resourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useInVmCreationPermission")
    def use_in_vm_creation_permission(self) -> builtins.str:
        return jsii.get(self, "useInVmCreationPermission")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usePublicIpAddressPermission")
    def use_public_ip_address_permission(self) -> builtins.str:
        return jsii.get(self, "usePublicIpAddressPermission")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkPoolName")
    def virtual_network_pool_name(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkPoolName")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDevTestVirtualNetworkTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDevTestVirtualNetworkTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDevTestVirtualNetworkTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDigitalTwinsInstance(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDigitalTwinsInstance",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDigitalTwinsInstanceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDigitalTwinsInstanceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDigitalTwinsInstance, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermDigitalTwinsInstanceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDigitalTwinsInstanceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDigitalTwinsInstanceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDigitalTwinsInstanceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDigitalTwinsInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDigitalTwinsInstanceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDigitalTwinsInstanceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDigitalTwinsInstanceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDigitalTwinsInstanceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDigitalTwinsInstanceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDigitalTwinsInstanceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDigitalTwinsInstanceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDiskEncryptionSet(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDiskEncryptionSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDiskEncryptionSetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDiskEncryptionSetConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDiskEncryptionSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDiskEncryptionSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDiskEncryptionSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDiskEncryptionSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDiskEncryptionSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDiskEncryptionSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermDiskEncryptionSetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDiskEncryptionSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDiskEncryptionSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDiskEncryptionSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDiskEncryptionSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDiskEncryptionSetTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDiskEncryptionSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermDnsZone(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermDnsZone",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermDnsZoneTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermDnsZoneConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermDnsZone, self, [scope, id, config])

    @jsii.member(jsii_name="resetResourceGroupName")
    def reset_resource_group_name(self) -> None:
        return jsii.invoke(self, "resetResourceGroupName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfRecordSets")
    def max_number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameServers")
    def name_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "nameServers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfRecordSets")
    def number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "numberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermDnsZoneTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermDnsZoneTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermDnsZoneTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDnsZoneConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermDnsZoneConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermDnsZoneTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermDnsZoneTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if resource_group_name is not None:
            self._values["resource_group_name"] = resource_group_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_group_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermDnsZoneTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDnsZoneConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermDnsZoneTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermDnsZoneTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermDnsZoneTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermEventgridTopic(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermEventgridTopic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermEventgridTopicTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermEventgridTopicConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermEventgridTopic, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermEventgridTopicTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermEventgridTopicTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermEventgridTopicTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventgridTopicConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermEventgridTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermEventgridTopicTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermEventgridTopicTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermEventgridTopicTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventgridTopicConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventgridTopicTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermEventgridTopicTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventgridTopicTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermEventhub(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermEventhub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermEventhubConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermEventhub, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionCount")
    def partition_count(self) -> jsii.Number:
        return jsii.get(self, "partitionCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionIds")
    def partition_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "partitionIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermEventhubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermEventhubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermEventhubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermEventhubAuthorizationRule(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermEventhubAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["DataAzurermEventhubAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermEventhubAuthorizationRuleConfig(
            eventhub_name=eventhub_name,
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            listen=listen,
            manage=manage,
            send=send,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermEventhubAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetListen")
    def reset_listen(self) -> None:
        return jsii.invoke(self, "resetListen", [])

    @jsii.member(jsii_name="resetManage")
    def reset_manage(self) -> None:
        return jsii.invoke(self, "resetManage", [])

    @jsii.member(jsii_name="resetSend")
    def reset_send(self) -> None:
        return jsii.invoke(self, "resetSend", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubNameInput")
    def eventhub_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionStringAlias")
    def primary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionStringAlias")
    def secondary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listenInput")
    def listen_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "listenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manageInput")
    def manage_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "manageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendInput")
    def send_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sendInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermEventhubAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubName")
    def eventhub_name(self) -> builtins.str:
        return jsii.get(self, "eventhubName")

    @eventhub_name.setter # type: ignore
    def eventhub_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @listen.setter # type: ignore
    def listen(self, value: builtins.bool) -> None:
        jsii.set(self, "listen", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @manage.setter # type: ignore
    def manage(self, value: builtins.bool) -> None:
        jsii.set(self, "manage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @send.setter # type: ignore
    def send(self, value: builtins.bool) -> None:
        jsii.set(self, "send", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermEventhubAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermEventhubAuthorizationRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "eventhub_name": "eventhubName",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "listen": "listen",
        "manage": "manage",
        "send": "send",
        "timeouts": "timeouts",
    },
)
class DataAzurermEventhubAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["DataAzurermEventhubAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermEventhubAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "eventhub_name": eventhub_name,
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if listen is not None:
            self._values["listen"] = listen
        if manage is not None:
            self._values["manage"] = manage
        if send is not None:
            self._values["send"] = send
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def eventhub_name(self) -> builtins.str:
        result = self._values.get("eventhub_name")
        assert result is not None, "Required property 'eventhub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def listen(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("listen")
        return result

    @builtins.property
    def manage(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manage")
        return result

    @builtins.property
    def send(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermEventhubAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermEventhubAuthorizationRuleTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermEventhubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermEventhubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermEventhubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermEventhubConsumerGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermEventhubConsumerGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubConsumerGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermEventhubConsumerGroupConfig(
            eventhub_name=eventhub_name,
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermEventhubConsumerGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubNameInput")
    def eventhub_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userMetadata")
    def user_metadata(self) -> builtins.str:
        return jsii.get(self, "userMetadata")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermEventhubConsumerGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubName")
    def eventhub_name(self) -> builtins.str:
        return jsii.get(self, "eventhubName")

    @eventhub_name.setter # type: ignore
    def eventhub_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermEventhubConsumerGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermEventhubConsumerGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubConsumerGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "eventhub_name": "eventhubName",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermEventhubConsumerGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubConsumerGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermEventhubConsumerGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "eventhub_name": eventhub_name,
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def eventhub_name(self) -> builtins.str:
        result = self._values.get("eventhub_name")
        assert result is not None, "Required property 'eventhub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermEventhubConsumerGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubConsumerGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubConsumerGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermEventhubConsumerGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubConsumerGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermEventhubNamespace(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermEventhubNamespace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubNamespaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermEventhubNamespaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermEventhubNamespace, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoInflateEnabled")
    def auto_inflate_enabled(self) -> builtins.bool:
        return jsii.get(self, "autoInflateEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacity")
    def capacity(self) -> jsii.Number:
        return jsii.get(self, "capacity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedClusterId")
    def dedicated_cluster_id(self) -> builtins.str:
        return jsii.get(self, "dedicatedClusterId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryConnectionString")
    def default_primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryConnectionStringAlias")
    def default_primary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryKey")
    def default_primary_key(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryConnectionString")
    def default_secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryConnectionStringAlias")
    def default_secondary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryKey")
    def default_secondary_key(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kafkaEnabled")
    def kafka_enabled(self) -> builtins.bool:
        return jsii.get(self, "kafkaEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumThroughputUnits")
    def maximum_throughput_units(self) -> jsii.Number:
        return jsii.get(self, "maximumThroughputUnits")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermEventhubNamespaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermEventhubNamespaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermEventhubNamespaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermEventhubNamespaceAuthorizationRule(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermEventhubNamespaceAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubNamespaceAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermEventhubNamespaceAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermEventhubNamespaceAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionStringAlias")
    def primary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionStringAlias")
    def secondary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermEventhubNamespaceAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermEventhubNamespaceAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermEventhubNamespaceAuthorizationRuleTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubNamespaceAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermEventhubNamespaceAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubNamespaceAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermEventhubNamespaceAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermEventhubNamespaceAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubNamespaceAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubNamespaceAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermEventhubNamespaceAuthorizationRuleTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubNamespaceAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubNamespaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermEventhubNamespaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermEventhubNamespaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermEventhubNamespaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermEventhubNamespaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubNamespaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubNamespaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermEventhubNamespaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubNamespaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermEventhubTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermEventhubTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermEventhubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermExpressRouteCircuit(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermExpressRouteCircuit",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermExpressRouteCircuitTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermExpressRouteCircuitConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermExpressRouteCircuit, self, [scope, id, config])

    @jsii.member(jsii_name="peerings")
    def peerings(self, index: builtins.str) -> "DataAzurermExpressRouteCircuitPeerings":
        """
        :param index: -
        """
        return jsii.invoke(self, "peerings", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="serviceProviderProperties")
    def service_provider_properties(
        self,
        index: builtins.str,
    ) -> "DataAzurermExpressRouteCircuitServiceProviderProperties":
        """
        :param index: -
        """
        return jsii.invoke(self, "serviceProviderProperties", [index])

    @jsii.member(jsii_name="sku")
    def sku(self, index: builtins.str) -> "DataAzurermExpressRouteCircuitSku":
        """
        :param index: -
        """
        return jsii.invoke(self, "sku", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceKey")
    def service_key(self) -> builtins.str:
        return jsii.get(self, "serviceKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceProviderProvisioningState")
    def service_provider_provisioning_state(self) -> builtins.str:
        return jsii.get(self, "serviceProviderProvisioningState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermExpressRouteCircuitTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermExpressRouteCircuitTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermExpressRouteCircuitTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermExpressRouteCircuitConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermExpressRouteCircuitConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermExpressRouteCircuitTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermExpressRouteCircuitTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermExpressRouteCircuitTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermExpressRouteCircuitConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermExpressRouteCircuitPeerings(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermExpressRouteCircuitPeerings",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermExpressRouteCircuitPeerings, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureAsn")
    def azure_asn(self) -> jsii.Number:
        return jsii.get(self, "azureAsn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerAsn")
    def peer_asn(self) -> jsii.Number:
        return jsii.get(self, "peerAsn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peeringType")
    def peering_type(self) -> builtins.str:
        return jsii.get(self, "peeringType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryPeerAddressPrefix")
    def primary_peer_address_prefix(self) -> builtins.str:
        return jsii.get(self, "primaryPeerAddressPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryPeerAddressPrefix")
    def secondary_peer_address_prefix(self) -> builtins.str:
        return jsii.get(self, "secondaryPeerAddressPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedKey")
    def shared_key(self) -> builtins.str:
        return jsii.get(self, "sharedKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vlanId")
    def vlan_id(self) -> jsii.Number:
        return jsii.get(self, "vlanId")


class DataAzurermExpressRouteCircuitServiceProviderProperties(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermExpressRouteCircuitServiceProviderProperties",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermExpressRouteCircuitServiceProviderProperties, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bandwidthInMbps")
    def bandwidth_in_mbps(self) -> jsii.Number:
        return jsii.get(self, "bandwidthInMbps")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peeringLocation")
    def peering_location(self) -> builtins.str:
        return jsii.get(self, "peeringLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceProviderName")
    def service_provider_name(self) -> builtins.str:
        return jsii.get(self, "serviceProviderName")


class DataAzurermExpressRouteCircuitSku(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermExpressRouteCircuitSku",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermExpressRouteCircuitSku, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="family")
    def family(self) -> builtins.str:
        return jsii.get(self, "family")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermExpressRouteCircuitTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermExpressRouteCircuitTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermExpressRouteCircuitTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermFirewall(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFirewall",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermFirewallTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermFirewallConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermFirewall, self, [scope, id, config])

    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermFirewallIpConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "ipConfiguration", [index])

    @jsii.member(jsii_name="managementIpConfiguration")
    def management_ip_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermFirewallManagementIpConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "managementIpConfiguration", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="virtualHub")
    def virtual_hub(self, index: builtins.str) -> "DataAzurermFirewallVirtualHub":
        """
        :param index: -
        """
        return jsii.invoke(self, "virtualHub", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServers")
    def dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsServers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallPolicyId")
    def firewall_policy_id(self) -> builtins.str:
        return jsii.get(self, "firewallPolicyId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuTier")
    def sku_tier(self) -> builtins.str:
        return jsii.get(self, "skuTier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelMode")
    def threat_intel_mode(self) -> builtins.str:
        return jsii.get(self, "threatIntelMode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermFirewallTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermFirewallTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermFirewallTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFirewallConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class DataAzurermFirewallConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermFirewallTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermFirewallTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermFirewallTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFirewallConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermFirewallIpConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFirewallIpConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFirewallIpConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressId")
    def public_ip_address_id(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")


class DataAzurermFirewallManagementIpConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFirewallManagementIpConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFirewallManagementIpConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressId")
    def public_ip_address_id(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")


class DataAzurermFirewallPolicy(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFirewallPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermFirewallPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermFirewallPolicyConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermFirewallPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="dns")
    def dns(self, index: builtins.str) -> "DataAzurermFirewallPolicyDns":
        """
        :param index: -
        """
        return jsii.invoke(self, "dns", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="threatIntelligenceAllowlist")
    def threat_intelligence_allowlist(
        self,
        index: builtins.str,
    ) -> "DataAzurermFirewallPolicyThreatIntelligenceAllowlist":
        """
        :param index: -
        """
        return jsii.invoke(self, "threatIntelligenceAllowlist", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="basePolicyId")
    def base_policy_id(self) -> builtins.str:
        return jsii.get(self, "basePolicyId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="childPolicies")
    def child_policies(self) -> typing.List[builtins.str]:
        return jsii.get(self, "childPolicies")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewalls")
    def firewalls(self) -> typing.List[builtins.str]:
        return jsii.get(self, "firewalls")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleCollectionGroups")
    def rule_collection_groups(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ruleCollectionGroups")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelligenceMode")
    def threat_intelligence_mode(self) -> builtins.str:
        return jsii.get(self, "threatIntelligenceMode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermFirewallPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermFirewallPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermFirewallPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFirewallPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermFirewallPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermFirewallPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermFirewallPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermFirewallPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFirewallPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermFirewallPolicyDns(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFirewallPolicyDns",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFirewallPolicyDns, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRuleFqdnEnabled")
    def network_rule_fqdn_enabled(self) -> builtins.bool:
        return jsii.get(self, "networkRuleFqdnEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proxyEnabled")
    def proxy_enabled(self) -> builtins.bool:
        return jsii.get(self, "proxyEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servers")
    def servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "servers")


class DataAzurermFirewallPolicyThreatIntelligenceAllowlist(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFirewallPolicyThreatIntelligenceAllowlist",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFirewallPolicyThreatIntelligenceAllowlist, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdns")
    def fqdns(self) -> typing.List[builtins.str]:
        return jsii.get(self, "fqdns")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddresses")
    def ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ipAddresses")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFirewallPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermFirewallPolicyTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFirewallPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFirewallTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermFirewallTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFirewallTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermFirewallVirtualHub(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFirewallVirtualHub",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFirewallVirtualHub, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddresses")
    def public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpCount")
    def public_ip_count(self) -> jsii.Number:
        return jsii.get(self, "publicIpCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")


class DataAzurermFunctionApp(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionApp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermFunctionAppTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermFunctionAppConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermFunctionApp, self, [scope, id, config])

    @jsii.member(jsii_name="appSettings")
    def app_settings(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "appSettings", [key])

    @jsii.member(jsii_name="connectionString")
    def connection_string(
        self,
        index: builtins.str,
    ) -> "DataAzurermFunctionAppConnectionString":
        """
        :param index: -
        """
        return jsii.invoke(self, "connectionString", [index])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermFunctionAppIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="siteConfig")
    def site_config(self, index: builtins.str) -> "DataAzurermFunctionAppSiteConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteConfig", [index])

    @jsii.member(jsii_name="siteCredential")
    def site_credential(
        self,
        index: builtins.str,
    ) -> "DataAzurermFunctionAppSiteCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteCredential", [index])

    @jsii.member(jsii_name="sourceControl")
    def source_control(
        self,
        index: builtins.str,
    ) -> "DataAzurermFunctionAppSourceControl":
        """
        :param index: -
        """
        return jsii.invoke(self, "sourceControl", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanId")
    def app_service_plan_id(self) -> builtins.str:
        return jsii.get(self, "appServicePlanId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDomainVerificationId")
    def custom_domain_verification_id(self) -> builtins.str:
        return jsii.get(self, "customDomainVerificationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultHostname")
    def default_hostname(self) -> builtins.str:
        return jsii.get(self, "defaultHostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundIpAddresses")
    def outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "outboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="possibleOutboundIpAddresses")
    def possible_outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "possibleOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermFunctionAppTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermFunctionAppTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermFunctionAppTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFunctionAppConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermFunctionAppConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermFunctionAppTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermFunctionAppTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermFunctionAppTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFunctionAppConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermFunctionAppConnectionString(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppConnectionString",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppConnectionString, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")


class DataAzurermFunctionAppHostKeys(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppHostKeys",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermFunctionAppHostKeysTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermFunctionAppHostKeysConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermFunctionAppHostKeys, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultFunctionKey")
    def default_function_key(self) -> builtins.str:
        return jsii.get(self, "defaultFunctionKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="masterKey")
    def master_key(self) -> builtins.str:
        return jsii.get(self, "masterKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermFunctionAppHostKeysTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermFunctionAppHostKeysTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermFunctionAppHostKeysTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFunctionAppHostKeysConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermFunctionAppHostKeysConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermFunctionAppHostKeysTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermFunctionAppHostKeysTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermFunctionAppHostKeysTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFunctionAppHostKeysConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFunctionAppHostKeysTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermFunctionAppHostKeysTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFunctionAppHostKeysTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermFunctionAppIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


class DataAzurermFunctionAppSiteConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppSiteConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppSiteConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alwaysOn")
    def always_on(self) -> builtins.bool:
        return jsii.get(self, "alwaysOn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoSwapSlotName")
    def auto_swap_slot_name(self) -> builtins.str:
        return jsii.get(self, "autoSwapSlotName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cors")
    def cors(self) -> typing.Any:
        return jsii.get(self, "cors")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ftpsState")
    def ftps_state(self) -> builtins.str:
        return jsii.get(self, "ftpsState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthCheckPath")
    def health_check_path(self) -> builtins.str:
        return jsii.get(self, "healthCheckPath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="http2Enabled")
    def http2_enabled(self) -> builtins.bool:
        return jsii.get(self, "http2Enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRestriction")
    def ip_restriction(self) -> typing.Any:
        return jsii.get(self, "ipRestriction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linuxFxVersion")
    def linux_fx_version(self) -> builtins.str:
        return jsii.get(self, "linuxFxVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersion")
    def min_tls_version(self) -> builtins.str:
        return jsii.get(self, "minTlsVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="preWarmedInstanceCount")
    def pre_warmed_instance_count(self) -> jsii.Number:
        return jsii.get(self, "preWarmedInstanceCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmIpRestriction")
    def scm_ip_restriction(self) -> typing.Any:
        return jsii.get(self, "scmIpRestriction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmType")
    def scm_type(self) -> builtins.str:
        return jsii.get(self, "scmType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scmUseMainIpRestriction")
    def scm_use_main_ip_restriction(self) -> builtins.bool:
        return jsii.get(self, "scmUseMainIpRestriction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="use32BitWorkerProcess")
    def use32_bit_worker_process(self) -> builtins.bool:
        return jsii.get(self, "use32BitWorkerProcess")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="websocketsEnabled")
    def websockets_enabled(self) -> builtins.bool:
        return jsii.get(self, "websocketsEnabled")


class DataAzurermFunctionAppSiteConfigCors(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppSiteConfigCors",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppSiteConfigCors, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedOrigins")
    def allowed_origins(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedOrigins")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="supportCredentials")
    def support_credentials(self) -> builtins.bool:
        return jsii.get(self, "supportCredentials")


class DataAzurermFunctionAppSiteConfigIpRestriction(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppSiteConfigIpRestriction",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppSiteConfigIpRestriction, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetId")
    def virtual_network_subnet_id(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkSubnetId")


class DataAzurermFunctionAppSiteConfigScmIpRestriction(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppSiteConfigScmIpRestriction",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppSiteConfigScmIpRestriction, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetId")
    def virtual_network_subnet_id(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkSubnetId")


class DataAzurermFunctionAppSiteCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppSiteCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppSiteCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class DataAzurermFunctionAppSourceControl(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermFunctionAppSourceControl",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermFunctionAppSourceControl, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="branch")
    def branch(self) -> builtins.str:
        return jsii.get(self, "branch")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manualIntegration")
    def manual_integration(self) -> builtins.bool:
        return jsii.get(self, "manualIntegration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="repoUrl")
    def repo_url(self) -> builtins.str:
        return jsii.get(self, "repoUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollbackEnabled")
    def rollback_enabled(self) -> builtins.bool:
        return jsii.get(self, "rollbackEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useMercurial")
    def use_mercurial(self) -> builtins.bool:
        return jsii.get(self, "useMercurial")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermFunctionAppTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermFunctionAppTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermFunctionAppTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermHdinsightCluster(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermHdinsightCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermHdinsightClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermHdinsightClusterConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermHdinsightCluster, self, [scope, id, config])

    @jsii.member(jsii_name="componentVersions")
    def component_versions(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "componentVersions", [key])

    @jsii.member(jsii_name="gateway")
    def gateway(self, index: builtins.str) -> "DataAzurermHdinsightClusterGateway":
        """
        :param index: -
        """
        return jsii.invoke(self, "gateway", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="edgeSshEndpoint")
    def edge_ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "edgeSshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermHdinsightClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermHdinsightClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermHdinsightClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermHdinsightClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermHdinsightClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermHdinsightClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermHdinsightClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermHdinsightClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermHdinsightClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermHdinsightClusterGateway(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermHdinsightClusterGateway",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermHdinsightClusterGateway, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermHdinsightClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermHdinsightClusterTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermHdinsightClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermHealthcareService(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermHealthcareService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermHealthcareServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermHealthcareServiceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermHealthcareService, self, [scope, id, config])

    @jsii.member(jsii_name="authenticationConfiguration")
    def authentication_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermHealthcareServiceAuthenticationConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "authenticationConfiguration", [index])

    @jsii.member(jsii_name="corsConfiguration")
    def cors_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermHealthcareServiceCorsConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "corsConfiguration", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessPolicyObjectIds")
    def access_policy_object_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "accessPolicyObjectIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cosmosdbThroughput")
    def cosmosdb_throughput(self) -> jsii.Number:
        return jsii.get(self, "cosmosdbThroughput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermHealthcareServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermHealthcareServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermHealthcareServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermHealthcareServiceAuthenticationConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermHealthcareServiceAuthenticationConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermHealthcareServiceAuthenticationConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="audience")
    def audience(self) -> builtins.str:
        return jsii.get(self, "audience")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authority")
    def authority(self) -> builtins.str:
        return jsii.get(self, "authority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="smartProxyEnabled")
    def smart_proxy_enabled(self) -> builtins.bool:
        return jsii.get(self, "smartProxyEnabled")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermHealthcareServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermHealthcareServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermHealthcareServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermHealthcareServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermHealthcareServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermHealthcareServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermHealthcareServiceCorsConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermHealthcareServiceCorsConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermHealthcareServiceCorsConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowCredentials")
    def allow_credentials(self) -> builtins.bool:
        return jsii.get(self, "allowCredentials")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedHeaders")
    def allowed_headers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedHeaders")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedMethods")
    def allowed_methods(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedMethods")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedOrigins")
    def allowed_origins(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedOrigins")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxAgeInSeconds")
    def max_age_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "maxAgeInSeconds")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermHealthcareServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermHealthcareServiceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermHealthcareServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermImage(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermImage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        resource_group_name: builtins.str,
        name: typing.Optional[builtins.str] = None,
        name_regex: typing.Optional[builtins.str] = None,
        sort_descending: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["DataAzurermImageTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param resource_group_name: -
        :param name: -
        :param name_regex: -
        :param sort_descending: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermImageConfig(
            resource_group_name=resource_group_name,
            name=name,
            name_regex=name_regex,
            sort_descending=sort_descending,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermImage, self, [scope, id, config])

    @jsii.member(jsii_name="dataDisk")
    def data_disk(self, index: builtins.str) -> "DataAzurermImageDataDisk":
        """
        :param index: -
        """
        return jsii.invoke(self, "dataDisk", [index])

    @jsii.member(jsii_name="osDisk")
    def os_disk(self, index: builtins.str) -> "DataAzurermImageOsDisk":
        """
        :param index: -
        """
        return jsii.invoke(self, "osDisk", [index])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetNameRegex")
    def reset_name_regex(self) -> None:
        return jsii.invoke(self, "resetNameRegex", [])

    @jsii.member(jsii_name="resetSortDescending")
    def reset_sort_descending(self) -> None:
        return jsii.invoke(self, "resetSortDescending", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneResilient")
    def zone_resilient(self) -> builtins.bool:
        return jsii.get(self, "zoneResilient")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameRegexInput")
    def name_regex_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameRegexInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sortDescendingInput")
    def sort_descending_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sortDescendingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermImageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameRegex")
    def name_regex(self) -> builtins.str:
        return jsii.get(self, "nameRegex")

    @name_regex.setter # type: ignore
    def name_regex(self, value: builtins.str) -> None:
        jsii.set(self, "nameRegex", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sortDescending")
    def sort_descending(self) -> builtins.bool:
        return jsii.get(self, "sortDescending")

    @sort_descending.setter # type: ignore
    def sort_descending(self, value: builtins.bool) -> None:
        jsii.set(self, "sortDescending", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermImageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermImageTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermImageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "resource_group_name": "resourceGroupName",
        "name": "name",
        "name_regex": "nameRegex",
        "sort_descending": "sortDescending",
        "timeouts": "timeouts",
    },
)
class DataAzurermImageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        resource_group_name: builtins.str,
        name: typing.Optional[builtins.str] = None,
        name_regex: typing.Optional[builtins.str] = None,
        sort_descending: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["DataAzurermImageTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param resource_group_name: -
        :param name: -
        :param name_regex: -
        :param sort_descending: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermImageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if name is not None:
            self._values["name"] = name
        if name_regex is not None:
            self._values["name_regex"] = name_regex
        if sort_descending is not None:
            self._values["sort_descending"] = sort_descending
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def name_regex(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name_regex")
        return result

    @builtins.property
    def sort_descending(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("sort_descending")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermImageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermImageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermImageDataDisk(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermImageDataDisk",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermImageDataDisk, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobUri")
    def blob_uri(self) -> builtins.str:
        return jsii.get(self, "blobUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="caching")
    def caching(self) -> builtins.str:
        return jsii.get(self, "caching")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lun")
    def lun(self) -> jsii.Number:
        return jsii.get(self, "lun")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDiskId")
    def managed_disk_id(self) -> builtins.str:
        return jsii.get(self, "managedDiskId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeGb")
    def size_gb(self) -> jsii.Number:
        return jsii.get(self, "sizeGb")


class DataAzurermImageOsDisk(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermImageOsDisk",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermImageOsDisk, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobUri")
    def blob_uri(self) -> builtins.str:
        return jsii.get(self, "blobUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="caching")
    def caching(self) -> builtins.str:
        return jsii.get(self, "caching")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDiskId")
    def managed_disk_id(self) -> builtins.str:
        return jsii.get(self, "managedDiskId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osState")
    def os_state(self) -> builtins.str:
        return jsii.get(self, "osState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeGb")
    def size_gb(self) -> jsii.Number:
        return jsii.get(self, "sizeGb")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermImageTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermImageTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermImageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermImages(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermImages",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        resource_group_name: builtins.str,
        tags_filter: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermImagesTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param resource_group_name: -
        :param tags_filter: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermImagesConfig(
            resource_group_name=resource_group_name,
            tags_filter=tags_filter,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermImages, self, [scope, id, config])

    @jsii.member(jsii_name="images")
    def images(self, index: builtins.str) -> "DataAzurermImagesImages":
        """
        :param index: -
        """
        return jsii.invoke(self, "images", [index])

    @jsii.member(jsii_name="resetTagsFilter")
    def reset_tags_filter(self) -> None:
        return jsii.invoke(self, "resetTagsFilter", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsFilterInput")
    def tags_filter_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermImagesTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsFilter")
    def tags_filter(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tagsFilter")

    @tags_filter.setter # type: ignore
    def tags_filter(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tagsFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermImagesTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermImagesTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermImagesConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "resource_group_name": "resourceGroupName",
        "tags_filter": "tagsFilter",
        "timeouts": "timeouts",
    },
)
class DataAzurermImagesConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        resource_group_name: builtins.str,
        tags_filter: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermImagesTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param resource_group_name: -
        :param tags_filter: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermImagesTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags_filter is not None:
            self._values["tags_filter"] = tags_filter
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags_filter(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags_filter")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermImagesTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermImagesConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermImagesImages(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermImagesImages",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermImagesImages, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataDisk")
    def data_disk(self) -> typing.Any:
        return jsii.get(self, "dataDisk")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDisk")
    def os_disk(self) -> typing.Any:
        return jsii.get(self, "osDisk")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Any:
        return jsii.get(self, "tags")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneResilient")
    def zone_resilient(self) -> builtins.bool:
        return jsii.get(self, "zoneResilient")


class DataAzurermImagesImagesDataDisk(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermImagesImagesDataDisk",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermImagesImagesDataDisk, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobUri")
    def blob_uri(self) -> builtins.str:
        return jsii.get(self, "blobUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="caching")
    def caching(self) -> builtins.str:
        return jsii.get(self, "caching")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lun")
    def lun(self) -> jsii.Number:
        return jsii.get(self, "lun")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDiskId")
    def managed_disk_id(self) -> builtins.str:
        return jsii.get(self, "managedDiskId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeGb")
    def size_gb(self) -> jsii.Number:
        return jsii.get(self, "sizeGb")


class DataAzurermImagesImagesOsDisk(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermImagesImagesOsDisk",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermImagesImagesOsDisk, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobUri")
    def blob_uri(self) -> builtins.str:
        return jsii.get(self, "blobUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="caching")
    def caching(self) -> builtins.str:
        return jsii.get(self, "caching")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDiskId")
    def managed_disk_id(self) -> builtins.str:
        return jsii.get(self, "managedDiskId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osState")
    def os_state(self) -> builtins.str:
        return jsii.get(self, "osState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeGb")
    def size_gb(self) -> jsii.Number:
        return jsii.get(self, "sizeGb")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermImagesTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermImagesTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermImagesTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermIothubDps(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermIothubDps",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermIothubDpsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermIothubDpsConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermIothubDps, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocationPolicy")
    def allocation_policy(self) -> builtins.str:
        return jsii.get(self, "allocationPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceProvisioningHostName")
    def device_provisioning_host_name(self) -> builtins.str:
        return jsii.get(self, "deviceProvisioningHostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idScope")
    def id_scope(self) -> builtins.str:
        return jsii.get(self, "idScope")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceOperationsHostName")
    def service_operations_host_name(self) -> builtins.str:
        return jsii.get(self, "serviceOperationsHostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermIothubDpsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermIothubDpsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermIothubDpsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIothubDpsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermIothubDpsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermIothubDpsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermIothubDpsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermIothubDpsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIothubDpsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermIothubDpsSharedAccessPolicy(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermIothubDpsSharedAccessPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        iothub_dps_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermIothubDpsSharedAccessPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param iothub_dps_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermIothubDpsSharedAccessPolicyConfig(
            iothub_dps_name=iothub_dps_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermIothubDpsSharedAccessPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubDpsNameInput")
    def iothub_dps_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubDpsNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermIothubDpsSharedAccessPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubDpsName")
    def iothub_dps_name(self) -> builtins.str:
        return jsii.get(self, "iothubDpsName")

    @iothub_dps_name.setter # type: ignore
    def iothub_dps_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubDpsName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermIothubDpsSharedAccessPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermIothubDpsSharedAccessPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIothubDpsSharedAccessPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "iothub_dps_name": "iothubDpsName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermIothubDpsSharedAccessPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        iothub_dps_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermIothubDpsSharedAccessPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param iothub_dps_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermIothubDpsSharedAccessPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "iothub_dps_name": iothub_dps_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def iothub_dps_name(self) -> builtins.str:
        result = self._values.get("iothub_dps_name")
        assert result is not None, "Required property 'iothub_dps_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermIothubDpsSharedAccessPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIothubDpsSharedAccessPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIothubDpsSharedAccessPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermIothubDpsSharedAccessPolicyTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIothubDpsSharedAccessPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIothubDpsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermIothubDpsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIothubDpsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermIothubSharedAccessPolicy(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermIothubSharedAccessPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermIothubSharedAccessPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermIothubSharedAccessPolicyConfig(
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermIothubSharedAccessPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermIothubSharedAccessPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermIothubSharedAccessPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermIothubSharedAccessPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIothubSharedAccessPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermIothubSharedAccessPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermIothubSharedAccessPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermIothubSharedAccessPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermIothubSharedAccessPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIothubSharedAccessPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIothubSharedAccessPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermIothubSharedAccessPolicyTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIothubSharedAccessPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermIpGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermIpGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermIpGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermIpGroupConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermIpGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cidrs")
    def cidrs(self) -> typing.List[builtins.str]:
        return jsii.get(self, "cidrs")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermIpGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermIpGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermIpGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIpGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermIpGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermIpGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermIpGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermIpGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIpGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermIpGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermIpGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermIpGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKeyVault(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVault",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKeyVaultConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKeyVault, self, [scope, id, config])

    @jsii.member(jsii_name="accessPolicy")
    def access_policy(self, index: builtins.str) -> "DataAzurermKeyVaultAccessPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "accessPolicy", [index])

    @jsii.member(jsii_name="networkAcls")
    def network_acls(self, index: builtins.str) -> "DataAzurermKeyVaultNetworkAcls":
        """
        :param index: -
        """
        return jsii.invoke(self, "networkAcls", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForDeployment")
    def enabled_for_deployment(self) -> builtins.bool:
        return jsii.get(self, "enabledForDeployment")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForDiskEncryption")
    def enabled_for_disk_encryption(self) -> builtins.bool:
        return jsii.get(self, "enabledForDiskEncryption")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForTemplateDeployment")
    def enabled_for_template_deployment(self) -> builtins.bool:
        return jsii.get(self, "enabledForTemplateDeployment")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="purgeProtectionEnabled")
    def purge_protection_enabled(self) -> builtins.bool:
        return jsii.get(self, "purgeProtectionEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeleteEnabled")
    def soft_delete_enabled(self) -> builtins.bool:
        return jsii.get(self, "softDeleteEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vaultUri")
    def vault_uri(self) -> builtins.str:
        return jsii.get(self, "vaultUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermKeyVaultTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKeyVaultTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKeyVaultTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermKeyVaultAccessPolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultAccessPolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultAccessPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationId")
    def application_id(self) -> builtins.str:
        return jsii.get(self, "applicationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificatePermissions")
    def certificate_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "certificatePermissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyPermissions")
    def key_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keyPermissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretPermissions")
    def secret_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "secretPermissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storagePermissions")
    def storage_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "storagePermissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")


class DataAzurermKeyVaultAccessPolicyA(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultAccessPolicyA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultAccessPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKeyVaultAccessPolicyAConfig(
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKeyVaultAccessPolicyA, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificatePermissions")
    def certificate_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "certificatePermissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyPermissions")
    def key_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keyPermissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretPermissions")
    def secret_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "secretPermissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermKeyVaultAccessPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKeyVaultAccessPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKeyVaultAccessPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultAccessPolicyAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermKeyVaultAccessPolicyAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultAccessPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKeyVaultAccessPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermKeyVaultAccessPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultAccessPolicyAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultAccessPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKeyVaultAccessPolicyTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultAccessPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKeyVaultCertificate(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultCertificateTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKeyVaultCertificateConfig(
            key_vault_id=key_vault_id,
            name=name,
            timeouts=timeouts,
            version=version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKeyVaultCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="certificatePolicy")
    def certificate_policy(
        self,
        index: builtins.str,
    ) -> "DataAzurermKeyVaultCertificateCertificatePolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "certificatePolicy", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVersion")
    def reset_version(self) -> None:
        return jsii.invoke(self, "resetVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateData")
    def certificate_data(self) -> builtins.str:
        return jsii.get(self, "certificateData")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretId")
    def secret_id(self) -> builtins.str:
        return jsii.get(self, "secretId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermKeyVaultCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKeyVaultCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKeyVaultCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


class DataAzurermKeyVaultCertificateCertificatePolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="issuerParameters")
    def issuer_parameters(self) -> typing.Any:
        return jsii.get(self, "issuerParameters")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyProperties")
    def key_properties(self) -> typing.Any:
        return jsii.get(self, "keyProperties")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lifetimeAction")
    def lifetime_action(self) -> typing.Any:
        return jsii.get(self, "lifetimeAction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretProperties")
    def secret_properties(self) -> typing.Any:
        return jsii.get(self, "secretProperties")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="x509CertificateProperties")
    def x509_certificate_properties(self) -> typing.Any:
        return jsii.get(self, "x509CertificateProperties")


class DataAzurermKeyVaultCertificateCertificatePolicyIssuerParameters(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicyIssuerParameters",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicyIssuerParameters, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


class DataAzurermKeyVaultCertificateCertificatePolicyKeyProperties(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicyKeyProperties",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicyKeyProperties, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="exportable")
    def exportable(self) -> builtins.bool:
        return jsii.get(self, "exportable")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keySize")
    def key_size(self) -> jsii.Number:
        return jsii.get(self, "keySize")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyType")
    def key_type(self) -> builtins.str:
        return jsii.get(self, "keyType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reuseKey")
    def reuse_key(self) -> builtins.bool:
        return jsii.get(self, "reuseKey")


class DataAzurermKeyVaultCertificateCertificatePolicyLifetimeAction(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicyLifetimeAction",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicyLifetimeAction, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> typing.Any:
        return jsii.get(self, "action")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trigger")
    def trigger(self) -> typing.Any:
        return jsii.get(self, "trigger")


class DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionAction(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionAction",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionAction, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionType")
    def action_type(self) -> builtins.str:
        return jsii.get(self, "actionType")


class DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionTrigger(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionTrigger",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionTrigger, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="daysBeforeExpiry")
    def days_before_expiry(self) -> jsii.Number:
        return jsii.get(self, "daysBeforeExpiry")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lifetimePercentage")
    def lifetime_percentage(self) -> jsii.Number:
        return jsii.get(self, "lifetimePercentage")


class DataAzurermKeyVaultCertificateCertificatePolicySecretProperties(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicySecretProperties",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicySecretProperties, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")


class DataAzurermKeyVaultCertificateCertificatePolicyX509CertificateProperties(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicyX509CertificateProperties",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicyX509CertificateProperties, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedKeyUsage")
    def extended_key_usage(self) -> typing.List[builtins.str]:
        return jsii.get(self, "extendedKeyUsage")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyUsage")
    def key_usage(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keyUsage")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subject")
    def subject(self) -> builtins.str:
        return jsii.get(self, "subject")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subjectAlternativeNames")
    def subject_alternative_names(self) -> typing.Any:
        return jsii.get(self, "subjectAlternativeNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validityInMonths")
    def validity_in_months(self) -> jsii.Number:
        return jsii.get(self, "validityInMonths")


class DataAzurermKeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsNames")
    def dns_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emails")
    def emails(self) -> typing.List[builtins.str]:
        return jsii.get(self, "emails")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upns")
    def upns(self) -> typing.List[builtins.str]:
        return jsii.get(self, "upns")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "timeouts": "timeouts",
        "version": "version",
    },
)
class DataAzurermKeyVaultCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultCertificateTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKeyVaultCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_id": key_vault_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermKeyVaultCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKeyVaultCertificateIssuer(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateIssuer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultCertificateIssuerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKeyVaultCertificateIssuerConfig(
            key_vault_id=key_vault_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKeyVaultCertificateIssuer, self, [scope, id, config])

    @jsii.member(jsii_name="admin")
    def admin(self, index: builtins.str) -> "DataAzurermKeyVaultCertificateIssuerAdmin":
        """
        :param index: -
        """
        return jsii.invoke(self, "admin", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountId")
    def account_id(self) -> builtins.str:
        return jsii.get(self, "accountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> builtins.str:
        return jsii.get(self, "orgId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="providerName")
    def provider_name(self) -> builtins.str:
        return jsii.get(self, "providerName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermKeyVaultCertificateIssuerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKeyVaultCertificateIssuerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKeyVaultCertificateIssuerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermKeyVaultCertificateIssuerAdmin(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultCertificateIssuerAdmin",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultCertificateIssuerAdmin, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddress")
    def email_address(self) -> builtins.str:
        return jsii.get(self, "emailAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firstName")
    def first_name(self) -> builtins.str:
        return jsii.get(self, "firstName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lastName")
    def last_name(self) -> builtins.str:
        return jsii.get(self, "lastName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="phone")
    def phone(self) -> builtins.str:
        return jsii.get(self, "phone")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultCertificateIssuerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermKeyVaultCertificateIssuerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultCertificateIssuerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKeyVaultCertificateIssuerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_id": key_vault_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermKeyVaultCertificateIssuerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultCertificateIssuerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultCertificateIssuerTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKeyVaultCertificateIssuerTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultCertificateIssuerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKeyVaultCertificateTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermKeyVaultConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKeyVaultTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermKeyVaultTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKeyVaultKey(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultKeyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKeyVaultKeyConfig(
            key_vault_id=key_vault_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKeyVaultKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="e")
    def e(self) -> builtins.str:
        return jsii.get(self, "e")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyOpts")
    def key_opts(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keyOpts")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keySize")
    def key_size(self) -> jsii.Number:
        return jsii.get(self, "keySize")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyType")
    def key_type(self) -> builtins.str:
        return jsii.get(self, "keyType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="n")
    def n(self) -> builtins.str:
        return jsii.get(self, "n")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermKeyVaultKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKeyVaultKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKeyVaultKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermKeyVaultKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultKeyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKeyVaultKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_id": key_vault_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermKeyVaultKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKeyVaultKeyTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKeyVaultNetworkAcls(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultNetworkAcls",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKeyVaultNetworkAcls, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bypass")
    def bypass(self) -> builtins.str:
        return jsii.get(self, "bypass")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultAction")
    def default_action(self) -> builtins.str:
        return jsii.get(self, "defaultAction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRules")
    def ip_rules(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ipRules")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetIds")
    def virtual_network_subnet_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "virtualNetworkSubnetIds")


class DataAzurermKeyVaultSecret(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKeyVaultSecret",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultSecretTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKeyVaultSecretConfig(
            key_vault_id=key_vault_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKeyVaultSecret, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermKeyVaultSecretTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKeyVaultSecretTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKeyVaultSecretTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultSecretConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermKeyVaultSecretConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermKeyVaultSecretTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKeyVaultSecretTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_id": key_vault_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermKeyVaultSecretTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultSecretConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultSecretTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKeyVaultSecretTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultSecretTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKeyVaultTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKeyVaultTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKeyVaultTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKubernetesCluster(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKubernetesClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKubernetesClusterConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKubernetesCluster, self, [scope, id, config])

    @jsii.member(jsii_name="addonProfile")
    def addon_profile(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterAddonProfile":
        """
        :param index: -
        """
        return jsii.invoke(self, "addonProfile", [index])

    @jsii.member(jsii_name="agentPoolProfile")
    def agent_pool_profile(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterAgentPoolProfile":
        """
        :param index: -
        """
        return jsii.invoke(self, "agentPoolProfile", [index])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermKubernetesClusterIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="kubeAdminConfig")
    def kube_admin_config(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterKubeAdminConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "kubeAdminConfig", [index])

    @jsii.member(jsii_name="kubeConfig")
    def kube_config(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterKubeConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "kubeConfig", [index])

    @jsii.member(jsii_name="kubeletIdentity")
    def kubelet_identity(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterKubeletIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "kubeletIdentity", [index])

    @jsii.member(jsii_name="linuxProfile")
    def linux_profile(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterLinuxProfile":
        """
        :param index: -
        """
        return jsii.invoke(self, "linuxProfile", [index])

    @jsii.member(jsii_name="networkProfile")
    def network_profile(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterNetworkProfile":
        """
        :param index: -
        """
        return jsii.invoke(self, "networkProfile", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="roleBasedAccessControl")
    def role_based_access_control(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterRoleBasedAccessControl":
        """
        :param index: -
        """
        return jsii.invoke(self, "roleBasedAccessControl", [index])

    @jsii.member(jsii_name="servicePrincipal")
    def service_principal(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterServicePrincipal":
        """
        :param index: -
        """
        return jsii.invoke(self, "servicePrincipal", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="windowsProfile")
    def windows_profile(
        self,
        index: builtins.str,
    ) -> "DataAzurermKubernetesClusterWindowsProfile":
        """
        :param index: -
        """
        return jsii.invoke(self, "windowsProfile", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiServerAuthorizedIpRanges")
    def api_server_authorized_ip_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "apiServerAuthorizedIpRanges")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskEncryptionSetId")
    def disk_encryption_set_id(self) -> builtins.str:
        return jsii.get(self, "diskEncryptionSetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsPrefix")
    def dns_prefix(self) -> builtins.str:
        return jsii.get(self, "dnsPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubeAdminConfigRaw")
    def kube_admin_config_raw(self) -> builtins.str:
        return jsii.get(self, "kubeAdminConfigRaw")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubeConfigRaw")
    def kube_config_raw(self) -> builtins.str:
        return jsii.get(self, "kubeConfigRaw")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubernetesVersion")
    def kubernetes_version(self) -> builtins.str:
        return jsii.get(self, "kubernetesVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeResourceGroup")
    def node_resource_group(self) -> builtins.str:
        return jsii.get(self, "nodeResourceGroup")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateClusterEnabled")
    def private_cluster_enabled(self) -> builtins.bool:
        return jsii.get(self, "privateClusterEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateFqdn")
    def private_fqdn(self) -> builtins.str:
        return jsii.get(self, "privateFqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateLinkEnabled")
    def private_link_enabled(self) -> builtins.bool:
        return jsii.get(self, "privateLinkEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermKubernetesClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKubernetesClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKubernetesClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermKubernetesClusterAddonProfile(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterAddonProfile",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterAddonProfile, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azurePolicy")
    def azure_policy(self) -> typing.Any:
        return jsii.get(self, "azurePolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpApplicationRouting")
    def http_application_routing(self) -> typing.Any:
        return jsii.get(self, "httpApplicationRouting")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubeDashboard")
    def kube_dashboard(self) -> typing.Any:
        return jsii.get(self, "kubeDashboard")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="omsAgent")
    def oms_agent(self) -> typing.Any:
        return jsii.get(self, "omsAgent")


class DataAzurermKubernetesClusterAddonProfileAzurePolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterAddonProfileAzurePolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterAddonProfileAzurePolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")


class DataAzurermKubernetesClusterAddonProfileHttpApplicationRouting(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterAddonProfileHttpApplicationRouting",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterAddonProfileHttpApplicationRouting, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpApplicationRoutingZoneName")
    def http_application_routing_zone_name(self) -> builtins.str:
        return jsii.get(self, "httpApplicationRoutingZoneName")


class DataAzurermKubernetesClusterAddonProfileKubeDashboard(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterAddonProfileKubeDashboard",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterAddonProfileKubeDashboard, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")


class DataAzurermKubernetesClusterAddonProfileOmsAgent(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterAddonProfileOmsAgent",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterAddonProfileOmsAgent, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceId")
    def log_analytics_workspace_id(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="omsAgentIdentity")
    def oms_agent_identity(self) -> typing.Any:
        return jsii.get(self, "omsAgentIdentity")


class DataAzurermKubernetesClusterAddonProfileOmsAgentOmsAgentIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterAddonProfileOmsAgentOmsAgentIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterAddonProfileOmsAgentOmsAgentIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userAssignedIdentityId")
    def user_assigned_identity_id(self) -> builtins.str:
        return jsii.get(self, "userAssignedIdentityId")


class DataAzurermKubernetesClusterAgentPoolProfile(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterAgentPoolProfile",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterAgentPoolProfile, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilityZones")
    def availability_zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "availabilityZones")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="count")
    def count(self) -> jsii.Number:
        return jsii.get(self, "count")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutoScaling")
    def enable_auto_scaling(self) -> builtins.bool:
        return jsii.get(self, "enableAutoScaling")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableNodePublicIp")
    def enable_node_public_ip(self) -> builtins.bool:
        return jsii.get(self, "enableNodePublicIp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxCount")
    def max_count(self) -> jsii.Number:
        return jsii.get(self, "maxCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxPods")
    def max_pods(self) -> jsii.Number:
        return jsii.get(self, "maxPods")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minCount")
    def min_count(self) -> jsii.Number:
        return jsii.get(self, "minCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeLabels")
    def node_labels(self) -> typing.Any:
        return jsii.get(self, "nodeLabels")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeTaints")
    def node_taints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "nodeTaints")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="orchestratorVersion")
    def orchestrator_version(self) -> builtins.str:
        return jsii.get(self, "orchestratorVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskSizeGb")
    def os_disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "osDiskSizeGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Any:
        return jsii.get(self, "tags")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSize")
    def vm_size(self) -> builtins.str:
        return jsii.get(self, "vmSize")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vnetSubnetId")
    def vnet_subnet_id(self) -> builtins.str:
        return jsii.get(self, "vnetSubnetId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKubernetesClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermKubernetesClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKubernetesClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKubernetesClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermKubernetesClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKubernetesClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKubernetesClusterIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


class DataAzurermKubernetesClusterKubeAdminConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterKubeAdminConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterKubeAdminConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificate")
    def client_certificate(self) -> builtins.str:
        return jsii.get(self, "clientCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientKey")
    def client_key(self) -> builtins.str:
        return jsii.get(self, "clientKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterCaCertificate")
    def cluster_ca_certificate(self) -> builtins.str:
        return jsii.get(self, "clusterCaCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="host")
    def host(self) -> builtins.str:
        return jsii.get(self, "host")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class DataAzurermKubernetesClusterKubeConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterKubeConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterKubeConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificate")
    def client_certificate(self) -> builtins.str:
        return jsii.get(self, "clientCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientKey")
    def client_key(self) -> builtins.str:
        return jsii.get(self, "clientKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterCaCertificate")
    def cluster_ca_certificate(self) -> builtins.str:
        return jsii.get(self, "clusterCaCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="host")
    def host(self) -> builtins.str:
        return jsii.get(self, "host")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class DataAzurermKubernetesClusterKubeletIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterKubeletIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterKubeletIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userAssignedIdentityId")
    def user_assigned_identity_id(self) -> builtins.str:
        return jsii.get(self, "userAssignedIdentityId")


class DataAzurermKubernetesClusterLinuxProfile(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterLinuxProfile",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterLinuxProfile, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshKey")
    def ssh_key(self) -> typing.Any:
        return jsii.get(self, "sshKey")


class DataAzurermKubernetesClusterLinuxProfileSshKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterLinuxProfileSshKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterLinuxProfileSshKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyData")
    def key_data(self) -> builtins.str:
        return jsii.get(self, "keyData")


class DataAzurermKubernetesClusterNetworkProfile(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterNetworkProfile",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterNetworkProfile, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServiceIp")
    def dns_service_ip(self) -> builtins.str:
        return jsii.get(self, "dnsServiceIp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dockerBridgeCidr")
    def docker_bridge_cidr(self) -> builtins.str:
        return jsii.get(self, "dockerBridgeCidr")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerSku")
    def load_balancer_sku(self) -> builtins.str:
        return jsii.get(self, "loadBalancerSku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkPlugin")
    def network_plugin(self) -> builtins.str:
        return jsii.get(self, "networkPlugin")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkPolicy")
    def network_policy(self) -> builtins.str:
        return jsii.get(self, "networkPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="podCidr")
    def pod_cidr(self) -> builtins.str:
        return jsii.get(self, "podCidr")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceCidr")
    def service_cidr(self) -> builtins.str:
        return jsii.get(self, "serviceCidr")


class DataAzurermKubernetesClusterNodePool(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterNodePool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        kubernetes_cluster_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKubernetesClusterNodePoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param kubernetes_cluster_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKubernetesClusterNodePoolConfig(
            kubernetes_cluster_name=kubernetes_cluster_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKubernetesClusterNodePool, self, [scope, id, config])

    @jsii.member(jsii_name="nodeLabels")
    def node_labels(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "nodeLabels", [key])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilityZones")
    def availability_zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "availabilityZones")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutoScaling")
    def enable_auto_scaling(self) -> builtins.bool:
        return jsii.get(self, "enableAutoScaling")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableNodePublicIp")
    def enable_node_public_ip(self) -> builtins.bool:
        return jsii.get(self, "enableNodePublicIp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicy")
    def eviction_policy(self) -> builtins.str:
        return jsii.get(self, "evictionPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubernetesClusterNameInput")
    def kubernetes_cluster_name_input(self) -> builtins.str:
        return jsii.get(self, "kubernetesClusterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxCount")
    def max_count(self) -> jsii.Number:
        return jsii.get(self, "maxCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxPods")
    def max_pods(self) -> jsii.Number:
        return jsii.get(self, "maxPods")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minCount")
    def min_count(self) -> jsii.Number:
        return jsii.get(self, "minCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mode")
    def mode(self) -> builtins.str:
        return jsii.get(self, "mode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeCount")
    def node_count(self) -> jsii.Number:
        return jsii.get(self, "nodeCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeTaints")
    def node_taints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "nodeTaints")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="orchestratorVersion")
    def orchestrator_version(self) -> builtins.str:
        return jsii.get(self, "orchestratorVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskSizeGb")
    def os_disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "osDiskSizeGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskType")
    def os_disk_type(self) -> builtins.str:
        return jsii.get(self, "osDiskType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> builtins.str:
        return jsii.get(self, "priority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="spotMaxPrice")
    def spot_max_price(self) -> jsii.Number:
        return jsii.get(self, "spotMaxPrice")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSize")
    def vm_size(self) -> builtins.str:
        return jsii.get(self, "vmSize")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vnetSubnetId")
    def vnet_subnet_id(self) -> builtins.str:
        return jsii.get(self, "vnetSubnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermKubernetesClusterNodePoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubernetesClusterName")
    def kubernetes_cluster_name(self) -> builtins.str:
        return jsii.get(self, "kubernetesClusterName")

    @kubernetes_cluster_name.setter # type: ignore
    def kubernetes_cluster_name(self, value: builtins.str) -> None:
        jsii.set(self, "kubernetesClusterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKubernetesClusterNodePoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKubernetesClusterNodePoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKubernetesClusterNodePoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "kubernetes_cluster_name": "kubernetesClusterName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermKubernetesClusterNodePoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        kubernetes_cluster_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKubernetesClusterNodePoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param kubernetes_cluster_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKubernetesClusterNodePoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "kubernetes_cluster_name": kubernetes_cluster_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def kubernetes_cluster_name(self) -> builtins.str:
        result = self._values.get("kubernetes_cluster_name")
        assert result is not None, "Required property 'kubernetes_cluster_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermKubernetesClusterNodePoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKubernetesClusterNodePoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKubernetesClusterNodePoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKubernetesClusterNodePoolTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKubernetesClusterNodePoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKubernetesClusterRoleBasedAccessControl(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterRoleBasedAccessControl",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterRoleBasedAccessControl, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureActiveDirectory")
    def azure_active_directory(self) -> typing.Any:
        return jsii.get(self, "azureActiveDirectory")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")


class DataAzurermKubernetesClusterRoleBasedAccessControlAzureActiveDirectory(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterRoleBasedAccessControlAzureActiveDirectory",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterRoleBasedAccessControlAzureActiveDirectory, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminGroupObjectIds")
    def admin_group_object_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "adminGroupObjectIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAppId")
    def client_app_id(self) -> builtins.str:
        return jsii.get(self, "clientAppId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managed")
    def managed(self) -> builtins.bool:
        return jsii.get(self, "managed")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverAppId")
    def server_app_id(self) -> builtins.str:
        return jsii.get(self, "serverAppId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")


class DataAzurermKubernetesClusterServicePrincipal(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterServicePrincipal",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterServicePrincipal, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKubernetesClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKubernetesClusterTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKubernetesClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKubernetesClusterWindowsProfile(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesClusterWindowsProfile",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermKubernetesClusterWindowsProfile, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")


class DataAzurermKubernetesServiceVersions(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKubernetesServiceVersions",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        include_preview: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["DataAzurermKubernetesServiceVersionsTimeouts"] = None,
        version_prefix: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param include_preview: -
        :param timeouts: timeouts block.
        :param version_prefix: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKubernetesServiceVersionsConfig(
            location=location,
            include_preview=include_preview,
            timeouts=timeouts,
            version_prefix=version_prefix,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKubernetesServiceVersions, self, [scope, id, config])

    @jsii.member(jsii_name="resetIncludePreview")
    def reset_include_preview(self) -> None:
        return jsii.invoke(self, "resetIncludePreview", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVersionPrefix")
    def reset_version_prefix(self) -> None:
        return jsii.invoke(self, "resetVersionPrefix", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="latestVersion")
    def latest_version(self) -> builtins.str:
        return jsii.get(self, "latestVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versions")
    def versions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "versions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="includePreviewInput")
    def include_preview_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "includePreviewInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermKubernetesServiceVersionsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionPrefixInput")
    def version_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="includePreview")
    def include_preview(self) -> builtins.bool:
        return jsii.get(self, "includePreview")

    @include_preview.setter # type: ignore
    def include_preview(self, value: builtins.bool) -> None:
        jsii.set(self, "includePreview", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKubernetesServiceVersionsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKubernetesServiceVersionsTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionPrefix")
    def version_prefix(self) -> builtins.str:
        return jsii.get(self, "versionPrefix")

    @version_prefix.setter # type: ignore
    def version_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "versionPrefix", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKubernetesServiceVersionsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "include_preview": "includePreview",
        "timeouts": "timeouts",
        "version_prefix": "versionPrefix",
    },
)
class DataAzurermKubernetesServiceVersionsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        include_preview: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["DataAzurermKubernetesServiceVersionsTimeouts"] = None,
        version_prefix: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param include_preview: -
        :param timeouts: timeouts block.
        :param version_prefix: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKubernetesServiceVersionsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if include_preview is not None:
            self._values["include_preview"] = include_preview
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if version_prefix is not None:
            self._values["version_prefix"] = version_prefix

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def include_preview(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("include_preview")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermKubernetesServiceVersionsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def version_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version_prefix")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKubernetesServiceVersionsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKubernetesServiceVersionsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKubernetesServiceVersionsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKubernetesServiceVersionsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermKustoCluster(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermKustoCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKustoClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermKustoClusterConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermKustoCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataIngestionUri")
    def data_ingestion_uri(self) -> builtins.str:
        return jsii.get(self, "dataIngestionUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uri")
    def uri(self) -> builtins.str:
        return jsii.get(self, "uri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermKustoClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermKustoClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermKustoClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKustoClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermKustoClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermKustoClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermKustoClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermKustoClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKustoClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermKustoClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermKustoClusterTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermKustoClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermLb(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLb",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLbTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermLbConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermLb, self, [scope, id, config])

    @jsii.member(jsii_name="frontendIpConfiguration")
    def frontend_ip_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermLbFrontendIpConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "frontendIpConfiguration", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermLbTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermLbTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermLbTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermLbBackendAddressPool(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLbBackendAddressPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermLbBackendAddressPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param loadbalancer_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermLbBackendAddressPoolConfig(
            loadbalancer_id=loadbalancer_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermLbBackendAddressPool, self, [scope, id, config])

    @jsii.member(jsii_name="backendIpConfigurations")
    def backend_ip_configurations(
        self,
        index: builtins.str,
    ) -> "DataAzurermLbBackendAddressPoolBackendIpConfigurations":
        """
        :param index: -
        """
        return jsii.invoke(self, "backendIpConfigurations", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermLbBackendAddressPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermLbBackendAddressPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermLbBackendAddressPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermLbBackendAddressPoolBackendIpConfigurations(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLbBackendAddressPoolBackendIpConfigurations",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermLbBackendAddressPoolBackendIpConfigurations, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLbBackendAddressPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermLbBackendAddressPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermLbBackendAddressPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param loadbalancer_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermLbBackendAddressPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "loadbalancer_id": loadbalancer_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermLbBackendAddressPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLbBackendAddressPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLbBackendAddressPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermLbBackendAddressPoolTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLbBackendAddressPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLbConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermLbConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLbTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermLbTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermLbTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLbConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermLbFrontendIpConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLbFrontendIpConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermLbFrontendIpConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressAllocation")
    def private_ip_address_allocation(self) -> builtins.str:
        return jsii.get(self, "privateIpAddressAllocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressVersion")
    def private_ip_address_version(self) -> builtins.str:
        return jsii.get(self, "privateIpAddressVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressId")
    def public_ip_address_id(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")


class DataAzurermLbRule(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLbRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLbRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param loadbalancer_id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermLbRuleConfig(
            loadbalancer_id=loadbalancer_id,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermLbRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolId")
    def backend_address_pool_id(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPort")
    def backend_port(self) -> jsii.Number:
        return jsii.get(self, "backendPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableOutboundSnat")
    def disable_outbound_snat(self) -> builtins.bool:
        return jsii.get(self, "disableOutboundSnat")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFloatingIp")
    def enable_floating_ip(self) -> builtins.bool:
        return jsii.get(self, "enableFloatingIp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableTcpReset")
    def enable_tcp_reset(self) -> builtins.bool:
        return jsii.get(self, "enableTcpReset")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationName")
    def frontend_ip_configuration_name(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPort")
    def frontend_port(self) -> jsii.Number:
        return jsii.get(self, "frontendPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadDistribution")
    def load_distribution(self) -> builtins.str:
        return jsii.get(self, "loadDistribution")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="probeId")
    def probe_id(self) -> builtins.str:
        return jsii.get(self, "probeId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermLbRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermLbRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermLbRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLbRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermLbRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLbRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param loadbalancer_id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermLbRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "loadbalancer_id": loadbalancer_id,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermLbRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLbRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLbRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermLbRuleTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLbRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLbTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermLbTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLbTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermLogAnalyticsWorkspace(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLogAnalyticsWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLogAnalyticsWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermLogAnalyticsWorkspaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermLogAnalyticsWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyQuotaGb")
    def daily_quota_gb(self) -> jsii.Number:
        return jsii.get(self, "dailyQuotaGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portalUrl")
    def portal_url(self) -> builtins.str:
        return jsii.get(self, "portalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primarySharedKey")
    def primary_shared_key(self) -> builtins.str:
        return jsii.get(self, "primarySharedKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDays")
    def retention_in_days(self) -> jsii.Number:
        return jsii.get(self, "retentionInDays")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondarySharedKey")
    def secondary_shared_key(self) -> builtins.str:
        return jsii.get(self, "secondarySharedKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermLogAnalyticsWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermLogAnalyticsWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermLogAnalyticsWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLogAnalyticsWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermLogAnalyticsWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLogAnalyticsWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermLogAnalyticsWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermLogAnalyticsWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLogAnalyticsWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLogAnalyticsWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermLogAnalyticsWorkspaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLogAnalyticsWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermLogicAppIntegrationAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLogicAppIntegrationAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLogicAppIntegrationAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermLogicAppIntegrationAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermLogicAppIntegrationAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermLogicAppIntegrationAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermLogicAppIntegrationAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermLogicAppIntegrationAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLogicAppIntegrationAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermLogicAppIntegrationAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLogicAppIntegrationAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermLogicAppIntegrationAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermLogicAppIntegrationAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLogicAppIntegrationAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLogicAppIntegrationAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermLogicAppIntegrationAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLogicAppIntegrationAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermLogicAppWorkflow(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermLogicAppWorkflow",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLogicAppWorkflowTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermLogicAppWorkflowConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermLogicAppWorkflow, self, [scope, id, config])

    @jsii.member(jsii_name="parameters")
    def parameters(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "parameters", [key])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessEndpoint")
    def access_endpoint(self) -> builtins.str:
        return jsii.get(self, "accessEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectorEndpointIpAddresses")
    def connector_endpoint_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "connectorEndpointIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectorOutboundIpAddresses")
    def connector_outbound_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "connectorOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIntegrationAccountId")
    def logic_app_integration_account_id(self) -> builtins.str:
        return jsii.get(self, "logicAppIntegrationAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowEndpointIpAddresses")
    def workflow_endpoint_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "workflowEndpointIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowOutboundIpAddresses")
    def workflow_outbound_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "workflowOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowSchema")
    def workflow_schema(self) -> builtins.str:
        return jsii.get(self, "workflowSchema")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowVersion")
    def workflow_version(self) -> builtins.str:
        return jsii.get(self, "workflowVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermLogicAppWorkflowTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermLogicAppWorkflowTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermLogicAppWorkflowTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLogicAppWorkflowConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermLogicAppWorkflowConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermLogicAppWorkflowTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermLogicAppWorkflowTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermLogicAppWorkflowTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLogicAppWorkflowConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermLogicAppWorkflowTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermLogicAppWorkflowTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermLogicAppWorkflowTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMachineLearningWorkspace(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMachineLearningWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMachineLearningWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMachineLearningWorkspaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMachineLearningWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(
        self,
        index: builtins.str,
    ) -> "DataAzurermMachineLearningWorkspaceIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermMachineLearningWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMachineLearningWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMachineLearningWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMachineLearningWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMachineLearningWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMachineLearningWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMachineLearningWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermMachineLearningWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMachineLearningWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMachineLearningWorkspaceIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMachineLearningWorkspaceIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMachineLearningWorkspaceIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMachineLearningWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMachineLearningWorkspaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMachineLearningWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMaintenanceConfiguration(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMaintenanceConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMaintenanceConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMaintenanceConfigurationConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMaintenanceConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermMaintenanceConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMaintenanceConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMaintenanceConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMaintenanceConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMaintenanceConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMaintenanceConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMaintenanceConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermMaintenanceConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMaintenanceConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMaintenanceConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMaintenanceConfigurationTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMaintenanceConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermManagedApplicationDefinition(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermManagedApplicationDefinition",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermManagedApplicationDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermManagedApplicationDefinitionConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermManagedApplicationDefinition, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermManagedApplicationDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermManagedApplicationDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermManagedApplicationDefinitionTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermManagedApplicationDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermManagedApplicationDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermManagedApplicationDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermManagedApplicationDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermManagedApplicationDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermManagedApplicationDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermManagedApplicationDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermManagedApplicationDefinitionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermManagedApplicationDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermManagedDisk(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermManagedDisk",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermManagedDiskTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermManagedDiskConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermManagedDisk, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createOption")
    def create_option(self) -> builtins.str:
        return jsii.get(self, "createOption")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskEncryptionSetId")
    def disk_encryption_set_id(self) -> builtins.str:
        return jsii.get(self, "diskEncryptionSetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskIopsReadWrite")
    def disk_iops_read_write(self) -> jsii.Number:
        return jsii.get(self, "diskIopsReadWrite")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskMbpsReadWrite")
    def disk_mbps_read_write(self) -> jsii.Number:
        return jsii.get(self, "diskMbpsReadWrite")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageReferenceId")
    def image_reference_id(self) -> builtins.str:
        return jsii.get(self, "imageReferenceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceResourceId")
    def source_resource_id(self) -> builtins.str:
        return jsii.get(self, "sourceResourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUri")
    def source_uri(self) -> builtins.str:
        return jsii.get(self, "sourceUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountType")
    def storage_account_type(self) -> builtins.str:
        return jsii.get(self, "storageAccountType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermManagedDiskTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermManagedDiskTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermManagedDiskTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermManagedDiskConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class DataAzurermManagedDiskConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermManagedDiskTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermManagedDiskTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermManagedDiskTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermManagedDiskConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermManagedDiskTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermManagedDiskTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermManagedDiskTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermManagementGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermManagementGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: typing.Optional[builtins.str] = None,
        group_id: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermManagementGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param group_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermManagementGroupConfig(
            display_name=display_name,
            group_id=group_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermManagementGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetGroupId")
    def reset_group_id(self) -> None:
        return jsii.invoke(self, "resetGroupId", [])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parentManagementGroupId")
    def parent_management_group_id(self) -> builtins.str:
        return jsii.get(self, "parentManagementGroupId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIds")
    def subscription_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "subscriptionIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupIdInput")
    def group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "groupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermManagementGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupId")
    def group_id(self) -> builtins.str:
        return jsii.get(self, "groupId")

    @group_id.setter # type: ignore
    def group_id(self, value: builtins.str) -> None:
        jsii.set(self, "groupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermManagementGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermManagementGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermManagementGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "group_id": "groupId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermManagementGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: typing.Optional[builtins.str] = None,
        group_id: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermManagementGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param group_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermManagementGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if display_name is not None:
            self._values["display_name"] = display_name
        if group_id is not None:
            self._values["group_id"] = group_id
        if name is not None:
            self._values["name"] = name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("group_id")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermManagementGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermManagementGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermManagementGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermManagementGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermManagementGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMapsAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMapsAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermMapsAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMapsAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMapsAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xMsClientId")
    def x_ms_client_id(self) -> builtins.str:
        return jsii.get(self, "xMsClientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermMapsAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMapsAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMapsAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMapsAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermMapsAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermMapsAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMapsAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMapsAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMapsAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMapsAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMapsAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMapsAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMariadbServer(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMariadbServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMariadbServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMariadbServerConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMariadbServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="storageProfile")
    def storage_profile(
        self,
        index: builtins.str,
    ) -> "DataAzurermMariadbServerStorageProfile":
        """
        :param index: -
        """
        return jsii.invoke(self, "storageProfile", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcement")
    def ssl_enforcement(self) -> builtins.str:
        return jsii.get(self, "sslEnforcement")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermMariadbServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMariadbServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMariadbServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMariadbServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMariadbServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMariadbServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMariadbServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMariadbServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMariadbServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMariadbServerStorageProfile(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMariadbServerStorageProfile",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMariadbServerStorageProfile, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrow")
    def auto_grow(self) -> builtins.str:
        return jsii.get(self, "autoGrow")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDays")
    def backup_retention_days(self) -> jsii.Number:
        return jsii.get(self, "backupRetentionDays")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackup")
    def geo_redundant_backup(self) -> builtins.str:
        return jsii.get(self, "geoRedundantBackup")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMb")
    def storage_mb(self) -> jsii.Number:
        return jsii.get(self, "storageMb")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMariadbServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMariadbServerTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMariadbServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorActionGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorActionGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMonitorActionGroupConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMonitorActionGroup, self, [scope, id, config])

    @jsii.member(jsii_name="armRoleReceiver")
    def arm_role_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupArmRoleReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "armRoleReceiver", [index])

    @jsii.member(jsii_name="automationRunbookReceiver")
    def automation_runbook_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupAutomationRunbookReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "automationRunbookReceiver", [index])

    @jsii.member(jsii_name="azureAppPushReceiver")
    def azure_app_push_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupAzureAppPushReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "azureAppPushReceiver", [index])

    @jsii.member(jsii_name="azureFunctionReceiver")
    def azure_function_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupAzureFunctionReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "azureFunctionReceiver", [index])

    @jsii.member(jsii_name="emailReceiver")
    def email_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupEmailReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "emailReceiver", [index])

    @jsii.member(jsii_name="itsmReceiver")
    def itsm_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupItsmReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "itsmReceiver", [index])

    @jsii.member(jsii_name="logicAppReceiver")
    def logic_app_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupLogicAppReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "logicAppReceiver", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="smsReceiver")
    def sms_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupSmsReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "smsReceiver", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="voiceReceiver")
    def voice_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupVoiceReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "voiceReceiver", [index])

    @jsii.member(jsii_name="webhookReceiver")
    def webhook_receiver(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorActionGroupWebhookReceiver":
        """
        :param index: -
        """
        return jsii.invoke(self, "webhookReceiver", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shortName")
    def short_name(self) -> builtins.str:
        return jsii.get(self, "shortName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermMonitorActionGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMonitorActionGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMonitorActionGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermMonitorActionGroupArmRoleReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupArmRoleReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupArmRoleReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleId")
    def role_id(self) -> builtins.str:
        return jsii.get(self, "roleId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useCommonAlertSchema")
    def use_common_alert_schema(self) -> builtins.bool:
        return jsii.get(self, "useCommonAlertSchema")


class DataAzurermMonitorActionGroupAutomationRunbookReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupAutomationRunbookReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupAutomationRunbookReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationAccountId")
    def automation_account_id(self) -> builtins.str:
        return jsii.get(self, "automationAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isGlobalRunbook")
    def is_global_runbook(self) -> builtins.bool:
        return jsii.get(self, "isGlobalRunbook")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runbookName")
    def runbook_name(self) -> builtins.str:
        return jsii.get(self, "runbookName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceUri")
    def service_uri(self) -> builtins.str:
        return jsii.get(self, "serviceUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useCommonAlertSchema")
    def use_common_alert_schema(self) -> builtins.bool:
        return jsii.get(self, "useCommonAlertSchema")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="webhookResourceId")
    def webhook_resource_id(self) -> builtins.str:
        return jsii.get(self, "webhookResourceId")


class DataAzurermMonitorActionGroupAzureAppPushReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupAzureAppPushReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupAzureAppPushReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddress")
    def email_address(self) -> builtins.str:
        return jsii.get(self, "emailAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


class DataAzurermMonitorActionGroupAzureFunctionReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupAzureFunctionReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupAzureFunctionReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionAppResourceId")
    def function_app_resource_id(self) -> builtins.str:
        return jsii.get(self, "functionAppResourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionName")
    def function_name(self) -> builtins.str:
        return jsii.get(self, "functionName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpTriggerUrl")
    def http_trigger_url(self) -> builtins.str:
        return jsii.get(self, "httpTriggerUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useCommonAlertSchema")
    def use_common_alert_schema(self) -> builtins.bool:
        return jsii.get(self, "useCommonAlertSchema")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorActionGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMonitorActionGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorActionGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMonitorActionGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMonitorActionGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorActionGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorActionGroupEmailReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupEmailReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupEmailReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddress")
    def email_address(self) -> builtins.str:
        return jsii.get(self, "emailAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useCommonAlertSchema")
    def use_common_alert_schema(self) -> builtins.bool:
        return jsii.get(self, "useCommonAlertSchema")


class DataAzurermMonitorActionGroupItsmReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupItsmReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupItsmReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionId")
    def connection_id(self) -> builtins.str:
        return jsii.get(self, "connectionId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="region")
    def region(self) -> builtins.str:
        return jsii.get(self, "region")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ticketConfiguration")
    def ticket_configuration(self) -> builtins.str:
        return jsii.get(self, "ticketConfiguration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")


class DataAzurermMonitorActionGroupLogicAppReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupLogicAppReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupLogicAppReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="callbackUrl")
    def callback_url(self) -> builtins.str:
        return jsii.get(self, "callbackUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceId")
    def resource_id(self) -> builtins.str:
        return jsii.get(self, "resourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useCommonAlertSchema")
    def use_common_alert_schema(self) -> builtins.bool:
        return jsii.get(self, "useCommonAlertSchema")


class DataAzurermMonitorActionGroupSmsReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupSmsReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupSmsReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="countryCode")
    def country_code(self) -> builtins.str:
        return jsii.get(self, "countryCode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="phoneNumber")
    def phone_number(self) -> builtins.str:
        return jsii.get(self, "phoneNumber")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorActionGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMonitorActionGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorActionGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorActionGroupVoiceReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupVoiceReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupVoiceReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="countryCode")
    def country_code(self) -> builtins.str:
        return jsii.get(self, "countryCode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="phoneNumber")
    def phone_number(self) -> builtins.str:
        return jsii.get(self, "phoneNumber")


class DataAzurermMonitorActionGroupWebhookReceiver(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorActionGroupWebhookReceiver",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorActionGroupWebhookReceiver, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceUri")
    def service_uri(self) -> builtins.str:
        return jsii.get(self, "serviceUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useCommonAlertSchema")
    def use_common_alert_schema(self) -> builtins.bool:
        return jsii.get(self, "useCommonAlertSchema")


class DataAzurermMonitorDiagnosticCategories(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorDiagnosticCategories",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        resource_id: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorDiagnosticCategoriesTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param resource_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMonitorDiagnosticCategoriesConfig(
            resource_id=resource_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMonitorDiagnosticCategories, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logs")
    def logs(self) -> typing.List[builtins.str]:
        return jsii.get(self, "logs")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metrics")
    def metrics(self) -> typing.List[builtins.str]:
        return jsii.get(self, "metrics")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceIdInput")
    def resource_id_input(self) -> builtins.str:
        return jsii.get(self, "resourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermMonitorDiagnosticCategoriesTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceId")
    def resource_id(self) -> builtins.str:
        return jsii.get(self, "resourceId")

    @resource_id.setter # type: ignore
    def resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "resourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMonitorDiagnosticCategoriesTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMonitorDiagnosticCategoriesTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorDiagnosticCategoriesConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "resource_id": "resourceId",
        "timeouts": "timeouts",
    },
)
class DataAzurermMonitorDiagnosticCategoriesConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        resource_id: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorDiagnosticCategoriesTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param resource_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMonitorDiagnosticCategoriesTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "resource_id": resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def resource_id(self) -> builtins.str:
        result = self._values.get("resource_id")
        assert result is not None, "Required property 'resource_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermMonitorDiagnosticCategoriesTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorDiagnosticCategoriesConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorDiagnosticCategoriesTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMonitorDiagnosticCategoriesTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorDiagnosticCategoriesTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorLogProfile(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorLogProfile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorLogProfileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMonitorLogProfileConfig(
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMonitorLogProfile, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="retentionPolicy")
    def retention_policy(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorLogProfileRetentionPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "retentionPolicy", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="categories")
    def categories(self) -> typing.List[builtins.str]:
        return jsii.get(self, "categories")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locations")
    def locations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "locations")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusRuleId")
    def servicebus_rule_id(self) -> builtins.str:
        return jsii.get(self, "servicebusRuleId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermMonitorLogProfileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMonitorLogProfileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMonitorLogProfileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorLogProfileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermMonitorLogProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorLogProfileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMonitorLogProfileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMonitorLogProfileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorLogProfileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorLogProfileRetentionPolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorLogProfileRetentionPolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorLogProfileRetentionPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="days")
    def days(self) -> jsii.Number:
        return jsii.get(self, "days")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorLogProfileTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMonitorLogProfileTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorLogProfileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorScheduledQueryRulesAlert(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesAlert",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorScheduledQueryRulesAlertTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMonitorScheduledQueryRulesAlertConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMonitorScheduledQueryRulesAlert, self, [scope, id, config])

    @jsii.member(jsii_name="action")
    def action(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorScheduledQueryRulesAlertAction":
        """
        :param index: -
        """
        return jsii.invoke(self, "action", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="trigger")
    def trigger(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorScheduledQueryRulesAlertTrigger":
        """
        :param index: -
        """
        return jsii.invoke(self, "trigger", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizedResourceIds")
    def authorized_resource_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "authorizedResourceIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceId")
    def data_source_id(self) -> builtins.str:
        return jsii.get(self, "dataSourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> jsii.Number:
        return jsii.get(self, "frequency")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="query")
    def query(self) -> builtins.str:
        return jsii.get(self, "query")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryType")
    def query_type(self) -> builtins.str:
        return jsii.get(self, "queryType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severity")
    def severity(self) -> jsii.Number:
        return jsii.get(self, "severity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throttling")
    def throttling(self) -> jsii.Number:
        return jsii.get(self, "throttling")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeWindow")
    def time_window(self) -> jsii.Number:
        return jsii.get(self, "timeWindow")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermMonitorScheduledQueryRulesAlertTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMonitorScheduledQueryRulesAlertTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermMonitorScheduledQueryRulesAlertTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermMonitorScheduledQueryRulesAlertAction(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesAlertAction",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorScheduledQueryRulesAlertAction, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionGroup")
    def action_group(self) -> typing.List[builtins.str]:
        return jsii.get(self, "actionGroup")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customWebhookPayload")
    def custom_webhook_payload(self) -> builtins.str:
        return jsii.get(self, "customWebhookPayload")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailSubject")
    def email_subject(self) -> builtins.str:
        return jsii.get(self, "emailSubject")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesAlertConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMonitorScheduledQueryRulesAlertConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorScheduledQueryRulesAlertTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMonitorScheduledQueryRulesAlertTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermMonitorScheduledQueryRulesAlertTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorScheduledQueryRulesAlertConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesAlertTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMonitorScheduledQueryRulesAlertTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorScheduledQueryRulesAlertTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorScheduledQueryRulesAlertTrigger(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesAlertTrigger",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorScheduledQueryRulesAlertTrigger, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metricTrigger")
    def metric_trigger(self) -> typing.Any:
        return jsii.get(self, "metricTrigger")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="operator")
    def operator(self) -> builtins.str:
        return jsii.get(self, "operator")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threshold")
    def threshold(self) -> jsii.Number:
        return jsii.get(self, "threshold")


class DataAzurermMonitorScheduledQueryRulesAlertTriggerMetricTrigger(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesAlertTriggerMetricTrigger",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorScheduledQueryRulesAlertTriggerMetricTrigger, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metricColumn")
    def metric_column(self) -> builtins.str:
        return jsii.get(self, "metricColumn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metricTriggerType")
    def metric_trigger_type(self) -> builtins.str:
        return jsii.get(self, "metricTriggerType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="operator")
    def operator(self) -> builtins.str:
        return jsii.get(self, "operator")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threshold")
    def threshold(self) -> jsii.Number:
        return jsii.get(self, "threshold")


class DataAzurermMonitorScheduledQueryRulesLog(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesLog",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorScheduledQueryRulesLogTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMonitorScheduledQueryRulesLogConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMonitorScheduledQueryRulesLog, self, [scope, id, config])

    @jsii.member(jsii_name="criteria")
    def criteria(
        self,
        index: builtins.str,
    ) -> "DataAzurermMonitorScheduledQueryRulesLogCriteria":
        """
        :param index: -
        """
        return jsii.invoke(self, "criteria", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizedResourceIds")
    def authorized_resource_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "authorizedResourceIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceId")
    def data_source_id(self) -> builtins.str:
        return jsii.get(self, "dataSourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermMonitorScheduledQueryRulesLogTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMonitorScheduledQueryRulesLogTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermMonitorScheduledQueryRulesLogTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesLogConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMonitorScheduledQueryRulesLogConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMonitorScheduledQueryRulesLogTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMonitorScheduledQueryRulesLogTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermMonitorScheduledQueryRulesLogTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorScheduledQueryRulesLogConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMonitorScheduledQueryRulesLogCriteria(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesLogCriteria",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorScheduledQueryRulesLogCriteria, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dimension")
    def dimension(self) -> typing.Any:
        return jsii.get(self, "dimension")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metricName")
    def metric_name(self) -> builtins.str:
        return jsii.get(self, "metricName")


class DataAzurermMonitorScheduledQueryRulesLogCriteriaDimension(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesLogCriteriaDimension",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMonitorScheduledQueryRulesLogCriteriaDimension, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="operator")
    def operator(self) -> builtins.str:
        return jsii.get(self, "operator")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="values")
    def values(self) -> typing.List[builtins.str]:
        return jsii.get(self, "values")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMonitorScheduledQueryRulesLogTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMonitorScheduledQueryRulesLogTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMonitorScheduledQueryRulesLogTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMssqlDatabase(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMssqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        server_id: builtins.str,
        timeouts: typing.Optional["DataAzurermMssqlDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param server_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMssqlDatabaseConfig(
            name=name,
            server_id=server_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMssqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="elasticPoolId")
    def elastic_pool_id(self) -> builtins.str:
        return jsii.get(self, "elasticPoolId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGb")
    def max_size_gb(self) -> jsii.Number:
        return jsii.get(self, "maxSizeGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readReplicaCount")
    def read_replica_count(self) -> jsii.Number:
        return jsii.get(self, "readReplicaCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readScale")
    def read_scale(self) -> builtins.bool:
        return jsii.get(self, "readScale")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverIdInput")
    def server_id_input(self) -> builtins.str:
        return jsii.get(self, "serverIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermMssqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverId")
    def server_id(self) -> builtins.str:
        return jsii.get(self, "serverId")

    @server_id.setter # type: ignore
    def server_id(self, value: builtins.str) -> None:
        jsii.set(self, "serverId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMssqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMssqlDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMssqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "server_id": "serverId",
        "timeouts": "timeouts",
    },
)
class DataAzurermMssqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        server_id: builtins.str,
        timeouts: typing.Optional["DataAzurermMssqlDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param server_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMssqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "server_id": server_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def server_id(self) -> builtins.str:
        result = self._values.get("server_id")
        assert result is not None, "Required property 'server_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMssqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMssqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMssqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMssqlDatabaseTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMssqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMssqlElasticpool(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMssqlElasticpool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMssqlElasticpoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMssqlElasticpoolConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMssqlElasticpool, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeBytes")
    def max_size_bytes(self) -> jsii.Number:
        return jsii.get(self, "maxSizeBytes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGb")
    def max_size_gb(self) -> jsii.Number:
        return jsii.get(self, "maxSizeGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="perDbMaxCapacity")
    def per_db_max_capacity(self) -> jsii.Number:
        return jsii.get(self, "perDbMaxCapacity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="perDbMinCapacity")
    def per_db_min_capacity(self) -> jsii.Number:
        return jsii.get(self, "perDbMinCapacity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermMssqlElasticpoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMssqlElasticpoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMssqlElasticpoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMssqlElasticpoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMssqlElasticpoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMssqlElasticpoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMssqlElasticpoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMssqlElasticpoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMssqlElasticpoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMssqlElasticpoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMssqlElasticpoolTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMssqlElasticpoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMssqlServer(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMssqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMssqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMssqlServerConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMssqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermMssqlServerIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fullyQualifiedDomainName")
    def fully_qualified_domain_name(self) -> builtins.str:
        return jsii.get(self, "fullyQualifiedDomainName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorableDroppedDatabaseIds")
    def restorable_dropped_database_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "restorableDroppedDatabaseIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermMssqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMssqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMssqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMssqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMssqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMssqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMssqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMssqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMssqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMssqlServerIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMssqlServerIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMssqlServerIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMssqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMssqlServerTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMssqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMysqlServer(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMysqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMysqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermMysqlServerConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermMysqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermMysqlServerIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="threatDetectionPolicy")
    def threat_detection_policy(
        self,
        index: builtins.str,
    ) -> "DataAzurermMysqlServerThreatDetectionPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "threatDetectionPolicy", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrowEnabled")
    def auto_grow_enabled(self) -> builtins.bool:
        return jsii.get(self, "autoGrowEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDays")
    def backup_retention_days(self) -> jsii.Number:
        return jsii.get(self, "backupRetentionDays")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackupEnabled")
    def geo_redundant_backup_enabled(self) -> builtins.bool:
        return jsii.get(self, "geoRedundantBackupEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="infrastructureEncryptionEnabled")
    def infrastructure_encryption_enabled(self) -> builtins.bool:
        return jsii.get(self, "infrastructureEncryptionEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTime")
    def restore_point_in_time(self) -> builtins.str:
        return jsii.get(self, "restorePointInTime")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementEnabled")
    def ssl_enforcement_enabled(self) -> builtins.bool:
        return jsii.get(self, "sslEnforcementEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslMinimalTlsVersionEnforced")
    def ssl_minimal_tls_version_enforced(self) -> builtins.str:
        return jsii.get(self, "sslMinimalTlsVersionEnforced")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMb")
    def storage_mb(self) -> jsii.Number:
        return jsii.get(self, "storageMb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermMysqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermMysqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermMysqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMysqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermMysqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermMysqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermMysqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermMysqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMysqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermMysqlServerIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMysqlServerIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMysqlServerIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


class DataAzurermMysqlServerThreatDetectionPolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermMysqlServerThreatDetectionPolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermMysqlServerThreatDetectionPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disabledAlerts")
    def disabled_alerts(self) -> typing.List[builtins.str]:
        return jsii.get(self, "disabledAlerts")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAccountAdmins")
    def email_account_admins(self) -> builtins.bool:
        return jsii.get(self, "emailAccountAdmins")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddresses")
    def email_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "emailAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionDays")
    def retention_days(self) -> jsii.Number:
        return jsii.get(self, "retentionDays")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKey")
    def storage_account_access_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageEndpoint")
    def storage_endpoint(self) -> builtins.str:
        return jsii.get(self, "storageEndpoint")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermMysqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermMysqlServerTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermMysqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNatGateway(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNatGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        public_ip_address_ids: typing.Optional[typing.List[builtins.str]] = None,
        public_ip_prefix_ids: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermNatGatewayTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param public_ip_address_ids: -
        :param public_ip_prefix_ids: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNatGatewayConfig(
            name=name,
            resource_group_name=resource_group_name,
            public_ip_address_ids=public_ip_address_ids,
            public_ip_prefix_ids=public_ip_prefix_ids,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNatGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetPublicIpAddressIds")
    def reset_public_ip_address_ids(self) -> None:
        return jsii.invoke(self, "resetPublicIpAddressIds", [])

    @jsii.member(jsii_name="resetPublicIpPrefixIds")
    def reset_public_ip_prefix_ids(self) -> None:
        return jsii.invoke(self, "resetPublicIpPrefixIds", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGuid")
    def resource_guid(self) -> builtins.str:
        return jsii.get(self, "resourceGuid")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressIdsInput")
    def public_ip_address_ids_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "publicIpAddressIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpPrefixIdsInput")
    def public_ip_prefix_ids_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "publicIpPrefixIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNatGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressIds")
    def public_ip_address_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddressIds")

    @public_ip_address_ids.setter # type: ignore
    def public_ip_address_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "publicIpAddressIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpPrefixIds")
    def public_ip_prefix_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpPrefixIds")

    @public_ip_prefix_ids.setter # type: ignore
    def public_ip_prefix_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "publicIpPrefixIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNatGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNatGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNatGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "public_ip_address_ids": "publicIpAddressIds",
        "public_ip_prefix_ids": "publicIpPrefixIds",
        "timeouts": "timeouts",
    },
)
class DataAzurermNatGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        public_ip_address_ids: typing.Optional[typing.List[builtins.str]] = None,
        public_ip_prefix_ids: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermNatGatewayTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param public_ip_address_ids: -
        :param public_ip_prefix_ids: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNatGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if public_ip_address_ids is not None:
            self._values["public_ip_address_ids"] = public_ip_address_ids
        if public_ip_prefix_ids is not None:
            self._values["public_ip_prefix_ids"] = public_ip_prefix_ids
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def public_ip_address_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("public_ip_address_ids")
        return result

    @builtins.property
    def public_ip_prefix_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("public_ip_prefix_ids")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNatGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNatGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNatGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNatGatewayTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNatGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetappAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetappAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetappAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetappAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNetappAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetappAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetappAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetappAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetappAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetappAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetappAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetappPool(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetappPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetappPoolConfig(
            account_name=account_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetappPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceLevel")
    def service_level(self) -> builtins.str:
        return jsii.get(self, "serviceLevel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInTb")
    def size_in_tb(self) -> jsii.Number:
        return jsii.get(self, "sizeInTb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNetappPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetappPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetappPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetappPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetappPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetappPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetappPoolTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetappSnapshot(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetappSnapshot",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        volume_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappSnapshotTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param volume_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetappSnapshotConfig(
            account_name=account_name,
            name=name,
            pool_name=pool_name,
            resource_group_name=resource_group_name,
            volume_name=volume_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetappSnapshot, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolNameInput")
    def pool_name_input(self) -> builtins.str:
        return jsii.get(self, "poolNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="volumeNameInput")
    def volume_name_input(self) -> builtins.str:
        return jsii.get(self, "volumeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNetappSnapshotTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolName")
    def pool_name(self) -> builtins.str:
        return jsii.get(self, "poolName")

    @pool_name.setter # type: ignore
    def pool_name(self, value: builtins.str) -> None:
        jsii.set(self, "poolName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetappSnapshotTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetappSnapshotTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="volumeName")
    def volume_name(self) -> builtins.str:
        return jsii.get(self, "volumeName")

    @volume_name.setter # type: ignore
    def volume_name(self, value: builtins.str) -> None:
        jsii.set(self, "volumeName", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappSnapshotConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "pool_name": "poolName",
        "resource_group_name": "resourceGroupName",
        "volume_name": "volumeName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetappSnapshotConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        volume_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappSnapshotTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param volume_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetappSnapshotTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "pool_name": pool_name,
            "resource_group_name": resource_group_name,
            "volume_name": volume_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def pool_name(self) -> builtins.str:
        result = self._values.get("pool_name")
        assert result is not None, "Required property 'pool_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def volume_name(self) -> builtins.str:
        result = self._values.get("volume_name")
        assert result is not None, "Required property 'volume_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetappSnapshotTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappSnapshotConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappSnapshotTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetappSnapshotTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappSnapshotTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetappVolume(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetappVolume",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappVolumeTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetappVolumeConfig(
            account_name=account_name,
            name=name,
            pool_name=pool_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetappVolume, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mountIpAddresses")
    def mount_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "mountIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolNameInput")
    def pool_name_input(self) -> builtins.str:
        return jsii.get(self, "poolNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocols")
    def protocols(self) -> typing.List[builtins.str]:
        return jsii.get(self, "protocols")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceLevel")
    def service_level(self) -> builtins.str:
        return jsii.get(self, "serviceLevel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageQuotaInGb")
    def storage_quota_in_gb(self) -> jsii.Number:
        return jsii.get(self, "storageQuotaInGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="volumePath")
    def volume_path(self) -> builtins.str:
        return jsii.get(self, "volumePath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNetappVolumeTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolName")
    def pool_name(self) -> builtins.str:
        return jsii.get(self, "poolName")

    @pool_name.setter # type: ignore
    def pool_name(self, value: builtins.str) -> None:
        jsii.set(self, "poolName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetappVolumeTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetappVolumeTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappVolumeConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "name": "name",
        "pool_name": "poolName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetappVolumeConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetappVolumeTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetappVolumeTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "name": name,
            "pool_name": pool_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def pool_name(self) -> builtins.str:
        result = self._values.get("pool_name")
        assert result is not None, "Required property 'pool_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetappVolumeTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappVolumeConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetappVolumeTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetappVolumeTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetappVolumeTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetworkDdosProtectionPlan(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetworkDdosProtectionPlan",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermNetworkDdosProtectionPlanTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetworkDdosProtectionPlanConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetworkDdosProtectionPlan, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkIds")
    def virtual_network_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "virtualNetworkIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermNetworkDdosProtectionPlanTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetworkDdosProtectionPlanTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetworkDdosProtectionPlanTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkDdosProtectionPlanConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetworkDdosProtectionPlanConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermNetworkDdosProtectionPlanTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetworkDdosProtectionPlanTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermNetworkDdosProtectionPlanTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkDdosProtectionPlanConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkDdosProtectionPlanTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetworkDdosProtectionPlanTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkDdosProtectionPlanTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetworkInterface(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetworkInterface",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetworkInterfaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetworkInterfaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetworkInterface, self, [scope, id, config])

    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermNetworkInterfaceIpConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "ipConfiguration", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appliedDnsServers")
    def applied_dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "appliedDnsServers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServers")
    def dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsServers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAcceleratedNetworking")
    def enable_accelerated_networking(self) -> builtins.bool:
        return jsii.get(self, "enableAcceleratedNetworking")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableIpForwarding")
    def enable_ip_forwarding(self) -> builtins.bool:
        return jsii.get(self, "enableIpForwarding")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internalDnsNameLabel")
    def internal_dns_name_label(self) -> builtins.str:
        return jsii.get(self, "internalDnsNameLabel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="macAddress")
    def mac_address(self) -> builtins.str:
        return jsii.get(self, "macAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupId")
    def network_security_group_id(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNetworkInterfaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetworkInterfaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetworkInterfaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkInterfaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetworkInterfaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetworkInterfaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetworkInterfaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetworkInterfaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkInterfaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetworkInterfaceIpConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetworkInterfaceIpConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermNetworkInterfaceIpConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationGatewayBackendAddressPoolsIds")
    def application_gateway_backend_address_pools_ids(
        self,
    ) -> typing.List[builtins.str]:
        return jsii.get(self, "applicationGatewayBackendAddressPoolsIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationSecurityGroupIds")
    def application_security_group_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "applicationSecurityGroupIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerBackendAddressPoolsIds")
    def load_balancer_backend_address_pools_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "loadBalancerBackendAddressPoolsIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerInboundNatRulesIds")
    def load_balancer_inbound_nat_rules_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "loadBalancerInboundNatRulesIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primary")
    def primary(self) -> builtins.bool:
        return jsii.get(self, "primary")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressAllocation")
    def private_ip_address_allocation(self) -> builtins.str:
        return jsii.get(self, "privateIpAddressAllocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressVersion")
    def private_ip_address_version(self) -> builtins.str:
        return jsii.get(self, "privateIpAddressVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressId")
    def public_ip_address_id(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkInterfaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetworkInterfaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkInterfaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetworkSecurityGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetworkSecurityGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetworkSecurityGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetworkSecurityGroupConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetworkSecurityGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="securityRule")
    def security_rule(
        self,
        index: builtins.str,
    ) -> "DataAzurermNetworkSecurityGroupSecurityRule":
        """
        :param index: -
        """
        return jsii.invoke(self, "securityRule", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermNetworkSecurityGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetworkSecurityGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetworkSecurityGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkSecurityGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetworkSecurityGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetworkSecurityGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetworkSecurityGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetworkSecurityGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkSecurityGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetworkSecurityGroupSecurityRule(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetworkSecurityGroupSecurityRule",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermNetworkSecurityGroupSecurityRule, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="access")
    def access(self) -> builtins.str:
        return jsii.get(self, "access")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationAddressPrefix")
    def destination_address_prefix(self) -> builtins.str:
        return jsii.get(self, "destinationAddressPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationAddressPrefixes")
    def destination_address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "destinationAddressPrefixes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationApplicationSecurityGroupIds")
    def destination_application_security_group_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "destinationApplicationSecurityGroupIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationPortRange")
    def destination_port_range(self) -> builtins.str:
        return jsii.get(self, "destinationPortRange")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationPortRanges")
    def destination_port_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "destinationPortRanges")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="direction")
    def direction(self) -> builtins.str:
        return jsii.get(self, "direction")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceAddressPrefix")
    def source_address_prefix(self) -> builtins.str:
        return jsii.get(self, "sourceAddressPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceAddressPrefixes")
    def source_address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "sourceAddressPrefixes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceApplicationSecurityGroupIds")
    def source_application_security_group_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "sourceApplicationSecurityGroupIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePortRange")
    def source_port_range(self) -> builtins.str:
        return jsii.get(self, "sourcePortRange")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePortRanges")
    def source_port_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "sourcePortRanges")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkSecurityGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetworkSecurityGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkSecurityGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetworkServiceTags(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetworkServiceTags",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        service: builtins.str,
        location_filter: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermNetworkServiceTagsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param service: -
        :param location_filter: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetworkServiceTagsConfig(
            location=location,
            service=service,
            location_filter=location_filter,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetworkServiceTags, self, [scope, id, config])

    @jsii.member(jsii_name="resetLocationFilter")
    def reset_location_filter(self) -> None:
        return jsii.invoke(self, "resetLocationFilter", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixes")
    def address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressPrefixes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceInput")
    def service_input(self) -> builtins.str:
        return jsii.get(self, "serviceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationFilterInput")
    def location_filter_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "locationFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermNetworkServiceTagsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationFilter")
    def location_filter(self) -> builtins.str:
        return jsii.get(self, "locationFilter")

    @location_filter.setter # type: ignore
    def location_filter(self, value: builtins.str) -> None:
        jsii.set(self, "locationFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="service")
    def service(self) -> builtins.str:
        return jsii.get(self, "service")

    @service.setter # type: ignore
    def service(self, value: builtins.str) -> None:
        jsii.set(self, "service", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetworkServiceTagsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetworkServiceTagsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkServiceTagsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "service": "service",
        "location_filter": "locationFilter",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetworkServiceTagsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        service: builtins.str,
        location_filter: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermNetworkServiceTagsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param service: -
        :param location_filter: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetworkServiceTagsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "service": service,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if location_filter is not None:
            self._values["location_filter"] = location_filter
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def service(self) -> builtins.str:
        result = self._values.get("service")
        assert result is not None, "Required property 'service' is missing"
        return result

    @builtins.property
    def location_filter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("location_filter")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetworkServiceTagsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkServiceTagsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkServiceTagsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetworkServiceTagsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkServiceTagsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNetworkWatcher(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNetworkWatcher",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetworkWatcherTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNetworkWatcherConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNetworkWatcher, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNetworkWatcherTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNetworkWatcherTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNetworkWatcherTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkWatcherConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNetworkWatcherConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNetworkWatcherTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNetworkWatcherTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNetworkWatcherTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkWatcherConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNetworkWatcherTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNetworkWatcherTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNetworkWatcherTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNotificationHub(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNotificationHub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNotificationHubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNotificationHubConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNotificationHub, self, [scope, id, config])

    @jsii.member(jsii_name="apnsCredential")
    def apns_credential(
        self,
        index: builtins.str,
    ) -> "DataAzurermNotificationHubApnsCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "apnsCredential", [index])

    @jsii.member(jsii_name="gcmCredential")
    def gcm_credential(
        self,
        index: builtins.str,
    ) -> "DataAzurermNotificationHubGcmCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "gcmCredential", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermNotificationHubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNotificationHubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNotificationHubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermNotificationHubApnsCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNotificationHubApnsCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermNotificationHubApnsCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationMode")
    def application_mode(self) -> builtins.str:
        return jsii.get(self, "applicationMode")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bundleId")
    def bundle_id(self) -> builtins.str:
        return jsii.get(self, "bundleId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyId")
    def key_id(self) -> builtins.str:
        return jsii.get(self, "keyId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="teamId")
    def team_id(self) -> builtins.str:
        return jsii.get(self, "teamId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="token")
    def token(self) -> builtins.str:
        return jsii.get(self, "token")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNotificationHubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNotificationHubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNotificationHubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNotificationHubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermNotificationHubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNotificationHubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNotificationHubGcmCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNotificationHubGcmCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermNotificationHubGcmCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiKey")
    def api_key(self) -> builtins.str:
        return jsii.get(self, "apiKey")


class DataAzurermNotificationHubNamespace(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNotificationHubNamespace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNotificationHubNamespaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermNotificationHubNamespaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermNotificationHubNamespace, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="sku")
    def sku(self, index: builtins.str) -> "DataAzurermNotificationHubNamespaceSku":
        """
        :param index: -
        """
        return jsii.invoke(self, "sku", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceType")
    def namespace_type(self) -> builtins.str:
        return jsii.get(self, "namespaceType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusEndpoint")
    def servicebus_endpoint(self) -> builtins.str:
        return jsii.get(self, "servicebusEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermNotificationHubNamespaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermNotificationHubNamespaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermNotificationHubNamespaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNotificationHubNamespaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermNotificationHubNamespaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermNotificationHubNamespaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermNotificationHubNamespaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermNotificationHubNamespaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNotificationHubNamespaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermNotificationHubNamespaceSku(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermNotificationHubNamespaceSku",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermNotificationHubNamespaceSku, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNotificationHubNamespaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNotificationHubNamespaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNotificationHubNamespaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermNotificationHubTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermNotificationHubTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermNotificationHubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPlatformImage(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPlatformImage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        timeouts: typing.Optional["DataAzurermPlatformImageTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param offer: -
        :param publisher: -
        :param sku: -
        :param timeouts: timeouts block.
        :param version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPlatformImageConfig(
            location=location,
            offer=offer,
            publisher=publisher,
            sku=sku,
            timeouts=timeouts,
            version=version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPlatformImage, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVersion")
    def reset_version(self) -> None:
        return jsii.invoke(self, "resetVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offerInput")
    def offer_input(self) -> builtins.str:
        return jsii.get(self, "offerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherInput")
    def publisher_input(self) -> builtins.str:
        return jsii.get(self, "publisherInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermPlatformImageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offer")
    def offer(self) -> builtins.str:
        return jsii.get(self, "offer")

    @offer.setter # type: ignore
    def offer(self, value: builtins.str) -> None:
        jsii.set(self, "offer", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisher")
    def publisher(self) -> builtins.str:
        return jsii.get(self, "publisher")

    @publisher.setter # type: ignore
    def publisher(self, value: builtins.str) -> None:
        jsii.set(self, "publisher", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPlatformImageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPlatformImageTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPlatformImageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "timeouts": "timeouts",
        "version": "version",
    },
)
class DataAzurermPlatformImageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        timeouts: typing.Optional["DataAzurermPlatformImageTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param offer: -
        :param publisher: -
        :param sku: -
        :param timeouts: timeouts block.
        :param version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPlatformImageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPlatformImageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPlatformImageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPlatformImageTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPlatformImageTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPlatformImageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPolicyDefinition(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPolicyDefinition",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: typing.Optional[builtins.str] = None,
        management_group_id: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPolicyDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param management_group_id: -
        :param management_group_name: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPolicyDefinitionConfig(
            display_name=display_name,
            management_group_id=management_group_id,
            management_group_name=management_group_name,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPolicyDefinition, self, [scope, id, config])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetManagementGroupId")
    def reset_management_group_id(self) -> None:
        return jsii.invoke(self, "resetManagementGroupId", [])

    @jsii.member(jsii_name="resetManagementGroupName")
    def reset_management_group_name(self) -> None:
        return jsii.invoke(self, "resetManagementGroupName", [])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> builtins.str:
        return jsii.get(self, "metadata")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> builtins.str:
        return jsii.get(self, "parameters")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyRule")
    def policy_rule(self) -> builtins.str:
        return jsii.get(self, "policyRule")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyType")
    def policy_type(self) -> builtins.str:
        return jsii.get(self, "policyType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupIdInput")
    def management_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupNameInput")
    def management_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managementGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermPolicyDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupId")
    def management_group_id(self) -> builtins.str:
        return jsii.get(self, "managementGroupId")

    @management_group_id.setter # type: ignore
    def management_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "managementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupName")
    def management_group_name(self) -> builtins.str:
        return jsii.get(self, "managementGroupName")

    @management_group_name.setter # type: ignore
    def management_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "managementGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPolicyDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPolicyDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPolicyDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "management_group_id": "managementGroupId",
        "management_group_name": "managementGroupName",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermPolicyDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: typing.Optional[builtins.str] = None,
        management_group_id: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPolicyDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param management_group_id: -
        :param management_group_name: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPolicyDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if display_name is not None:
            self._values["display_name"] = display_name
        if management_group_id is not None:
            self._values["management_group_id"] = management_group_id
        if management_group_name is not None:
            self._values["management_group_name"] = management_group_name
        if name is not None:
            self._values["name"] = name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def management_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("management_group_id")
        return result

    @builtins.property
    def management_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("management_group_name")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPolicyDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPolicyDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPolicyDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPolicyDefinitionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPolicyDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPolicySetDefinition(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPolicySetDefinition",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPolicySetDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param management_group_name: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPolicySetDefinitionConfig(
            display_name=display_name,
            management_group_name=management_group_name,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPolicySetDefinition, self, [scope, id, config])

    @jsii.member(jsii_name="policyDefinitionGroup")
    def policy_definition_group(
        self,
        index: builtins.str,
    ) -> "DataAzurermPolicySetDefinitionPolicyDefinitionGroup":
        """
        :param index: -
        """
        return jsii.invoke(self, "policyDefinitionGroup", [index])

    @jsii.member(jsii_name="policyDefinitionReference")
    def policy_definition_reference(
        self,
        index: builtins.str,
    ) -> "DataAzurermPolicySetDefinitionPolicyDefinitionReference":
        """
        :param index: -
        """
        return jsii.invoke(self, "policyDefinitionReference", [index])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetManagementGroupName")
    def reset_management_group_name(self) -> None:
        return jsii.invoke(self, "resetManagementGroupName", [])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> builtins.str:
        return jsii.get(self, "metadata")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> builtins.str:
        return jsii.get(self, "parameters")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitions")
    def policy_definitions(self) -> builtins.str:
        return jsii.get(self, "policyDefinitions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyType")
    def policy_type(self) -> builtins.str:
        return jsii.get(self, "policyType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupNameInput")
    def management_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managementGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermPolicySetDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupName")
    def management_group_name(self) -> builtins.str:
        return jsii.get(self, "managementGroupName")

    @management_group_name.setter # type: ignore
    def management_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "managementGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPolicySetDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPolicySetDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPolicySetDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "management_group_name": "managementGroupName",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermPolicySetDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPolicySetDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param management_group_name: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPolicySetDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if display_name is not None:
            self._values["display_name"] = display_name
        if management_group_name is not None:
            self._values["management_group_name"] = management_group_name
        if name is not None:
            self._values["name"] = name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def management_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("management_group_name")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPolicySetDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPolicySetDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPolicySetDefinitionPolicyDefinitionGroup(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPolicySetDefinitionPolicyDefinitionGroup",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermPolicySetDefinitionPolicyDefinitionGroup, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalMetadataResourceId")
    def additional_metadata_resource_id(self) -> builtins.str:
        return jsii.get(self, "additionalMetadataResourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="category")
    def category(self) -> builtins.str:
        return jsii.get(self, "category")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


class DataAzurermPolicySetDefinitionPolicyDefinitionReference(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPolicySetDefinitionPolicyDefinitionReference",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermPolicySetDefinitionPolicyDefinitionReference, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Any:
        return jsii.get(self, "parameters")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameterValues")
    def parameter_values(self) -> builtins.str:
        return jsii.get(self, "parameterValues")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionId")
    def policy_definition_id(self) -> builtins.str:
        return jsii.get(self, "policyDefinitionId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyGroupNames")
    def policy_group_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "policyGroupNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="referenceId")
    def reference_id(self) -> builtins.str:
        return jsii.get(self, "referenceId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPolicySetDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPolicySetDefinitionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPolicySetDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPostgresqlServer(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPostgresqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPostgresqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPostgresqlServerConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPostgresqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermPostgresqlServerIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermPostgresqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPostgresqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPostgresqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPostgresqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermPostgresqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPostgresqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPostgresqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPostgresqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPostgresqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPostgresqlServerIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPostgresqlServerIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermPostgresqlServerIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPostgresqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPostgresqlServerTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPostgresqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPrivateDnsZone(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPrivateDnsZone",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPrivateDnsZoneTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPrivateDnsZoneConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPrivateDnsZone, self, [scope, id, config])

    @jsii.member(jsii_name="resetResourceGroupName")
    def reset_resource_group_name(self) -> None:
        return jsii.invoke(self, "resetResourceGroupName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfRecordSets")
    def max_number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfVirtualNetworkLinks")
    def max_number_of_virtual_network_links(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfVirtualNetworkLinks")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfVirtualNetworkLinksWithRegistration")
    def max_number_of_virtual_network_links_with_registration(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfVirtualNetworkLinksWithRegistration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfRecordSets")
    def number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "numberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermPrivateDnsZoneTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPrivateDnsZoneTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPrivateDnsZoneTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateDnsZoneConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermPrivateDnsZoneConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPrivateDnsZoneTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPrivateDnsZoneTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if resource_group_name is not None:
            self._values["resource_group_name"] = resource_group_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_group_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPrivateDnsZoneTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateDnsZoneConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateDnsZoneTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPrivateDnsZoneTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateDnsZoneTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPrivateEndpointConnection(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPrivateEndpointConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPrivateEndpointConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPrivateEndpointConnectionConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPrivateEndpointConnection, self, [scope, id, config])

    @jsii.member(jsii_name="privateServiceConnection")
    def private_service_connection(
        self,
        index: builtins.str,
    ) -> "DataAzurermPrivateEndpointConnectionPrivateServiceConnection":
        """
        :param index: -
        """
        return jsii.invoke(self, "privateServiceConnection", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermPrivateEndpointConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPrivateEndpointConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPrivateEndpointConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateEndpointConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermPrivateEndpointConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPrivateEndpointConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPrivateEndpointConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermPrivateEndpointConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateEndpointConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPrivateEndpointConnectionPrivateServiceConnection(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPrivateEndpointConnectionPrivateServiceConnection",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermPrivateEndpointConnectionPrivateServiceConnection, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestResponse")
    def request_response(self) -> builtins.str:
        return jsii.get(self, "requestResponse")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateEndpointConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPrivateEndpointConnectionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateEndpointConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPrivateLinkService(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPrivateLinkService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPrivateLinkServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPrivateLinkServiceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPrivateLinkService, self, [scope, id, config])

    @jsii.member(jsii_name="natIpConfiguration")
    def nat_ip_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermPrivateLinkServiceNatIpConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "natIpConfiguration", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alias")
    def alias(self) -> builtins.str:
        return jsii.get(self, "alias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoApprovalSubscriptionIds")
    def auto_approval_subscription_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "autoApprovalSubscriptionIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableProxyProtocol")
    def enable_proxy_protocol(self) -> builtins.bool:
        return jsii.get(self, "enableProxyProtocol")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerFrontendIpConfigurationIds")
    def load_balancer_frontend_ip_configuration_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "loadBalancerFrontendIpConfigurationIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="visibilitySubscriptionIds")
    def visibility_subscription_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "visibilitySubscriptionIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermPrivateLinkServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPrivateLinkServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPrivateLinkServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateLinkServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermPrivateLinkServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPrivateLinkServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPrivateLinkServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPrivateLinkServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateLinkServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPrivateLinkServiceEndpointConnections(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPrivateLinkServiceEndpointConnections",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        resource_group_name: builtins.str,
        service_id: builtins.str,
        timeouts: typing.Optional["DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param resource_group_name: -
        :param service_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPrivateLinkServiceEndpointConnectionsConfig(
            resource_group_name=resource_group_name,
            service_id=service_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPrivateLinkServiceEndpointConnections, self, [scope, id, config])

    @jsii.member(jsii_name="privateEndpointConnections")
    def private_endpoint_connections(
        self,
        index: builtins.str,
    ) -> "DataAzurermPrivateLinkServiceEndpointConnectionsPrivateEndpointConnections":
        """
        :param index: -
        """
        return jsii.invoke(self, "privateEndpointConnections", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceIdInput")
    def service_id_input(self) -> builtins.str:
        return jsii.get(self, "serviceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> builtins.str:
        return jsii.get(self, "serviceName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceId")
    def service_id(self) -> builtins.str:
        return jsii.get(self, "serviceId")

    @service_id.setter # type: ignore
    def service_id(self, value: builtins.str) -> None:
        jsii.set(self, "serviceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateLinkServiceEndpointConnectionsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "resource_group_name": "resourceGroupName",
        "service_id": "serviceId",
        "timeouts": "timeouts",
    },
)
class DataAzurermPrivateLinkServiceEndpointConnectionsConfig(
    cdktf.TerraformMetaArguments,
):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        resource_group_name: builtins.str,
        service_id: builtins.str,
        timeouts: typing.Optional["DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param resource_group_name: -
        :param service_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "resource_group_name": resource_group_name,
            "service_id": service_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_id(self) -> builtins.str:
        result = self._values.get("service_id")
        assert result is not None, "Required property 'service_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateLinkServiceEndpointConnectionsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPrivateLinkServiceEndpointConnectionsPrivateEndpointConnections(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPrivateLinkServiceEndpointConnectionsPrivateEndpointConnections",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermPrivateLinkServiceEndpointConnectionsPrivateEndpointConnections, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionRequired")
    def action_required(self) -> builtins.str:
        return jsii.get(self, "actionRequired")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionId")
    def connection_id(self) -> builtins.str:
        return jsii.get(self, "connectionId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionName")
    def connection_name(self) -> builtins.str:
        return jsii.get(self, "connectionName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateEndpointId")
    def private_endpoint_id(self) -> builtins.str:
        return jsii.get(self, "privateEndpointId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateEndpointName")
    def private_endpoint_name(self) -> builtins.str:
        return jsii.get(self, "privateEndpointName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPrivateLinkServiceNatIpConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPrivateLinkServiceNatIpConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermPrivateLinkServiceNatIpConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primary")
    def primary(self) -> builtins.bool:
        return jsii.get(self, "primary")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressVersion")
    def private_ip_address_version(self) -> builtins.str:
        return jsii.get(self, "privateIpAddressVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPrivateLinkServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPrivateLinkServiceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPrivateLinkServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermProximityPlacementGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermProximityPlacementGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermProximityPlacementGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermProximityPlacementGroupConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermProximityPlacementGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermProximityPlacementGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermProximityPlacementGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermProximityPlacementGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermProximityPlacementGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermProximityPlacementGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermProximityPlacementGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermProximityPlacementGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermProximityPlacementGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermProximityPlacementGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermProximityPlacementGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermProximityPlacementGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermProximityPlacementGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPublicIp(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPublicIp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermPublicIpTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPublicIpConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPublicIp, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocationMethod")
    def allocation_method(self) -> builtins.str:
        return jsii.get(self, "allocationMethod")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainNameLabel")
    def domain_name_label(self) -> builtins.str:
        return jsii.get(self, "domainNameLabel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipVersion")
    def ip_version(self) -> builtins.str:
        return jsii.get(self, "ipVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reverseFqdn")
    def reverse_fqdn(self) -> builtins.str:
        return jsii.get(self, "reverseFqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermPublicIpTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPublicIpTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPublicIpTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPublicIpConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class DataAzurermPublicIpConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermPublicIpTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPublicIpTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPublicIpTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPublicIpConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPublicIpPrefix(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPublicIpPrefix",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPublicIpPrefixTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPublicIpPrefixConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPublicIpPrefix, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipPrefix")
    def ip_prefix(self) -> builtins.str:
        return jsii.get(self, "ipPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="prefixLength")
    def prefix_length(self) -> jsii.Number:
        return jsii.get(self, "prefixLength")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermPublicIpPrefixTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPublicIpPrefixTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPublicIpPrefixTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPublicIpPrefixConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class DataAzurermPublicIpPrefixConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermPublicIpPrefixTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPublicIpPrefixTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPublicIpPrefixTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPublicIpPrefixConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPublicIpPrefixTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPublicIpPrefixTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPublicIpPrefixTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPublicIpTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPublicIpTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPublicIpTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPublicIps(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPublicIps",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        resource_group_name: builtins.str,
        allocation_type: typing.Optional[builtins.str] = None,
        attached: typing.Optional[builtins.bool] = None,
        name_prefix: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPublicIpsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param resource_group_name: -
        :param allocation_type: -
        :param attached: -
        :param name_prefix: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermPublicIpsConfig(
            resource_group_name=resource_group_name,
            allocation_type=allocation_type,
            attached=attached,
            name_prefix=name_prefix,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermPublicIps, self, [scope, id, config])

    @jsii.member(jsii_name="publicIps")
    def public_ips(self, index: builtins.str) -> "DataAzurermPublicIpsPublicIps":
        """
        :param index: -
        """
        return jsii.invoke(self, "publicIps", [index])

    @jsii.member(jsii_name="resetAllocationType")
    def reset_allocation_type(self) -> None:
        return jsii.invoke(self, "resetAllocationType", [])

    @jsii.member(jsii_name="resetAttached")
    def reset_attached(self) -> None:
        return jsii.invoke(self, "resetAttached", [])

    @jsii.member(jsii_name="resetNamePrefix")
    def reset_name_prefix(self) -> None:
        return jsii.invoke(self, "resetNamePrefix", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocationTypeInput")
    def allocation_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "allocationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="attachedInput")
    def attached_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "attachedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namePrefixInput")
    def name_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "namePrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermPublicIpsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocationType")
    def allocation_type(self) -> builtins.str:
        return jsii.get(self, "allocationType")

    @allocation_type.setter # type: ignore
    def allocation_type(self, value: builtins.str) -> None:
        jsii.set(self, "allocationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="attached")
    def attached(self) -> builtins.bool:
        return jsii.get(self, "attached")

    @attached.setter # type: ignore
    def attached(self, value: builtins.bool) -> None:
        jsii.set(self, "attached", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namePrefix")
    def name_prefix(self) -> builtins.str:
        return jsii.get(self, "namePrefix")

    @name_prefix.setter # type: ignore
    def name_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "namePrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermPublicIpsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermPublicIpsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPublicIpsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "resource_group_name": "resourceGroupName",
        "allocation_type": "allocationType",
        "attached": "attached",
        "name_prefix": "namePrefix",
        "timeouts": "timeouts",
    },
)
class DataAzurermPublicIpsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        resource_group_name: builtins.str,
        allocation_type: typing.Optional[builtins.str] = None,
        attached: typing.Optional[builtins.bool] = None,
        name_prefix: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermPublicIpsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param resource_group_name: -
        :param allocation_type: -
        :param attached: -
        :param name_prefix: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermPublicIpsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allocation_type is not None:
            self._values["allocation_type"] = allocation_type
        if attached is not None:
            self._values["attached"] = attached
        if name_prefix is not None:
            self._values["name_prefix"] = name_prefix
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def allocation_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("allocation_type")
        return result

    @builtins.property
    def attached(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("attached")
        return result

    @builtins.property
    def name_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name_prefix")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermPublicIpsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPublicIpsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermPublicIpsPublicIps(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermPublicIpsPublicIps",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermPublicIpsPublicIps, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainNameLabel")
    def domain_name_label(self) -> builtins.str:
        return jsii.get(self, "domainNameLabel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermPublicIpsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermPublicIpsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermPublicIpsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRecoveryServicesVault(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRecoveryServicesVault",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRecoveryServicesVaultTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermRecoveryServicesVaultConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermRecoveryServicesVault, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermRecoveryServicesVaultTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermRecoveryServicesVaultTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermRecoveryServicesVaultTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRecoveryServicesVaultConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermRecoveryServicesVaultConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRecoveryServicesVaultTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermRecoveryServicesVaultTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermRecoveryServicesVaultTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRecoveryServicesVaultConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRecoveryServicesVaultTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermRecoveryServicesVaultTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRecoveryServicesVaultTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRedisCache(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRedisCache",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRedisCacheTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermRedisCacheConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermRedisCache, self, [scope, id, config])

    @jsii.member(jsii_name="patchSchedule")
    def patch_schedule(
        self,
        index: builtins.str,
    ) -> "DataAzurermRedisCachePatchSchedule":
        """
        :param index: -
        """
        return jsii.invoke(self, "patchSchedule", [index])

    @jsii.member(jsii_name="redisConfiguration")
    def redis_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermRedisCacheRedisConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "redisConfiguration", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacity")
    def capacity(self) -> jsii.Number:
        return jsii.get(self, "capacity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableNonSslPort")
    def enable_non_ssl_port(self) -> builtins.bool:
        return jsii.get(self, "enableNonSslPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="family")
    def family(self) -> builtins.str:
        return jsii.get(self, "family")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minimumTlsVersion")
    def minimum_tls_version(self) -> builtins.str:
        return jsii.get(self, "minimumTlsVersion")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateStaticIpAddress")
    def private_static_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateStaticIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shardCount")
    def shard_count(self) -> jsii.Number:
        return jsii.get(self, "shardCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslPort")
    def ssl_port(self) -> jsii.Number:
        return jsii.get(self, "sslPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermRedisCacheTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermRedisCacheTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermRedisCacheTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRedisCacheConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class DataAzurermRedisCacheConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRedisCacheTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermRedisCacheTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermRedisCacheTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRedisCacheConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRedisCachePatchSchedule(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRedisCachePatchSchedule",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermRedisCachePatchSchedule, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dayOfWeek")
    def day_of_week(self) -> builtins.str:
        return jsii.get(self, "dayOfWeek")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startHourUtc")
    def start_hour_utc(self) -> jsii.Number:
        return jsii.get(self, "startHourUtc")


class DataAzurermRedisCacheRedisConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRedisCacheRedisConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermRedisCacheRedisConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aofBackupEnabled")
    def aof_backup_enabled(self) -> builtins.bool:
        return jsii.get(self, "aofBackupEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aofStorageConnectionString0")
    def aof_storage_connection_string0(self) -> builtins.str:
        return jsii.get(self, "aofStorageConnectionString0")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aofStorageConnectionString1")
    def aof_storage_connection_string1(self) -> builtins.str:
        return jsii.get(self, "aofStorageConnectionString1")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAuthentication")
    def enable_authentication(self) -> builtins.bool:
        return jsii.get(self, "enableAuthentication")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxclients")
    def maxclients(self) -> jsii.Number:
        return jsii.get(self, "maxclients")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxfragmentationmemoryReserved")
    def maxfragmentationmemory_reserved(self) -> jsii.Number:
        return jsii.get(self, "maxfragmentationmemoryReserved")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxmemoryDelta")
    def maxmemory_delta(self) -> jsii.Number:
        return jsii.get(self, "maxmemoryDelta")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxmemoryPolicy")
    def maxmemory_policy(self) -> builtins.str:
        return jsii.get(self, "maxmemoryPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxmemoryReserved")
    def maxmemory_reserved(self) -> jsii.Number:
        return jsii.get(self, "maxmemoryReserved")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notifyKeyspaceEvents")
    def notify_keyspace_events(self) -> builtins.str:
        return jsii.get(self, "notifyKeyspaceEvents")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rdbBackupEnabled")
    def rdb_backup_enabled(self) -> builtins.bool:
        return jsii.get(self, "rdbBackupEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rdbBackupFrequency")
    def rdb_backup_frequency(self) -> jsii.Number:
        return jsii.get(self, "rdbBackupFrequency")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rdbBackupMaxSnapshotCount")
    def rdb_backup_max_snapshot_count(self) -> jsii.Number:
        return jsii.get(self, "rdbBackupMaxSnapshotCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rdbStorageConnectionString")
    def rdb_storage_connection_string(self) -> builtins.str:
        return jsii.get(self, "rdbStorageConnectionString")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRedisCacheTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermRedisCacheTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRedisCacheTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermResourceGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermResourceGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermResourceGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermResourceGroupConfig(
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermResourceGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermResourceGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermResourceGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermResourceGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermResourceGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermResourceGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermResourceGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermResourceGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermResourceGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermResourceGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermResourceGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermResourceGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermResourceGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermResources(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermResources",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: typing.Optional[builtins.str] = None,
        required_tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermResourcesTimeouts"] = None,
        type: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param required_tags: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param type: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermResourcesConfig(
            name=name,
            required_tags=required_tags,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            type=type,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermResources, self, [scope, id, config])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetRequiredTags")
    def reset_required_tags(self) -> None:
        return jsii.invoke(self, "resetRequiredTags", [])

    @jsii.member(jsii_name="resetResourceGroupName")
    def reset_resource_group_name(self) -> None:
        return jsii.invoke(self, "resetResourceGroupName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetType")
    def reset_type(self) -> None:
        return jsii.invoke(self, "resetType", [])

    @jsii.member(jsii_name="resources")
    def resources(self, index: builtins.str) -> "DataAzurermResourcesResources":
        """
        :param index: -
        """
        return jsii.invoke(self, "resources", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiredTagsInput")
    def required_tags_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "requiredTagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermResourcesTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiredTags")
    def required_tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "requiredTags")

    @required_tags.setter # type: ignore
    def required_tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "requiredTags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermResourcesTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermResourcesTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermResourcesConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "required_tags": "requiredTags",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "type": "type",
    },
)
class DataAzurermResourcesConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: typing.Optional[builtins.str] = None,
        required_tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermResourcesTimeouts"] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param required_tags: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param type: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermResourcesTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if name is not None:
            self._values["name"] = name
        if required_tags is not None:
            self._values["required_tags"] = required_tags
        if resource_group_name is not None:
            self._values["resource_group_name"] = resource_group_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def required_tags(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("required_tags")
        return result

    @builtins.property
    def resource_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_group_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermResourcesTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermResourcesConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermResourcesResources(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermResourcesResources",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermResourcesResources, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Any:
        return jsii.get(self, "tags")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermResourcesTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermResourcesTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermResourcesTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRoleDefinition(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRoleDefinition",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        name: typing.Optional[builtins.str] = None,
        role_definition_id: typing.Optional[builtins.str] = None,
        scope: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermRoleDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param name: -
        :param role_definition_id: -
        :param scope: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermRoleDefinitionConfig(
            name=name,
            role_definition_id=role_definition_id,
            scope=scope,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermRoleDefinition, self, [scope_, id, config])

    @jsii.member(jsii_name="permissions")
    def permissions(
        self,
        index: builtins.str,
    ) -> "DataAzurermRoleDefinitionPermissions":
        """
        :param index: -
        """
        return jsii.invoke(self, "permissions", [index])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetRoleDefinitionId")
    def reset_role_definition_id(self) -> None:
        return jsii.invoke(self, "resetRoleDefinitionId", [])

    @jsii.member(jsii_name="resetScope")
    def reset_scope(self) -> None:
        return jsii.invoke(self, "resetScope", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="assignableScopes")
    def assignable_scopes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "assignableScopes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionIdInput")
    def role_definition_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "roleDefinitionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermRoleDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionId")
    def role_definition_id(self) -> builtins.str:
        return jsii.get(self, "roleDefinitionId")

    @role_definition_id.setter # type: ignore
    def role_definition_id(self, value: builtins.str) -> None:
        jsii.set(self, "roleDefinitionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermRoleDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermRoleDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRoleDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "role_definition_id": "roleDefinitionId",
        "scope": "scope",
        "timeouts": "timeouts",
    },
)
class DataAzurermRoleDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: typing.Optional[builtins.str] = None,
        role_definition_id: typing.Optional[builtins.str] = None,
        scope: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermRoleDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param role_definition_id: -
        :param scope: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermRoleDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if name is not None:
            self._values["name"] = name
        if role_definition_id is not None:
            self._values["role_definition_id"] = role_definition_id
        if scope is not None:
            self._values["scope"] = scope
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def role_definition_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("role_definition_id")
        return result

    @builtins.property
    def scope(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scope")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermRoleDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRoleDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRoleDefinitionPermissions(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRoleDefinitionPermissions",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermRoleDefinitionPermissions, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actions")
    def actions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "actions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataActions")
    def data_actions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dataActions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notActions")
    def not_actions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "notActions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notDataActions")
    def not_data_actions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "notDataActions")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRoleDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermRoleDefinitionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRoleDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRouteFilter(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRouteFilter",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRouteFilterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermRouteFilterConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermRouteFilter, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="rule")
    def rule(self, index: builtins.str) -> "DataAzurermRouteFilterRule":
        """
        :param index: -
        """
        return jsii.invoke(self, "rule", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermRouteFilterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermRouteFilterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermRouteFilterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRouteFilterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermRouteFilterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRouteFilterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermRouteFilterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermRouteFilterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRouteFilterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRouteFilterRule(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRouteFilterRule",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermRouteFilterRule, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="access")
    def access(self) -> builtins.str:
        return jsii.get(self, "access")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="communities")
    def communities(self) -> typing.List[builtins.str]:
        return jsii.get(self, "communities")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleType")
    def rule_type(self) -> builtins.str:
        return jsii.get(self, "ruleType")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRouteFilterTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermRouteFilterTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRouteFilterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRouteTable(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRouteTable",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRouteTableTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermRouteTableConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermRouteTable, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="route")
    def route(self, index: builtins.str) -> "DataAzurermRouteTableRoute":
        """
        :param index: -
        """
        return jsii.invoke(self, "route", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnets")
    def subnets(self) -> typing.List[builtins.str]:
        return jsii.get(self, "subnets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermRouteTableTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermRouteTableTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermRouteTableTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRouteTableConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermRouteTableConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermRouteTableTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermRouteTableTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermRouteTableTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRouteTableConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermRouteTableRoute(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermRouteTableRoute",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermRouteTableRoute, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefix")
    def address_prefix(self) -> builtins.str:
        return jsii.get(self, "addressPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nextHopInIpAddress")
    def next_hop_in_ip_address(self) -> builtins.str:
        return jsii.get(self, "nextHopInIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nextHopType")
    def next_hop_type(self) -> builtins.str:
        return jsii.get(self, "nextHopType")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermRouteTableTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermRouteTableTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermRouteTableTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSentinelAlertRule(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSentinelAlertRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermSentinelAlertRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param log_analytics_workspace_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSentinelAlertRuleConfig(
            log_analytics_workspace_id=log_analytics_workspace_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSentinelAlertRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceIdInput")
    def log_analytics_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSentinelAlertRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceId")
    def log_analytics_workspace_id(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceId")

    @log_analytics_workspace_id.setter # type: ignore
    def log_analytics_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "logAnalyticsWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSentinelAlertRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSentinelAlertRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSentinelAlertRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermSentinelAlertRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermSentinelAlertRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param log_analytics_workspace_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSentinelAlertRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSentinelAlertRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSentinelAlertRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSentinelAlertRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSentinelAlertRuleTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSentinelAlertRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermServicebusNamespace(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermServicebusNamespace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusNamespaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermServicebusNamespaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermServicebusNamespace, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacity")
    def capacity(self) -> jsii.Number:
        return jsii.get(self, "capacity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryConnectionString")
    def default_primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryKey")
    def default_primary_key(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryConnectionString")
    def default_secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryKey")
    def default_secondary_key(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermServicebusNamespaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermServicebusNamespaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermServicebusNamespaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermServicebusNamespaceAuthorizationRule(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermServicebusNamespaceAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusNamespaceAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermServicebusNamespaceAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermServicebusNamespaceAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermServicebusNamespaceAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermServicebusNamespaceAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermServicebusNamespaceAuthorizationRuleTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusNamespaceAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermServicebusNamespaceAuthorizationRuleConfig(
    cdktf.TerraformMetaArguments,
):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusNamespaceAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermServicebusNamespaceAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermServicebusNamespaceAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusNamespaceAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusNamespaceAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermServicebusNamespaceAuthorizationRuleTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusNamespaceAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusNamespaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermServicebusNamespaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusNamespaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermServicebusNamespaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermServicebusNamespaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusNamespaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusNamespaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermServicebusNamespaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusNamespaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermServicebusQueueAuthorizationRule(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermServicebusQueueAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        queue_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusQueueAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param queue_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermServicebusQueueAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            queue_name=queue_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermServicebusQueueAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queueNameInput")
    def queue_name_input(self) -> builtins.str:
        return jsii.get(self, "queueNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermServicebusQueueAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queueName")
    def queue_name(self) -> builtins.str:
        return jsii.get(self, "queueName")

    @queue_name.setter # type: ignore
    def queue_name(self, value: builtins.str) -> None:
        jsii.set(self, "queueName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermServicebusQueueAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermServicebusQueueAuthorizationRuleTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusQueueAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "queue_name": "queueName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermServicebusQueueAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        queue_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusQueueAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param queue_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermServicebusQueueAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "queue_name": queue_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def queue_name(self) -> builtins.str:
        result = self._values.get("queue_name")
        assert result is not None, "Required property 'queue_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermServicebusQueueAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusQueueAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusQueueAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermServicebusQueueAuthorizationRuleTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusQueueAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermServicebusSubscription(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermServicebusSubscription",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusSubscriptionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermServicebusSubscriptionConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            topic_name=topic_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermServicebusSubscription, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoDeleteOnIdle")
    def auto_delete_on_idle(self) -> builtins.str:
        return jsii.get(self, "autoDeleteOnIdle")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnFilterEvaluationError")
    def dead_lettering_on_filter_evaluation_error(self) -> builtins.bool:
        return jsii.get(self, "deadLetteringOnFilterEvaluationError")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnMessageExpiration")
    def dead_lettering_on_message_expiration(self) -> builtins.bool:
        return jsii.get(self, "deadLetteringOnMessageExpiration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultMessageTtl")
    def default_message_ttl(self) -> builtins.str:
        return jsii.get(self, "defaultMessageTtl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBatchedOperations")
    def enable_batched_operations(self) -> builtins.bool:
        return jsii.get(self, "enableBatchedOperations")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardDeadLetteredMessagesTo")
    def forward_dead_lettered_messages_to(self) -> builtins.str:
        return jsii.get(self, "forwardDeadLetteredMessagesTo")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardTo")
    def forward_to(self) -> builtins.str:
        return jsii.get(self, "forwardTo")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockDuration")
    def lock_duration(self) -> builtins.str:
        return jsii.get(self, "lockDuration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxDeliveryCount")
    def max_delivery_count(self) -> jsii.Number:
        return jsii.get(self, "maxDeliveryCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresSession")
    def requires_session(self) -> builtins.bool:
        return jsii.get(self, "requiresSession")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicNameInput")
    def topic_name_input(self) -> builtins.str:
        return jsii.get(self, "topicNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermServicebusSubscriptionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermServicebusSubscriptionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermServicebusSubscriptionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicName")
    def topic_name(self) -> builtins.str:
        return jsii.get(self, "topicName")

    @topic_name.setter # type: ignore
    def topic_name(self, value: builtins.str) -> None:
        jsii.set(self, "topicName", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusSubscriptionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "topic_name": "topicName",
        "timeouts": "timeouts",
    },
)
class DataAzurermServicebusSubscriptionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusSubscriptionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermServicebusSubscriptionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
            "topic_name": topic_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def topic_name(self) -> builtins.str:
        result = self._values.get("topic_name")
        assert result is not None, "Required property 'topic_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermServicebusSubscriptionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusSubscriptionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusSubscriptionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermServicebusSubscriptionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusSubscriptionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermServicebusTopicAuthorizationRule(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermServicebusTopicAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusTopicAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermServicebusTopicAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            topic_name=topic_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermServicebusTopicAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicNameInput")
    def topic_name_input(self) -> builtins.str:
        return jsii.get(self, "topicNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermServicebusTopicAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermServicebusTopicAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermServicebusTopicAuthorizationRuleTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicName")
    def topic_name(self) -> builtins.str:
        return jsii.get(self, "topicName")

    @topic_name.setter # type: ignore
    def topic_name(self, value: builtins.str) -> None:
        jsii.set(self, "topicName", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusTopicAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "topic_name": "topicName",
        "timeouts": "timeouts",
    },
)
class DataAzurermServicebusTopicAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        timeouts: typing.Optional["DataAzurermServicebusTopicAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermServicebusTopicAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
            "topic_name": topic_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def topic_name(self) -> builtins.str:
        result = self._values.get("topic_name")
        assert result is not None, "Required property 'topic_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermServicebusTopicAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusTopicAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermServicebusTopicAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermServicebusTopicAuthorizationRuleTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermServicebusTopicAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSharedImage(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        gallery_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSharedImageTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param gallery_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSharedImageConfig(
            gallery_name=gallery_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSharedImage, self, [scope, id, config])

    @jsii.member(jsii_name="identifier")
    def identifier(self, index: builtins.str) -> "DataAzurermSharedImageIdentifier":
        """
        :param index: -
        """
        return jsii.invoke(self, "identifier", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eula")
    def eula(self) -> builtins.str:
        return jsii.get(self, "eula")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryNameInput")
    def gallery_name_input(self) -> builtins.str:
        return jsii.get(self, "galleryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hyperVGeneration")
    def hyper_v_generation(self) -> builtins.str:
        return jsii.get(self, "hyperVGeneration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privacyStatementUri")
    def privacy_statement_uri(self) -> builtins.str:
        return jsii.get(self, "privacyStatementUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="releaseNoteUri")
    def release_note_uri(self) -> builtins.str:
        return jsii.get(self, "releaseNoteUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="specialized")
    def specialized(self) -> builtins.bool:
        return jsii.get(self, "specialized")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSharedImageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryName")
    def gallery_name(self) -> builtins.str:
        return jsii.get(self, "galleryName")

    @gallery_name.setter # type: ignore
    def gallery_name(self, value: builtins.str) -> None:
        jsii.set(self, "galleryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSharedImageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSharedImageTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "gallery_name": "galleryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSharedImageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        gallery_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSharedImageTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param gallery_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSharedImageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "gallery_name": gallery_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def gallery_name(self) -> builtins.str:
        result = self._values.get("gallery_name")
        assert result is not None, "Required property 'gallery_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSharedImageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSharedImageGallery(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImageGallery",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSharedImageGalleryTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSharedImageGalleryConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSharedImageGallery, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueName")
    def unique_name(self) -> builtins.str:
        return jsii.get(self, "uniqueName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermSharedImageGalleryTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSharedImageGalleryTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSharedImageGalleryTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageGalleryConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSharedImageGalleryConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSharedImageGalleryTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSharedImageGalleryTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSharedImageGalleryTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageGalleryConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageGalleryTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSharedImageGalleryTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageGalleryTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSharedImageIdentifier(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImageIdentifier",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSharedImageIdentifier, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offer")
    def offer(self) -> builtins.str:
        return jsii.get(self, "offer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisher")
    def publisher(self) -> builtins.str:
        return jsii.get(self, "publisher")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSharedImageTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSharedImageVersion(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImageVersion",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        gallery_name: builtins.str,
        image_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSharedImageVersionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param gallery_name: -
        :param image_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSharedImageVersionConfig(
            gallery_name=gallery_name,
            image_name=image_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSharedImageVersion, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="targetRegion")
    def target_region(
        self,
        index: builtins.str,
    ) -> "DataAzurermSharedImageVersionTargetRegion":
        """
        :param index: -
        """
        return jsii.invoke(self, "targetRegion", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="excludeFromLatest")
    def exclude_from_latest(self) -> builtins.bool:
        return jsii.get(self, "excludeFromLatest")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryNameInput")
    def gallery_name_input(self) -> builtins.str:
        return jsii.get(self, "galleryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageNameInput")
    def image_name_input(self) -> builtins.str:
        return jsii.get(self, "imageNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedImageId")
    def managed_image_id(self) -> builtins.str:
        return jsii.get(self, "managedImageId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskImageSizeGb")
    def os_disk_image_size_gb(self) -> jsii.Number:
        return jsii.get(self, "osDiskImageSizeGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskSnapshotId")
    def os_disk_snapshot_id(self) -> builtins.str:
        return jsii.get(self, "osDiskSnapshotId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermSharedImageVersionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryName")
    def gallery_name(self) -> builtins.str:
        return jsii.get(self, "galleryName")

    @gallery_name.setter # type: ignore
    def gallery_name(self, value: builtins.str) -> None:
        jsii.set(self, "galleryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageName")
    def image_name(self) -> builtins.str:
        return jsii.get(self, "imageName")

    @image_name.setter # type: ignore
    def image_name(self, value: builtins.str) -> None:
        jsii.set(self, "imageName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSharedImageVersionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSharedImageVersionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageVersionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "gallery_name": "galleryName",
        "image_name": "imageName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSharedImageVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        gallery_name: builtins.str,
        image_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSharedImageVersionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param gallery_name: -
        :param image_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSharedImageVersionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "gallery_name": gallery_name,
            "image_name": image_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def gallery_name(self) -> builtins.str:
        result = self._values.get("gallery_name")
        assert result is not None, "Required property 'gallery_name' is missing"
        return result

    @builtins.property
    def image_name(self) -> builtins.str:
        result = self._values.get("image_name")
        assert result is not None, "Required property 'image_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSharedImageVersionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageVersionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSharedImageVersionTargetRegion(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImageVersionTargetRegion",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSharedImageVersionTargetRegion, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="regionalReplicaCount")
    def regional_replica_count(self) -> jsii.Number:
        return jsii.get(self, "regionalReplicaCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountType")
    def storage_account_type(self) -> builtins.str:
        return jsii.get(self, "storageAccountType")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageVersionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSharedImageVersionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageVersionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSharedImageVersions(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImageVersions",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        gallery_name: builtins.str,
        image_name: builtins.str,
        resource_group_name: builtins.str,
        tags_filter: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermSharedImageVersionsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param gallery_name: -
        :param image_name: -
        :param resource_group_name: -
        :param tags_filter: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSharedImageVersionsConfig(
            gallery_name=gallery_name,
            image_name=image_name,
            resource_group_name=resource_group_name,
            tags_filter=tags_filter,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSharedImageVersions, self, [scope, id, config])

    @jsii.member(jsii_name="images")
    def images(self, index: builtins.str) -> "DataAzurermSharedImageVersionsImages":
        """
        :param index: -
        """
        return jsii.invoke(self, "images", [index])

    @jsii.member(jsii_name="resetTagsFilter")
    def reset_tags_filter(self) -> None:
        return jsii.invoke(self, "resetTagsFilter", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryNameInput")
    def gallery_name_input(self) -> builtins.str:
        return jsii.get(self, "galleryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageNameInput")
    def image_name_input(self) -> builtins.str:
        return jsii.get(self, "imageNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsFilterInput")
    def tags_filter_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermSharedImageVersionsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryName")
    def gallery_name(self) -> builtins.str:
        return jsii.get(self, "galleryName")

    @gallery_name.setter # type: ignore
    def gallery_name(self, value: builtins.str) -> None:
        jsii.set(self, "galleryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageName")
    def image_name(self) -> builtins.str:
        return jsii.get(self, "imageName")

    @image_name.setter # type: ignore
    def image_name(self, value: builtins.str) -> None:
        jsii.set(self, "imageName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsFilter")
    def tags_filter(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tagsFilter")

    @tags_filter.setter # type: ignore
    def tags_filter(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tagsFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSharedImageVersionsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSharedImageVersionsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageVersionsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "gallery_name": "galleryName",
        "image_name": "imageName",
        "resource_group_name": "resourceGroupName",
        "tags_filter": "tagsFilter",
        "timeouts": "timeouts",
    },
)
class DataAzurermSharedImageVersionsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        gallery_name: builtins.str,
        image_name: builtins.str,
        resource_group_name: builtins.str,
        tags_filter: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermSharedImageVersionsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param gallery_name: -
        :param image_name: -
        :param resource_group_name: -
        :param tags_filter: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSharedImageVersionsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "gallery_name": gallery_name,
            "image_name": image_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags_filter is not None:
            self._values["tags_filter"] = tags_filter
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def gallery_name(self) -> builtins.str:
        result = self._values.get("gallery_name")
        assert result is not None, "Required property 'gallery_name' is missing"
        return result

    @builtins.property
    def image_name(self) -> builtins.str:
        result = self._values.get("image_name")
        assert result is not None, "Required property 'image_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags_filter(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags_filter")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSharedImageVersionsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageVersionsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSharedImageVersionsImages(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImageVersionsImages",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSharedImageVersionsImages, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="excludeFromLatest")
    def exclude_from_latest(self) -> builtins.bool:
        return jsii.get(self, "excludeFromLatest")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedImageId")
    def managed_image_id(self) -> builtins.str:
        return jsii.get(self, "managedImageId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Any:
        return jsii.get(self, "tags")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRegion")
    def target_region(self) -> typing.Any:
        return jsii.get(self, "targetRegion")


class DataAzurermSharedImageVersionsImagesTargetRegion(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSharedImageVersionsImagesTargetRegion",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSharedImageVersionsImagesTargetRegion, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="regionalReplicaCount")
    def regional_replica_count(self) -> jsii.Number:
        return jsii.get(self, "regionalReplicaCount")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountType")
    def storage_account_type(self) -> builtins.str:
        return jsii.get(self, "storageAccountType")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSharedImageVersionsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSharedImageVersionsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSharedImageVersionsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSignalrService(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSignalrService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSignalrServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSignalrServiceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSignalrService, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicPort")
    def public_port(self) -> jsii.Number:
        return jsii.get(self, "publicPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverPort")
    def server_port(self) -> jsii.Number:
        return jsii.get(self, "serverPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSignalrServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSignalrServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSignalrServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSignalrServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSignalrServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSignalrServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSignalrServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSignalrServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSignalrServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSignalrServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSignalrServiceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSignalrServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSnapshot(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSnapshot",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSnapshotTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSnapshotConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSnapshot, self, [scope, id, config])

    @jsii.member(jsii_name="encryptionSettings")
    def encryption_settings(
        self,
        index: builtins.str,
    ) -> "DataAzurermSnapshotEncryptionSettings":
        """
        :param index: -
        """
        return jsii.invoke(self, "encryptionSettings", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationOption")
    def creation_option(self) -> builtins.str:
        return jsii.get(self, "creationOption")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceResourceId")
    def source_resource_id(self) -> builtins.str:
        return jsii.get(self, "sourceResourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUri")
    def source_uri(self) -> builtins.str:
        return jsii.get(self, "sourceUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeCreated")
    def time_created(self) -> builtins.str:
        return jsii.get(self, "timeCreated")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSnapshotTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSnapshotTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSnapshotTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSnapshotConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSnapshotConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSnapshotTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSnapshotTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSnapshotTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSnapshotConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSnapshotEncryptionSettings(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSnapshotEncryptionSettings",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSnapshotEncryptionSettings, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskEncryptionKey")
    def disk_encryption_key(self) -> typing.Any:
        return jsii.get(self, "diskEncryptionKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyEncryptionKey")
    def key_encryption_key(self) -> typing.Any:
        return jsii.get(self, "keyEncryptionKey")


class DataAzurermSnapshotEncryptionSettingsDiskEncryptionKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSnapshotEncryptionSettingsDiskEncryptionKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSnapshotEncryptionSettingsDiskEncryptionKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretUrl")
    def secret_url(self) -> builtins.str:
        return jsii.get(self, "secretUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVaultId")
    def source_vault_id(self) -> builtins.str:
        return jsii.get(self, "sourceVaultId")


class DataAzurermSnapshotEncryptionSettingsKeyEncryptionKey(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSnapshotEncryptionSettingsKeyEncryptionKey",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSnapshotEncryptionSettingsKeyEncryptionKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyUrl")
    def key_url(self) -> builtins.str:
        return jsii.get(self, "keyUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVaultId")
    def source_vault_id(self) -> builtins.str:
        return jsii.get(self, "sourceVaultId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSnapshotTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSnapshotTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSnapshotTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSpringCloudService(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSpringCloudService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSpringCloudServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSpringCloudServiceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSpringCloudService, self, [scope, id, config])

    @jsii.member(jsii_name="configServerGitSetting")
    def config_server_git_setting(
        self,
        index: builtins.str,
    ) -> "DataAzurermSpringCloudServiceConfigServerGitSetting":
        """
        :param index: -
        """
        return jsii.invoke(self, "configServerGitSetting", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundPublicIpAddresses")
    def outbound_public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "outboundPublicIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermSpringCloudServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSpringCloudServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSpringCloudServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSpringCloudServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSpringCloudServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSpringCloudServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSpringCloudServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSpringCloudServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSpringCloudServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSpringCloudServiceConfigServerGitSetting(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSpringCloudServiceConfigServerGitSetting",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSpringCloudServiceConfigServerGitSetting, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpBasicAuth")
    def http_basic_auth(self) -> typing.Any:
        return jsii.get(self, "httpBasicAuth")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="label")
    def label(self) -> builtins.str:
        return jsii.get(self, "label")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="repository")
    def repository(self) -> typing.Any:
        return jsii.get(self, "repository")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="searchPaths")
    def search_paths(self) -> typing.List[builtins.str]:
        return jsii.get(self, "searchPaths")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshAuth")
    def ssh_auth(self) -> typing.Any:
        return jsii.get(self, "sshAuth")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uri")
    def uri(self) -> builtins.str:
        return jsii.get(self, "uri")


class DataAzurermSpringCloudServiceConfigServerGitSettingHttpBasicAuth(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSpringCloudServiceConfigServerGitSettingHttpBasicAuth",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSpringCloudServiceConfigServerGitSettingHttpBasicAuth, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class DataAzurermSpringCloudServiceConfigServerGitSettingRepository(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSpringCloudServiceConfigServerGitSettingRepository",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSpringCloudServiceConfigServerGitSettingRepository, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpBasicAuth")
    def http_basic_auth(self) -> typing.Any:
        return jsii.get(self, "httpBasicAuth")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="label")
    def label(self) -> builtins.str:
        return jsii.get(self, "label")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pattern")
    def pattern(self) -> typing.List[builtins.str]:
        return jsii.get(self, "pattern")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="searchPaths")
    def search_paths(self) -> typing.List[builtins.str]:
        return jsii.get(self, "searchPaths")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshAuth")
    def ssh_auth(self) -> typing.Any:
        return jsii.get(self, "sshAuth")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uri")
    def uri(self) -> builtins.str:
        return jsii.get(self, "uri")


class DataAzurermSpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class DataAzurermSpringCloudServiceConfigServerGitSettingRepositorySshAuth(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSpringCloudServiceConfigServerGitSettingRepositorySshAuth",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSpringCloudServiceConfigServerGitSettingRepositorySshAuth, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostKey")
    def host_key(self) -> builtins.str:
        return jsii.get(self, "hostKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostKeyAlgorithm")
    def host_key_algorithm(self) -> builtins.str:
        return jsii.get(self, "hostKeyAlgorithm")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateKey")
    def private_key(self) -> builtins.str:
        return jsii.get(self, "privateKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="strictHostKeyCheckingEnabled")
    def strict_host_key_checking_enabled(self) -> builtins.bool:
        return jsii.get(self, "strictHostKeyCheckingEnabled")


class DataAzurermSpringCloudServiceConfigServerGitSettingSshAuth(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSpringCloudServiceConfigServerGitSettingSshAuth",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSpringCloudServiceConfigServerGitSettingSshAuth, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostKey")
    def host_key(self) -> builtins.str:
        return jsii.get(self, "hostKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostKeyAlgorithm")
    def host_key_algorithm(self) -> builtins.str:
        return jsii.get(self, "hostKeyAlgorithm")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateKey")
    def private_key(self) -> builtins.str:
        return jsii.get(self, "privateKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="strictHostKeyCheckingEnabled")
    def strict_host_key_checking_enabled(self) -> builtins.bool:
        return jsii.get(self, "strictHostKeyCheckingEnabled")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSpringCloudServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSpringCloudServiceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSpringCloudServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSqlDatabase(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermSqlDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSqlDatabaseConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryLocation")
    def default_secondary_location(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="edition")
    def edition(self) -> builtins.str:
        return jsii.get(self, "edition")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="elasticPoolName")
    def elastic_pool_name(self) -> builtins.str:
        return jsii.get(self, "elasticPoolName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="failoverGroupId")
    def failover_group_id(self) -> builtins.str:
        return jsii.get(self, "failoverGroupId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readScale")
    def read_scale(self) -> builtins.bool:
        return jsii.get(self, "readScale")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSqlDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermSqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermSqlDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSqlDatabaseTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSqlServer(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSqlServerConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermSqlServerIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSqlServerIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSqlServerIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSqlServerIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSqlServerTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageAccount(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        min_tls_version: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermStorageAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param min_tls_version: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            min_tls_version=min_tls_version,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageAccount, self, [scope, id, config])

    @jsii.member(jsii_name="customDomain")
    def custom_domain(
        self,
        index: builtins.str,
    ) -> "DataAzurermStorageAccountCustomDomain":
        """
        :param index: -
        """
        return jsii.invoke(self, "customDomain", [index])

    @jsii.member(jsii_name="resetMinTlsVersion")
    def reset_min_tls_version(self) -> None:
        return jsii.invoke(self, "resetMinTlsVersion", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessTier")
    def access_tier(self) -> builtins.str:
        return jsii.get(self, "accessTier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountKind")
    def account_kind(self) -> builtins.str:
        return jsii.get(self, "accountKind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountReplicationType")
    def account_replication_type(self) -> builtins.str:
        return jsii.get(self, "accountReplicationType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountTier")
    def account_tier(self) -> builtins.str:
        return jsii.get(self, "accountTier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowBlobPublicAccess")
    def allow_blob_public_access(self) -> builtins.bool:
        return jsii.get(self, "allowBlobPublicAccess")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableHttpsTrafficOnly")
    def enable_https_traffic_only(self) -> builtins.bool:
        return jsii.get(self, "enableHttpsTrafficOnly")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isHnsEnabled")
    def is_hns_enabled(self) -> builtins.bool:
        return jsii.get(self, "isHnsEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryBlobConnectionString")
    def primary_blob_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryBlobConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryBlobEndpoint")
    def primary_blob_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryBlobEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryBlobHost")
    def primary_blob_host(self) -> builtins.str:
        return jsii.get(self, "primaryBlobHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryDfsEndpoint")
    def primary_dfs_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryDfsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryDfsHost")
    def primary_dfs_host(self) -> builtins.str:
        return jsii.get(self, "primaryDfsHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryFileEndpoint")
    def primary_file_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryFileEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryFileHost")
    def primary_file_host(self) -> builtins.str:
        return jsii.get(self, "primaryFileHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryLocation")
    def primary_location(self) -> builtins.str:
        return jsii.get(self, "primaryLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryQueueEndpoint")
    def primary_queue_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryQueueEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryQueueHost")
    def primary_queue_host(self) -> builtins.str:
        return jsii.get(self, "primaryQueueHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryTableEndpoint")
    def primary_table_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryTableEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryTableHost")
    def primary_table_host(self) -> builtins.str:
        return jsii.get(self, "primaryTableHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryWebEndpoint")
    def primary_web_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryWebEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryWebHost")
    def primary_web_host(self) -> builtins.str:
        return jsii.get(self, "primaryWebHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryBlobConnectionString")
    def secondary_blob_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryBlobConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryBlobEndpoint")
    def secondary_blob_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryBlobEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryBlobHost")
    def secondary_blob_host(self) -> builtins.str:
        return jsii.get(self, "secondaryBlobHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryDfsEndpoint")
    def secondary_dfs_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryDfsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryDfsHost")
    def secondary_dfs_host(self) -> builtins.str:
        return jsii.get(self, "secondaryDfsHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryFileEndpoint")
    def secondary_file_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryFileEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryFileHost")
    def secondary_file_host(self) -> builtins.str:
        return jsii.get(self, "secondaryFileHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryLocation")
    def secondary_location(self) -> builtins.str:
        return jsii.get(self, "secondaryLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryQueueEndpoint")
    def secondary_queue_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryQueueEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryQueueHost")
    def secondary_queue_host(self) -> builtins.str:
        return jsii.get(self, "secondaryQueueHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryTableEndpoint")
    def secondary_table_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryTableEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryTableHost")
    def secondary_table_host(self) -> builtins.str:
        return jsii.get(self, "secondaryTableHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryWebEndpoint")
    def secondary_web_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryWebEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryWebHost")
    def secondary_web_host(self) -> builtins.str:
        return jsii.get(self, "secondaryWebHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersionInput")
    def min_tls_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "minTlsVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermStorageAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersion")
    def min_tls_version(self) -> builtins.str:
        return jsii.get(self, "minTlsVersion")

    @min_tls_version.setter # type: ignore
    def min_tls_version(self, value: builtins.str) -> None:
        jsii.set(self, "minTlsVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStorageAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermStorageAccountBlobContainerSas(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageAccountBlobContainerSas",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        container_name: builtins.str,
        expiry: builtins.str,
        permissions: typing.List["DataAzurermStorageAccountBlobContainerSasPermissions"],
        start: builtins.str,
        cache_control: typing.Optional[builtins.str] = None,
        content_disposition: typing.Optional[builtins.str] = None,
        content_encoding: typing.Optional[builtins.str] = None,
        content_language: typing.Optional[builtins.str] = None,
        content_type: typing.Optional[builtins.str] = None,
        https_only: typing.Optional[builtins.bool] = None,
        ip_address: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermStorageAccountBlobContainerSasTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param container_name: -
        :param expiry: -
        :param permissions: permissions block.
        :param start: -
        :param cache_control: -
        :param content_disposition: -
        :param content_encoding: -
        :param content_language: -
        :param content_type: -
        :param https_only: -
        :param ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageAccountBlobContainerSasConfig(
            connection_string=connection_string,
            container_name=container_name,
            expiry=expiry,
            permissions=permissions,
            start=start,
            cache_control=cache_control,
            content_disposition=content_disposition,
            content_encoding=content_encoding,
            content_language=content_language,
            content_type=content_type,
            https_only=https_only,
            ip_address=ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageAccountBlobContainerSas, self, [scope, id, config])

    @jsii.member(jsii_name="resetCacheControl")
    def reset_cache_control(self) -> None:
        return jsii.invoke(self, "resetCacheControl", [])

    @jsii.member(jsii_name="resetContentDisposition")
    def reset_content_disposition(self) -> None:
        return jsii.invoke(self, "resetContentDisposition", [])

    @jsii.member(jsii_name="resetContentEncoding")
    def reset_content_encoding(self) -> None:
        return jsii.invoke(self, "resetContentEncoding", [])

    @jsii.member(jsii_name="resetContentLanguage")
    def reset_content_language(self) -> None:
        return jsii.invoke(self, "resetContentLanguage", [])

    @jsii.member(jsii_name="resetContentType")
    def reset_content_type(self) -> None:
        return jsii.invoke(self, "resetContentType", [])

    @jsii.member(jsii_name="resetHttpsOnly")
    def reset_https_only(self) -> None:
        return jsii.invoke(self, "resetHttpsOnly", [])

    @jsii.member(jsii_name="resetIpAddress")
    def reset_ip_address(self) -> None:
        return jsii.invoke(self, "resetIpAddress", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerNameInput")
    def container_name_input(self) -> builtins.str:
        return jsii.get(self, "containerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expiryInput")
    def expiry_input(self) -> builtins.str:
        return jsii.get(self, "expiryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="permissionsInput")
    def permissions_input(
        self,
    ) -> typing.List["DataAzurermStorageAccountBlobContainerSasPermissions"]:
        return jsii.get(self, "permissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sas")
    def sas(self) -> builtins.str:
        return jsii.get(self, "sas")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startInput")
    def start_input(self) -> builtins.str:
        return jsii.get(self, "startInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheControlInput")
    def cache_control_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "cacheControlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentDispositionInput")
    def content_disposition_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentDispositionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEncodingInput")
    def content_encoding_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentEncodingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentLanguageInput")
    def content_language_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentLanguageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypeInput")
    def content_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnlyInput")
    def https_only_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "httpsOnlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddressInput")
    def ip_address_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "ipAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermStorageAccountBlobContainerSasTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheControl")
    def cache_control(self) -> builtins.str:
        return jsii.get(self, "cacheControl")

    @cache_control.setter # type: ignore
    def cache_control(self, value: builtins.str) -> None:
        jsii.set(self, "cacheControl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerName")
    def container_name(self) -> builtins.str:
        return jsii.get(self, "containerName")

    @container_name.setter # type: ignore
    def container_name(self, value: builtins.str) -> None:
        jsii.set(self, "containerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentDisposition")
    def content_disposition(self) -> builtins.str:
        return jsii.get(self, "contentDisposition")

    @content_disposition.setter # type: ignore
    def content_disposition(self, value: builtins.str) -> None:
        jsii.set(self, "contentDisposition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEncoding")
    def content_encoding(self) -> builtins.str:
        return jsii.get(self, "contentEncoding")

    @content_encoding.setter # type: ignore
    def content_encoding(self, value: builtins.str) -> None:
        jsii.set(self, "contentEncoding", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentLanguage")
    def content_language(self) -> builtins.str:
        return jsii.get(self, "contentLanguage")

    @content_language.setter # type: ignore
    def content_language(self, value: builtins.str) -> None:
        jsii.set(self, "contentLanguage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")

    @content_type.setter # type: ignore
    def content_type(self, value: builtins.str) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expiry")
    def expiry(self) -> builtins.str:
        return jsii.get(self, "expiry")

    @expiry.setter # type: ignore
    def expiry(self, value: builtins.str) -> None:
        jsii.set(self, "expiry", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnly")
    def https_only(self) -> builtins.bool:
        return jsii.get(self, "httpsOnly")

    @https_only.setter # type: ignore
    def https_only(self, value: builtins.bool) -> None:
        jsii.set(self, "httpsOnly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @ip_address.setter # type: ignore
    def ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "ipAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="permissions")
    def permissions(
        self,
    ) -> typing.List["DataAzurermStorageAccountBlobContainerSasPermissions"]:
        return jsii.get(self, "permissions")

    @permissions.setter # type: ignore
    def permissions(
        self,
        value: typing.List["DataAzurermStorageAccountBlobContainerSasPermissions"],
    ) -> None:
        jsii.set(self, "permissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="start")
    def start(self) -> builtins.str:
        return jsii.get(self, "start")

    @start.setter # type: ignore
    def start(self, value: builtins.str) -> None:
        jsii.set(self, "start", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageAccountBlobContainerSasTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermStorageAccountBlobContainerSasTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountBlobContainerSasConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "container_name": "containerName",
        "expiry": "expiry",
        "permissions": "permissions",
        "start": "start",
        "cache_control": "cacheControl",
        "content_disposition": "contentDisposition",
        "content_encoding": "contentEncoding",
        "content_language": "contentLanguage",
        "content_type": "contentType",
        "https_only": "httpsOnly",
        "ip_address": "ipAddress",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageAccountBlobContainerSasConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        container_name: builtins.str,
        expiry: builtins.str,
        permissions: typing.List["DataAzurermStorageAccountBlobContainerSasPermissions"],
        start: builtins.str,
        cache_control: typing.Optional[builtins.str] = None,
        content_disposition: typing.Optional[builtins.str] = None,
        content_encoding: typing.Optional[builtins.str] = None,
        content_language: typing.Optional[builtins.str] = None,
        content_type: typing.Optional[builtins.str] = None,
        https_only: typing.Optional[builtins.bool] = None,
        ip_address: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermStorageAccountBlobContainerSasTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param container_name: -
        :param expiry: -
        :param permissions: permissions block.
        :param start: -
        :param cache_control: -
        :param content_disposition: -
        :param content_encoding: -
        :param content_language: -
        :param content_type: -
        :param https_only: -
        :param ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageAccountBlobContainerSasTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "container_name": container_name,
            "expiry": expiry,
            "permissions": permissions,
            "start": start,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if cache_control is not None:
            self._values["cache_control"] = cache_control
        if content_disposition is not None:
            self._values["content_disposition"] = content_disposition
        if content_encoding is not None:
            self._values["content_encoding"] = content_encoding
        if content_language is not None:
            self._values["content_language"] = content_language
        if content_type is not None:
            self._values["content_type"] = content_type
        if https_only is not None:
            self._values["https_only"] = https_only
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def container_name(self) -> builtins.str:
        result = self._values.get("container_name")
        assert result is not None, "Required property 'container_name' is missing"
        return result

    @builtins.property
    def expiry(self) -> builtins.str:
        result = self._values.get("expiry")
        assert result is not None, "Required property 'expiry' is missing"
        return result

    @builtins.property
    def permissions(
        self,
    ) -> typing.List["DataAzurermStorageAccountBlobContainerSasPermissions"]:
        """permissions block."""
        result = self._values.get("permissions")
        assert result is not None, "Required property 'permissions' is missing"
        return result

    @builtins.property
    def start(self) -> builtins.str:
        result = self._values.get("start")
        assert result is not None, "Required property 'start' is missing"
        return result

    @builtins.property
    def cache_control(self) -> typing.Optional[builtins.str]:
        result = self._values.get("cache_control")
        return result

    @builtins.property
    def content_disposition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_disposition")
        return result

    @builtins.property
    def content_encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_encoding")
        return result

    @builtins.property
    def content_language(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_language")
        return result

    @builtins.property
    def content_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_type")
        return result

    @builtins.property
    def https_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("https_only")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermStorageAccountBlobContainerSasTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountBlobContainerSasConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountBlobContainerSasPermissions",
    jsii_struct_bases=[],
    name_mapping={
        "add": "add",
        "create": "create",
        "delete": "delete",
        "list": "list",
        "read": "read",
        "write": "write",
    },
)
class DataAzurermStorageAccountBlobContainerSasPermissions:
    def __init__(
        self,
        *,
        add: builtins.bool,
        create: builtins.bool,
        delete: builtins.bool,
        list: builtins.bool,
        read: builtins.bool,
        write: builtins.bool,
    ) -> None:
        """
        :param add: -
        :param create: -
        :param delete: -
        :param list: -
        :param read: -
        :param write: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "add": add,
            "create": create,
            "delete": delete,
            "list": list,
            "read": read,
            "write": write,
        }

    @builtins.property
    def add(self) -> builtins.bool:
        result = self._values.get("add")
        assert result is not None, "Required property 'add' is missing"
        return result

    @builtins.property
    def create(self) -> builtins.bool:
        result = self._values.get("create")
        assert result is not None, "Required property 'create' is missing"
        return result

    @builtins.property
    def delete(self) -> builtins.bool:
        result = self._values.get("delete")
        assert result is not None, "Required property 'delete' is missing"
        return result

    @builtins.property
    def list(self) -> builtins.bool:
        result = self._values.get("list")
        assert result is not None, "Required property 'list' is missing"
        return result

    @builtins.property
    def read(self) -> builtins.bool:
        result = self._values.get("read")
        assert result is not None, "Required property 'read' is missing"
        return result

    @builtins.property
    def write(self) -> builtins.bool:
        result = self._values.get("write")
        assert result is not None, "Required property 'write' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountBlobContainerSasPermissions(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountBlobContainerSasTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageAccountBlobContainerSasTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountBlobContainerSasTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "min_tls_version": "minTlsVersion",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        min_tls_version: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermStorageAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param min_tls_version: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if min_tls_version is not None:
            self._values["min_tls_version"] = min_tls_version
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def min_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_tls_version")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStorageAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageAccountCustomDomain(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageAccountCustomDomain",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermStorageAccountCustomDomain, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


class DataAzurermStorageAccountSas(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageAccountSas",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        expiry: builtins.str,
        permissions: typing.List["DataAzurermStorageAccountSasPermissions"],
        resource_types: typing.List["DataAzurermStorageAccountSasResourceTypes"],
        services: typing.List["DataAzurermStorageAccountSasServices"],
        start: builtins.str,
        https_only: typing.Optional[builtins.bool] = None,
        signed_version: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermStorageAccountSasTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param expiry: -
        :param permissions: permissions block.
        :param resource_types: resource_types block.
        :param services: services block.
        :param start: -
        :param https_only: -
        :param signed_version: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageAccountSasConfig(
            connection_string=connection_string,
            expiry=expiry,
            permissions=permissions,
            resource_types=resource_types,
            services=services,
            start=start,
            https_only=https_only,
            signed_version=signed_version,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageAccountSas, self, [scope, id, config])

    @jsii.member(jsii_name="resetHttpsOnly")
    def reset_https_only(self) -> None:
        return jsii.invoke(self, "resetHttpsOnly", [])

    @jsii.member(jsii_name="resetSignedVersion")
    def reset_signed_version(self) -> None:
        return jsii.invoke(self, "resetSignedVersion", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expiryInput")
    def expiry_input(self) -> builtins.str:
        return jsii.get(self, "expiryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="permissionsInput")
    def permissions_input(
        self,
    ) -> typing.List["DataAzurermStorageAccountSasPermissions"]:
        return jsii.get(self, "permissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceTypesInput")
    def resource_types_input(
        self,
    ) -> typing.List["DataAzurermStorageAccountSasResourceTypes"]:
        return jsii.get(self, "resourceTypesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sas")
    def sas(self) -> builtins.str:
        return jsii.get(self, "sas")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicesInput")
    def services_input(self) -> typing.List["DataAzurermStorageAccountSasServices"]:
        return jsii.get(self, "servicesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startInput")
    def start_input(self) -> builtins.str:
        return jsii.get(self, "startInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnlyInput")
    def https_only_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "httpsOnlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signedVersionInput")
    def signed_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "signedVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermStorageAccountSasTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expiry")
    def expiry(self) -> builtins.str:
        return jsii.get(self, "expiry")

    @expiry.setter # type: ignore
    def expiry(self, value: builtins.str) -> None:
        jsii.set(self, "expiry", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnly")
    def https_only(self) -> builtins.bool:
        return jsii.get(self, "httpsOnly")

    @https_only.setter # type: ignore
    def https_only(self, value: builtins.bool) -> None:
        jsii.set(self, "httpsOnly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="permissions")
    def permissions(self) -> typing.List["DataAzurermStorageAccountSasPermissions"]:
        return jsii.get(self, "permissions")

    @permissions.setter # type: ignore
    def permissions(
        self,
        value: typing.List["DataAzurermStorageAccountSasPermissions"],
    ) -> None:
        jsii.set(self, "permissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceTypes")
    def resource_types(
        self,
    ) -> typing.List["DataAzurermStorageAccountSasResourceTypes"]:
        return jsii.get(self, "resourceTypes")

    @resource_types.setter # type: ignore
    def resource_types(
        self,
        value: typing.List["DataAzurermStorageAccountSasResourceTypes"],
    ) -> None:
        jsii.set(self, "resourceTypes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="services")
    def services(self) -> typing.List["DataAzurermStorageAccountSasServices"]:
        return jsii.get(self, "services")

    @services.setter # type: ignore
    def services(
        self,
        value: typing.List["DataAzurermStorageAccountSasServices"],
    ) -> None:
        jsii.set(self, "services", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="signedVersion")
    def signed_version(self) -> builtins.str:
        return jsii.get(self, "signedVersion")

    @signed_version.setter # type: ignore
    def signed_version(self, value: builtins.str) -> None:
        jsii.set(self, "signedVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="start")
    def start(self) -> builtins.str:
        return jsii.get(self, "start")

    @start.setter # type: ignore
    def start(self, value: builtins.str) -> None:
        jsii.set(self, "start", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageAccountSasTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStorageAccountSasTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountSasConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "expiry": "expiry",
        "permissions": "permissions",
        "resource_types": "resourceTypes",
        "services": "services",
        "start": "start",
        "https_only": "httpsOnly",
        "signed_version": "signedVersion",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageAccountSasConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        expiry: builtins.str,
        permissions: typing.List["DataAzurermStorageAccountSasPermissions"],
        resource_types: typing.List["DataAzurermStorageAccountSasResourceTypes"],
        services: typing.List["DataAzurermStorageAccountSasServices"],
        start: builtins.str,
        https_only: typing.Optional[builtins.bool] = None,
        signed_version: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermStorageAccountSasTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param expiry: -
        :param permissions: permissions block.
        :param resource_types: resource_types block.
        :param services: services block.
        :param start: -
        :param https_only: -
        :param signed_version: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageAccountSasTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "expiry": expiry,
            "permissions": permissions,
            "resource_types": resource_types,
            "services": services,
            "start": start,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if https_only is not None:
            self._values["https_only"] = https_only
        if signed_version is not None:
            self._values["signed_version"] = signed_version
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def expiry(self) -> builtins.str:
        result = self._values.get("expiry")
        assert result is not None, "Required property 'expiry' is missing"
        return result

    @builtins.property
    def permissions(self) -> typing.List["DataAzurermStorageAccountSasPermissions"]:
        """permissions block."""
        result = self._values.get("permissions")
        assert result is not None, "Required property 'permissions' is missing"
        return result

    @builtins.property
    def resource_types(
        self,
    ) -> typing.List["DataAzurermStorageAccountSasResourceTypes"]:
        """resource_types block."""
        result = self._values.get("resource_types")
        assert result is not None, "Required property 'resource_types' is missing"
        return result

    @builtins.property
    def services(self) -> typing.List["DataAzurermStorageAccountSasServices"]:
        """services block."""
        result = self._values.get("services")
        assert result is not None, "Required property 'services' is missing"
        return result

    @builtins.property
    def start(self) -> builtins.str:
        result = self._values.get("start")
        assert result is not None, "Required property 'start' is missing"
        return result

    @builtins.property
    def https_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("https_only")
        return result

    @builtins.property
    def signed_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("signed_version")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStorageAccountSasTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountSasConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountSasPermissions",
    jsii_struct_bases=[],
    name_mapping={
        "add": "add",
        "create": "create",
        "delete": "delete",
        "list": "list",
        "process": "process",
        "read": "read",
        "update": "update",
        "write": "write",
    },
)
class DataAzurermStorageAccountSasPermissions:
    def __init__(
        self,
        *,
        add: builtins.bool,
        create: builtins.bool,
        delete: builtins.bool,
        list: builtins.bool,
        process: builtins.bool,
        read: builtins.bool,
        update: builtins.bool,
        write: builtins.bool,
    ) -> None:
        """
        :param add: -
        :param create: -
        :param delete: -
        :param list: -
        :param process: -
        :param read: -
        :param update: -
        :param write: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "add": add,
            "create": create,
            "delete": delete,
            "list": list,
            "process": process,
            "read": read,
            "update": update,
            "write": write,
        }

    @builtins.property
    def add(self) -> builtins.bool:
        result = self._values.get("add")
        assert result is not None, "Required property 'add' is missing"
        return result

    @builtins.property
    def create(self) -> builtins.bool:
        result = self._values.get("create")
        assert result is not None, "Required property 'create' is missing"
        return result

    @builtins.property
    def delete(self) -> builtins.bool:
        result = self._values.get("delete")
        assert result is not None, "Required property 'delete' is missing"
        return result

    @builtins.property
    def list(self) -> builtins.bool:
        result = self._values.get("list")
        assert result is not None, "Required property 'list' is missing"
        return result

    @builtins.property
    def process(self) -> builtins.bool:
        result = self._values.get("process")
        assert result is not None, "Required property 'process' is missing"
        return result

    @builtins.property
    def read(self) -> builtins.bool:
        result = self._values.get("read")
        assert result is not None, "Required property 'read' is missing"
        return result

    @builtins.property
    def update(self) -> builtins.bool:
        result = self._values.get("update")
        assert result is not None, "Required property 'update' is missing"
        return result

    @builtins.property
    def write(self) -> builtins.bool:
        result = self._values.get("write")
        assert result is not None, "Required property 'write' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountSasPermissions(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountSasResourceTypes",
    jsii_struct_bases=[],
    name_mapping={"container": "container", "object": "object", "service": "service"},
)
class DataAzurermStorageAccountSasResourceTypes:
    def __init__(
        self,
        *,
        container: builtins.bool,
        object: builtins.bool,
        service: builtins.bool,
    ) -> None:
        """
        :param container: -
        :param object: -
        :param service: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "container": container,
            "object": object,
            "service": service,
        }

    @builtins.property
    def container(self) -> builtins.bool:
        result = self._values.get("container")
        assert result is not None, "Required property 'container' is missing"
        return result

    @builtins.property
    def object(self) -> builtins.bool:
        result = self._values.get("object")
        assert result is not None, "Required property 'object' is missing"
        return result

    @builtins.property
    def service(self) -> builtins.bool:
        result = self._values.get("service")
        assert result is not None, "Required property 'service' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountSasResourceTypes(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountSasServices",
    jsii_struct_bases=[],
    name_mapping={"blob": "blob", "file": "file", "queue": "queue", "table": "table"},
)
class DataAzurermStorageAccountSasServices:
    def __init__(
        self,
        *,
        blob: builtins.bool,
        file: builtins.bool,
        queue: builtins.bool,
        table: builtins.bool,
    ) -> None:
        """
        :param blob: -
        :param file: -
        :param queue: -
        :param table: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "blob": blob,
            "file": file,
            "queue": queue,
            "table": table,
        }

    @builtins.property
    def blob(self) -> builtins.bool:
        result = self._values.get("blob")
        assert result is not None, "Required property 'blob' is missing"
        return result

    @builtins.property
    def file(self) -> builtins.bool:
        result = self._values.get("file")
        assert result is not None, "Required property 'file' is missing"
        return result

    @builtins.property
    def queue(self) -> builtins.bool:
        result = self._values.get("queue")
        assert result is not None, "Required property 'queue' is missing"
        return result

    @builtins.property
    def table(self) -> builtins.bool:
        result = self._values.get("table")
        assert result is not None, "Required property 'table' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountSasServices(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountSasTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageAccountSasTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountSasTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageAccountTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageContainer(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageContainer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_name: builtins.str,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermStorageContainerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_name: -
        :param metadata: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageContainerConfig(
            name=name,
            storage_account_name=storage_account_name,
            metadata=metadata,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageContainer, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerAccessType")
    def container_access_type(self) -> builtins.str:
        return jsii.get(self, "containerAccessType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hasImmutabilityPolicy")
    def has_immutability_policy(self) -> builtins.bool:
        return jsii.get(self, "hasImmutabilityPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hasLegalHold")
    def has_legal_hold(self) -> builtins.bool:
        return jsii.get(self, "hasLegalHold")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceManagerId")
    def resource_manager_id(self) -> builtins.str:
        return jsii.get(self, "resourceManagerId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermStorageContainerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageContainerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStorageContainerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageContainerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_name": "storageAccountName",
        "metadata": "metadata",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageContainerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_name: builtins.str,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermStorageContainerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_name: -
        :param metadata: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageContainerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metadata is not None:
            self._values["metadata"] = metadata
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStorageContainerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageContainerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageContainerTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageContainerTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageContainerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageEncryptionScope(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageEncryptionScope",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_id: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageEncryptionScopeTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageEncryptionScopeConfig(
            name=name,
            storage_account_id=storage_account_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageEncryptionScope, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="source")
    def source(self) -> builtins.str:
        return jsii.get(self, "source")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermStorageEncryptionScopeTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageEncryptionScopeTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStorageEncryptionScopeTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageEncryptionScopeConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_id": "storageAccountId",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageEncryptionScopeConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_id: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageEncryptionScopeTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageEncryptionScopeTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStorageEncryptionScopeTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageEncryptionScopeConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageEncryptionScopeTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageEncryptionScopeTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageEncryptionScopeTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageManagementPolicy(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageManagementPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        storage_account_id: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageManagementPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param storage_account_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageManagementPolicyConfig(
            storage_account_id=storage_account_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageManagementPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="rule")
    def rule(self, index: builtins.str) -> "DataAzurermStorageManagementPolicyRule":
        """
        :param index: -
        """
        return jsii.invoke(self, "rule", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermStorageManagementPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageManagementPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStorageManagementPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageManagementPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "storage_account_id": "storageAccountId",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageManagementPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        storage_account_id: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageManagementPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param storage_account_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageManagementPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStorageManagementPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageManagementPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageManagementPolicyRule(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageManagementPolicyRule",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermStorageManagementPolicyRule, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actions")
    def actions(self) -> typing.Any:
        return jsii.get(self, "actions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filters")
    def filters(self) -> typing.Any:
        return jsii.get(self, "filters")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


class DataAzurermStorageManagementPolicyRuleActions(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageManagementPolicyRuleActions",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermStorageManagementPolicyRuleActions, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="baseBlob")
    def base_blob(self) -> typing.Any:
        return jsii.get(self, "baseBlob")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="snapshot")
    def snapshot(self) -> typing.Any:
        return jsii.get(self, "snapshot")


class DataAzurermStorageManagementPolicyRuleActionsBaseBlob(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageManagementPolicyRuleActionsBaseBlob",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermStorageManagementPolicyRuleActionsBaseBlob, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deleteAfterDaysSinceModificationGreaterThan")
    def delete_after_days_since_modification_greater_than(self) -> jsii.Number:
        return jsii.get(self, "deleteAfterDaysSinceModificationGreaterThan")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierToArchiveAfterDaysSinceModificationGreaterThan")
    def tier_to_archive_after_days_since_modification_greater_than(self) -> jsii.Number:
        return jsii.get(self, "tierToArchiveAfterDaysSinceModificationGreaterThan")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierToCoolAfterDaysSinceModificationGreaterThan")
    def tier_to_cool_after_days_since_modification_greater_than(self) -> jsii.Number:
        return jsii.get(self, "tierToCoolAfterDaysSinceModificationGreaterThan")


class DataAzurermStorageManagementPolicyRuleActionsSnapshot(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageManagementPolicyRuleActionsSnapshot",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermStorageManagementPolicyRuleActionsSnapshot, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deleteAfterDaysSinceCreationGreaterThan")
    def delete_after_days_since_creation_greater_than(self) -> jsii.Number:
        return jsii.get(self, "deleteAfterDaysSinceCreationGreaterThan")


class DataAzurermStorageManagementPolicyRuleFilters(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageManagementPolicyRuleFilters",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermStorageManagementPolicyRuleFilters, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobTypes")
    def blob_types(self) -> typing.List[builtins.str]:
        return jsii.get(self, "blobTypes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="prefixMatch")
    def prefix_match(self) -> typing.List[builtins.str]:
        return jsii.get(self, "prefixMatch")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageManagementPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageManagementPolicyTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageManagementPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageSync(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageSync",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageSyncTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageSyncConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageSync, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="incomingTrafficPolicy")
    def incoming_traffic_policy(self) -> builtins.str:
        return jsii.get(self, "incomingTrafficPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermStorageSyncTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageSyncTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStorageSyncTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageSyncConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageSyncConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageSyncTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageSyncTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStorageSyncTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageSyncConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStorageSyncGroup(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStorageSyncGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_sync_id: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageSyncGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_sync_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStorageSyncGroupConfig(
            name=name,
            storage_sync_id=storage_sync_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStorageSyncGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageSyncIdInput")
    def storage_sync_id_input(self) -> builtins.str:
        return jsii.get(self, "storageSyncIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermStorageSyncGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageSyncId")
    def storage_sync_id(self) -> builtins.str:
        return jsii.get(self, "storageSyncId")

    @storage_sync_id.setter # type: ignore
    def storage_sync_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageSyncId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStorageSyncGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStorageSyncGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageSyncGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_sync_id": "storageSyncId",
        "timeouts": "timeouts",
    },
)
class DataAzurermStorageSyncGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_sync_id: builtins.str,
        timeouts: typing.Optional["DataAzurermStorageSyncGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_sync_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStorageSyncGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_sync_id": storage_sync_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_sync_id(self) -> builtins.str:
        result = self._values.get("storage_sync_id")
        assert result is not None, "Required property 'storage_sync_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStorageSyncGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageSyncGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageSyncGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageSyncGroupTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageSyncGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStorageSyncTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStorageSyncTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStorageSyncTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermStreamAnalyticsJob(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermStreamAnalyticsJob",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermStreamAnalyticsJobTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermStreamAnalyticsJobConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermStreamAnalyticsJob, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="compatibilityLevel")
    def compatibility_level(self) -> builtins.str:
        return jsii.get(self, "compatibilityLevel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataLocale")
    def data_locale(self) -> builtins.str:
        return jsii.get(self, "dataLocale")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsLateArrivalMaxDelayInSeconds")
    def events_late_arrival_max_delay_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "eventsLateArrivalMaxDelayInSeconds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsOutOfOrderMaxDelayInSeconds")
    def events_out_of_order_max_delay_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "eventsOutOfOrderMaxDelayInSeconds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsOutOfOrderPolicy")
    def events_out_of_order_policy(self) -> builtins.str:
        return jsii.get(self, "eventsOutOfOrderPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="jobId")
    def job_id(self) -> builtins.str:
        return jsii.get(self, "jobId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputErrorPolicy")
    def output_error_policy(self) -> builtins.str:
        return jsii.get(self, "outputErrorPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamingUnits")
    def streaming_units(self) -> jsii.Number:
        return jsii.get(self, "streamingUnits")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="transformationQuery")
    def transformation_query(self) -> builtins.str:
        return jsii.get(self, "transformationQuery")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermStreamAnalyticsJobTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermStreamAnalyticsJobTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermStreamAnalyticsJobTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStreamAnalyticsJobConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermStreamAnalyticsJobConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermStreamAnalyticsJobTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermStreamAnalyticsJobTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermStreamAnalyticsJobTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStreamAnalyticsJobConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermStreamAnalyticsJobTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermStreamAnalyticsJobTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermStreamAnalyticsJobTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSubnet(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSubnet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSubnetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param virtual_network_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSubnetConfig(
            name=name,
            resource_group_name=resource_group_name,
            virtual_network_name=virtual_network_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSubnet, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefix")
    def address_prefix(self) -> builtins.str:
        return jsii.get(self, "addressPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixes")
    def address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressPrefixes")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcePrivateLinkEndpointNetworkPolicies")
    def enforce_private_link_endpoint_network_policies(self) -> builtins.bool:
        return jsii.get(self, "enforcePrivateLinkEndpointNetworkPolicies")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcePrivateLinkServiceNetworkPolicies")
    def enforce_private_link_service_network_policies(self) -> builtins.bool:
        return jsii.get(self, "enforcePrivateLinkServiceNetworkPolicies")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupId")
    def network_security_group_id(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeTableId")
    def route_table_id(self) -> builtins.str:
        return jsii.get(self, "routeTableId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceEndpoints")
    def service_endpoints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "serviceEndpoints")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkNameInput")
    def virtual_network_name_input(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSubnetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSubnetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSubnetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkName")
    def virtual_network_name(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkName")

    @virtual_network_name.setter # type: ignore
    def virtual_network_name(self, value: builtins.str) -> None:
        jsii.set(self, "virtualNetworkName", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSubnetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "virtual_network_name": "virtualNetworkName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSubnetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSubnetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param virtual_network_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSubnetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "virtual_network_name": virtual_network_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def virtual_network_name(self) -> builtins.str:
        result = self._values.get("virtual_network_name")
        assert result is not None, "Required property 'virtual_network_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSubnetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSubnetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSubnetTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSubnetTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSubnetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSubscription(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSubscription",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        subscription_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermSubscriptionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param subscription_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSubscriptionConfig(
            subscription_id=subscription_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSubscription, self, [scope, id, config])

    @jsii.member(jsii_name="resetSubscriptionId")
    def reset_subscription_id(self) -> None:
        return jsii.invoke(self, "resetSubscriptionId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationPlacementId")
    def location_placement_id(self) -> builtins.str:
        return jsii.get(self, "locationPlacementId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="quotaId")
    def quota_id(self) -> builtins.str:
        return jsii.get(self, "quotaId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="spendingLimit")
    def spending_limit(self) -> builtins.str:
        return jsii.get(self, "spendingLimit")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="state")
    def state(self) -> builtins.str:
        return jsii.get(self, "state")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIdInput")
    def subscription_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "subscriptionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSubscriptionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")

    @subscription_id.setter # type: ignore
    def subscription_id(self, value: builtins.str) -> None:
        jsii.set(self, "subscriptionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSubscriptionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSubscriptionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSubscriptionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "subscription_id": "subscriptionId",
        "timeouts": "timeouts",
    },
)
class DataAzurermSubscriptionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        subscription_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermSubscriptionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param subscription_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSubscriptionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if subscription_id is not None:
            self._values["subscription_id"] = subscription_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def subscription_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subscription_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSubscriptionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSubscriptionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSubscriptionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSubscriptionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSubscriptionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSubscriptions(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSubscriptions",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name_contains: typing.Optional[builtins.str] = None,
        display_name_prefix: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermSubscriptionsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name_contains: -
        :param display_name_prefix: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSubscriptionsConfig(
            display_name_contains=display_name_contains,
            display_name_prefix=display_name_prefix,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSubscriptions, self, [scope, id, config])

    @jsii.member(jsii_name="resetDisplayNameContains")
    def reset_display_name_contains(self) -> None:
        return jsii.invoke(self, "resetDisplayNameContains", [])

    @jsii.member(jsii_name="resetDisplayNamePrefix")
    def reset_display_name_prefix(self) -> None:
        return jsii.invoke(self, "resetDisplayNamePrefix", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="subscriptions")
    def subscriptions(
        self,
        index: builtins.str,
    ) -> "DataAzurermSubscriptionsSubscriptions":
        """
        :param index: -
        """
        return jsii.invoke(self, "subscriptions", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameContainsInput")
    def display_name_contains_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameContainsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNamePrefixInput")
    def display_name_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNamePrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSubscriptionsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameContains")
    def display_name_contains(self) -> builtins.str:
        return jsii.get(self, "displayNameContains")

    @display_name_contains.setter # type: ignore
    def display_name_contains(self, value: builtins.str) -> None:
        jsii.set(self, "displayNameContains", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNamePrefix")
    def display_name_prefix(self) -> builtins.str:
        return jsii.get(self, "displayNamePrefix")

    @display_name_prefix.setter # type: ignore
    def display_name_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "displayNamePrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSubscriptionsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSubscriptionsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSubscriptionsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name_contains": "displayNameContains",
        "display_name_prefix": "displayNamePrefix",
        "timeouts": "timeouts",
    },
)
class DataAzurermSubscriptionsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name_contains: typing.Optional[builtins.str] = None,
        display_name_prefix: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataAzurermSubscriptionsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name_contains: -
        :param display_name_prefix: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSubscriptionsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if display_name_contains is not None:
            self._values["display_name_contains"] = display_name_contains
        if display_name_prefix is not None:
            self._values["display_name_prefix"] = display_name_prefix
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name_contains(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name_contains")
        return result

    @builtins.property
    def display_name_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name_prefix")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSubscriptionsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSubscriptionsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSubscriptionsSubscriptions(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSubscriptionsSubscriptions",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermSubscriptionsSubscriptions, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationPlacementId")
    def location_placement_id(self) -> builtins.str:
        return jsii.get(self, "locationPlacementId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="quotaId")
    def quota_id(self) -> builtins.str:
        return jsii.get(self, "quotaId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="spendingLimit")
    def spending_limit(self) -> builtins.str:
        return jsii.get(self, "spendingLimit")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="state")
    def state(self) -> builtins.str:
        return jsii.get(self, "state")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionId")
    def subscription_id(self) -> builtins.str:
        return jsii.get(self, "subscriptionId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSubscriptionsTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSubscriptionsTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSubscriptionsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermSynapseWorkspace(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermSynapseWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSynapseWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermSynapseWorkspaceConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermSynapseWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="connectivityEndpoints")
    def connectivity_endpoints(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "connectivityEndpoints", [key])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermSynapseWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermSynapseWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermSynapseWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSynapseWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermSynapseWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermSynapseWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermSynapseWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermSynapseWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSynapseWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermSynapseWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermSynapseWorkspaceTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermSynapseWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermTrafficManagerGeographicalLocation(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermTrafficManagerGeographicalLocation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermTrafficManagerGeographicalLocationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermTrafficManagerGeographicalLocationConfig(
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermTrafficManagerGeographicalLocation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermTrafficManagerGeographicalLocationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermTrafficManagerGeographicalLocationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermTrafficManagerGeographicalLocationTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermTrafficManagerGeographicalLocationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class DataAzurermTrafficManagerGeographicalLocationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        timeouts: typing.Optional["DataAzurermTrafficManagerGeographicalLocationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermTrafficManagerGeographicalLocationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermTrafficManagerGeographicalLocationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermTrafficManagerGeographicalLocationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermTrafficManagerGeographicalLocationTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermTrafficManagerGeographicalLocationTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermTrafficManagerGeographicalLocationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermTrafficManagerProfile(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermTrafficManagerProfile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermTrafficManagerProfileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermTrafficManagerProfileConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermTrafficManagerProfile, self, [scope, id, config])

    @jsii.member(jsii_name="dnsConfig")
    def dns_config(
        self,
        index: builtins.str,
    ) -> "DataAzurermTrafficManagerProfileDnsConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "dnsConfig", [index])

    @jsii.member(jsii_name="monitorConfig")
    def monitor_config(
        self,
        index: builtins.str,
    ) -> "DataAzurermTrafficManagerProfileMonitorConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "monitorConfig", [index])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileStatus")
    def profile_status(self) -> builtins.str:
        return jsii.get(self, "profileStatus")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trafficRoutingMethod")
    def traffic_routing_method(self) -> builtins.str:
        return jsii.get(self, "trafficRoutingMethod")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermTrafficManagerProfileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermTrafficManagerProfileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermTrafficManagerProfileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermTrafficManagerProfileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermTrafficManagerProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermTrafficManagerProfileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermTrafficManagerProfileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermTrafficManagerProfileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermTrafficManagerProfileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermTrafficManagerProfileDnsConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermTrafficManagerProfileDnsConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermTrafficManagerProfileDnsConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relativeName")
    def relative_name(self) -> builtins.str:
        return jsii.get(self, "relativeName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")


class DataAzurermTrafficManagerProfileMonitorConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermTrafficManagerProfileMonitorConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermTrafficManagerProfileMonitorConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHeader")
    def custom_header(self) -> typing.Any:
        return jsii.get(self, "customHeader")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expectedStatusCodeRanges")
    def expected_status_code_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "expectedStatusCodeRanges")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInSeconds")
    def interval_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "intervalInSeconds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="path")
    def path(self) -> builtins.str:
        return jsii.get(self, "path")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutInSeconds")
    def timeout_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "timeoutInSeconds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="toleratedNumberOfFailures")
    def tolerated_number_of_failures(self) -> jsii.Number:
        return jsii.get(self, "toleratedNumberOfFailures")


class DataAzurermTrafficManagerProfileMonitorConfigCustomHeader(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermTrafficManagerProfileMonitorConfigCustomHeader",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermTrafficManagerProfileMonitorConfigCustomHeader, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermTrafficManagerProfileTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermTrafficManagerProfileTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermTrafficManagerProfileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermUserAssignedIdentity(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermUserAssignedIdentity",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermUserAssignedIdentityTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermUserAssignedIdentityConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermUserAssignedIdentity, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermUserAssignedIdentityTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermUserAssignedIdentityTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermUserAssignedIdentityTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermUserAssignedIdentityConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermUserAssignedIdentityConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermUserAssignedIdentityTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermUserAssignedIdentityTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermUserAssignedIdentityTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermUserAssignedIdentityConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermUserAssignedIdentityTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermUserAssignedIdentityTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermUserAssignedIdentityTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualHub(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualHub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualHubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermVirtualHubConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermVirtualHub, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefix")
    def address_prefix(self) -> builtins.str:
        return jsii.get(self, "addressPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualWanId")
    def virtual_wan_id(self) -> builtins.str:
        return jsii.get(self, "virtualWanId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermVirtualHubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermVirtualHubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermVirtualHubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualHubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermVirtualHubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualHubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermVirtualHubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermVirtualHubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualHubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualHubTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermVirtualHubTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualHubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualMachine(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualMachineTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermVirtualMachineConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermVirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "DataAzurermVirtualMachineIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermVirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermVirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermVirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermVirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualMachineTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermVirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermVirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualMachineIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualMachineIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualMachineIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityIds")
    def identity_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "identityIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


class DataAzurermVirtualMachineScaleSet(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualMachineScaleSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualMachineScaleSetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermVirtualMachineScaleSetConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermVirtualMachineScaleSet, self, [scope, id, config])

    @jsii.member(jsii_name="identity")
    def identity(
        self,
        index: builtins.str,
    ) -> "DataAzurermVirtualMachineScaleSetIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermVirtualMachineScaleSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermVirtualMachineScaleSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermVirtualMachineScaleSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualMachineScaleSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermVirtualMachineScaleSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualMachineScaleSetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermVirtualMachineScaleSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermVirtualMachineScaleSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualMachineScaleSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualMachineScaleSetIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualMachineScaleSetIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualMachineScaleSetIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityIds")
    def identity_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "identityIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualMachineScaleSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermVirtualMachineScaleSetTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualMachineScaleSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermVirtualMachineTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualNetwork(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetwork",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualNetworkTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermVirtualNetworkConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermVirtualNetwork, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="vnetPeerings")
    def vnet_peerings(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "vnetPeerings", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressSpace")
    def address_space(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressSpace")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServers")
    def dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsServers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="guid")
    def guid(self) -> builtins.str:
        return jsii.get(self, "guid")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnets")
    def subnets(self) -> typing.List[builtins.str]:
        return jsii.get(self, "subnets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermVirtualNetworkTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermVirtualNetworkTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermVirtualNetworkTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualNetworkConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermVirtualNetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualNetworkTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermVirtualNetworkTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermVirtualNetworkTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualNetworkConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualNetworkGateway(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualNetworkGatewayTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermVirtualNetworkGatewayConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermVirtualNetworkGateway, self, [scope, id, config])

    @jsii.member(jsii_name="bgpSettings")
    def bgp_settings(
        self,
        index: builtins.str,
    ) -> "DataAzurermVirtualNetworkGatewayBgpSettings":
        """
        :param index: -
        """
        return jsii.invoke(self, "bgpSettings", [index])

    @jsii.member(jsii_name="customRoute")
    def custom_route(
        self,
        index: builtins.str,
    ) -> "DataAzurermVirtualNetworkGatewayCustomRoute":
        """
        :param index: -
        """
        return jsii.invoke(self, "customRoute", [index])

    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermVirtualNetworkGatewayIpConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "ipConfiguration", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="vpnClientConfiguration")
    def vpn_client_configuration(
        self,
        index: builtins.str,
    ) -> "DataAzurermVirtualNetworkGatewayVpnClientConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "vpnClientConfiguration", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activeActive")
    def active_active(self) -> builtins.bool:
        return jsii.get(self, "activeActive")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultLocalNetworkGatewayId")
    def default_local_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "defaultLocalNetworkGatewayId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBgp")
    def enable_bgp(self) -> builtins.bool:
        return jsii.get(self, "enableBgp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="generation")
    def generation(self) -> builtins.str:
        return jsii.get(self, "generation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressEnabled")
    def private_ip_address_enabled(self) -> builtins.bool:
        return jsii.get(self, "privateIpAddressEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnType")
    def vpn_type(self) -> builtins.str:
        return jsii.get(self, "vpnType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermVirtualNetworkGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermVirtualNetworkGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermVirtualNetworkGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataAzurermVirtualNetworkGatewayBgpSettings(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayBgpSettings",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayBgpSettings, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="asn")
    def asn(self) -> jsii.Number:
        return jsii.get(self, "asn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peeringAddress")
    def peering_address(self) -> builtins.str:
        return jsii.get(self, "peeringAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerWeight")
    def peer_weight(self) -> jsii.Number:
        return jsii.get(self, "peerWeight")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermVirtualNetworkGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualNetworkGatewayTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermVirtualNetworkGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermVirtualNetworkGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualNetworkGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualNetworkGatewayConnection(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualNetworkGatewayConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermVirtualNetworkGatewayConnectionConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermVirtualNetworkGatewayConnection, self, [scope, id, config])

    @jsii.member(jsii_name="ipsecPolicy")
    def ipsec_policy(
        self,
        index: builtins.str,
    ) -> "DataAzurermVirtualNetworkGatewayConnectionIpsecPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "ipsecPolicy", [index])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @jsii.member(jsii_name="trafficSelectorPolicy")
    def traffic_selector_policy(
        self,
        index: builtins.str,
    ) -> "DataAzurermVirtualNetworkGatewayConnectionTrafficSelectorPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "trafficSelectorPolicy", [index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationKey")
    def authorization_key(self) -> builtins.str:
        return jsii.get(self, "authorizationKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionProtocol")
    def connection_protocol(self) -> builtins.str:
        return jsii.get(self, "connectionProtocol")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dpdTimeoutSeconds")
    def dpd_timeout_seconds(self) -> jsii.Number:
        return jsii.get(self, "dpdTimeoutSeconds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="egressBytesTransferred")
    def egress_bytes_transferred(self) -> jsii.Number:
        return jsii.get(self, "egressBytesTransferred")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBgp")
    def enable_bgp(self) -> builtins.bool:
        return jsii.get(self, "enableBgp")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteCircuitId")
    def express_route_circuit_id(self) -> builtins.str:
        return jsii.get(self, "expressRouteCircuitId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteGatewayBypass")
    def express_route_gateway_bypass(self) -> builtins.bool:
        return jsii.get(self, "expressRouteGatewayBypass")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ingressBytesTransferred")
    def ingress_bytes_transferred(self) -> jsii.Number:
        return jsii.get(self, "ingressBytesTransferred")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localAzureIpAddressEnabled")
    def local_azure_ip_address_enabled(self) -> builtins.bool:
        return jsii.get(self, "localAzureIpAddressEnabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localNetworkGatewayId")
    def local_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "localNetworkGatewayId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerVirtualNetworkGatewayId")
    def peer_virtual_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "peerVirtualNetworkGatewayId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGuid")
    def resource_guid(self) -> builtins.str:
        return jsii.get(self, "resourceGuid")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routingWeight")
    def routing_weight(self) -> jsii.Number:
        return jsii.get(self, "routingWeight")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedKey")
    def shared_key(self) -> builtins.str:
        return jsii.get(self, "sharedKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usePolicyBasedTrafficSelectors")
    def use_policy_based_traffic_selectors(self) -> builtins.bool:
        return jsii.get(self, "usePolicyBasedTrafficSelectors")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkGatewayId")
    def virtual_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkGatewayId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermVirtualNetworkGatewayConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermVirtualNetworkGatewayConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermVirtualNetworkGatewayConnectionTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermVirtualNetworkGatewayConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualNetworkGatewayConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermVirtualNetworkGatewayConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermVirtualNetworkGatewayConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualNetworkGatewayConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualNetworkGatewayConnectionIpsecPolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayConnectionIpsecPolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayConnectionIpsecPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dhGroup")
    def dh_group(self) -> builtins.str:
        return jsii.get(self, "dhGroup")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ikeEncryption")
    def ike_encryption(self) -> builtins.str:
        return jsii.get(self, "ikeEncryption")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ikeIntegrity")
    def ike_integrity(self) -> builtins.str:
        return jsii.get(self, "ikeIntegrity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipsecEncryption")
    def ipsec_encryption(self) -> builtins.str:
        return jsii.get(self, "ipsecEncryption")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipsecIntegrity")
    def ipsec_integrity(self) -> builtins.str:
        return jsii.get(self, "ipsecIntegrity")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pfsGroup")
    def pfs_group(self) -> builtins.str:
        return jsii.get(self, "pfsGroup")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="saDatasize")
    def sa_datasize(self) -> jsii.Number:
        return jsii.get(self, "saDatasize")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="saLifetime")
    def sa_lifetime(self) -> jsii.Number:
        return jsii.get(self, "saLifetime")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermVirtualNetworkGatewayConnectionTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualNetworkGatewayConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualNetworkGatewayConnectionTrafficSelectorPolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayConnectionTrafficSelectorPolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayConnectionTrafficSelectorPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localAddressCidrs")
    def local_address_cidrs(self) -> typing.List[builtins.str]:
        return jsii.get(self, "localAddressCidrs")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteAddressCidrs")
    def remote_address_cidrs(self) -> typing.List[builtins.str]:
        return jsii.get(self, "remoteAddressCidrs")


class DataAzurermVirtualNetworkGatewayCustomRoute(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayCustomRoute",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayCustomRoute, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixes")
    def address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressPrefixes")


class DataAzurermVirtualNetworkGatewayIpConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayIpConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayIpConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressAllocation")
    def private_ip_address_allocation(self) -> builtins.str:
        return jsii.get(self, "privateIpAddressAllocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressId")
    def public_ip_address_id(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermVirtualNetworkGatewayTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualNetworkGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualNetworkGatewayVpnClientConfiguration(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayVpnClientConfiguration",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayVpnClientConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aadAudience")
    def aad_audience(self) -> builtins.str:
        return jsii.get(self, "aadAudience")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aadIssuer")
    def aad_issuer(self) -> builtins.str:
        return jsii.get(self, "aadIssuer")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aadTenant")
    def aad_tenant(self) -> builtins.str:
        return jsii.get(self, "aadTenant")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressSpace")
    def address_space(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressSpace")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="radiusServerAddress")
    def radius_server_address(self) -> builtins.str:
        return jsii.get(self, "radiusServerAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="radiusServerSecret")
    def radius_server_secret(self) -> builtins.str:
        return jsii.get(self, "radiusServerSecret")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="revokedCertificate")
    def revoked_certificate(self) -> typing.Any:
        return jsii.get(self, "revokedCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rootCertificate")
    def root_certificate(self) -> typing.Any:
        return jsii.get(self, "rootCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnClientProtocols")
    def vpn_client_protocols(self) -> typing.List[builtins.str]:
        return jsii.get(self, "vpnClientProtocols")


class DataAzurermVirtualNetworkGatewayVpnClientConfigurationRevokedCertificate(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayVpnClientConfigurationRevokedCertificate",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayVpnClientConfigurationRevokedCertificate, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")


class DataAzurermVirtualNetworkGatewayVpnClientConfigurationRootCertificate(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualNetworkGatewayVpnClientConfigurationRootCertificate",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(DataAzurermVirtualNetworkGatewayVpnClientConfigurationRootCertificate, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicCertData")
    def public_cert_data(self) -> builtins.str:
        return jsii.get(self, "publicCertData")


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualNetworkTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermVirtualNetworkTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualNetworkTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermVirtualWan(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermVirtualWan",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualWanTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermVirtualWanConfig(
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermVirtualWan, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="tags")
    def tags(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "tags", [key])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowBranchToBranchTraffic")
    def allow_branch_to_branch_traffic(self) -> builtins.bool:
        return jsii.get(self, "allowBranchToBranchTraffic")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableVpnEncryption")
    def disable_vpn_encryption(self) -> builtins.bool:
        return jsii.get(self, "disableVpnEncryption")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="office365LocalBreakoutCategory")
    def office365_local_breakout_category(self) -> builtins.str:
        return jsii.get(self, "office365LocalBreakoutCategory")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIds")
    def virtual_hub_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "virtualHubIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnSiteIds")
    def vpn_site_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "vpnSiteIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataAzurermVirtualWanTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermVirtualWanTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataAzurermVirtualWanTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualWanConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class DataAzurermVirtualWanConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["DataAzurermVirtualWanTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermVirtualWanTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataAzurermVirtualWanTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualWanConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermVirtualWanTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermVirtualWanTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermVirtualWanTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataAzurermWebApplicationFirewallPolicy(
    cdktf.TerraformDataSource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataAzurermWebApplicationFirewallPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermWebApplicationFirewallPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataAzurermWebApplicationFirewallPolicyConfig(
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataAzurermWebApplicationFirewallPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataAzurermWebApplicationFirewallPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataAzurermWebApplicationFirewallPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataAzurermWebApplicationFirewallPolicyTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataAzurermWebApplicationFirewallPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataAzurermWebApplicationFirewallPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataAzurermWebApplicationFirewallPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataAzurermWebApplicationFirewallPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataAzurermWebApplicationFirewallPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermWebApplicationFirewallPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataAzurermWebApplicationFirewallPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={"read": "read"},
)
class DataAzurermWebApplicationFirewallPolicyTimeouts:
    def __init__(self, *, read: typing.Optional[builtins.str] = None) -> None:
        """
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataAzurermWebApplicationFirewallPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactory(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactory",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        github_configuration: typing.Optional[typing.List["DataFactoryGithubConfiguration"]] = None,
        identity: typing.Optional[typing.List["DataFactoryIdentity"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryTimeouts"] = None,
        vsts_configuration: typing.Optional[typing.List["DataFactoryVstsConfiguration"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param github_configuration: github_configuration block.
        :param identity: identity block.
        :param tags: -
        :param timeouts: timeouts block.
        :param vsts_configuration: vsts_configuration block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            github_configuration=github_configuration,
            identity=identity,
            tags=tags,
            timeouts=timeouts,
            vsts_configuration=vsts_configuration,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactory, self, [scope, id, config])

    @jsii.member(jsii_name="resetGithubConfiguration")
    def reset_github_configuration(self) -> None:
        return jsii.invoke(self, "resetGithubConfiguration", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVstsConfiguration")
    def reset_vsts_configuration(self) -> None:
        return jsii.invoke(self, "resetVstsConfiguration", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="githubConfigurationInput")
    def github_configuration_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryGithubConfiguration"]]:
        return jsii.get(self, "githubConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["DataFactoryIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vstsConfigurationInput")
    def vsts_configuration_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryVstsConfiguration"]]:
        return jsii.get(self, "vstsConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="githubConfiguration")
    def github_configuration(self) -> typing.List["DataFactoryGithubConfiguration"]:
        return jsii.get(self, "githubConfiguration")

    @github_configuration.setter # type: ignore
    def github_configuration(
        self,
        value: typing.List["DataFactoryGithubConfiguration"],
    ) -> None:
        jsii.set(self, "githubConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["DataFactoryIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["DataFactoryIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vstsConfiguration")
    def vsts_configuration(self) -> typing.List["DataFactoryVstsConfiguration"]:
        return jsii.get(self, "vstsConfiguration")

    @vsts_configuration.setter # type: ignore
    def vsts_configuration(
        self,
        value: typing.List["DataFactoryVstsConfiguration"],
    ) -> None:
        jsii.set(self, "vstsConfiguration", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "github_configuration": "githubConfiguration",
        "identity": "identity",
        "tags": "tags",
        "timeouts": "timeouts",
        "vsts_configuration": "vstsConfiguration",
    },
)
class DataFactoryConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        github_configuration: typing.Optional[typing.List["DataFactoryGithubConfiguration"]] = None,
        identity: typing.Optional[typing.List["DataFactoryIdentity"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryTimeouts"] = None,
        vsts_configuration: typing.Optional[typing.List["DataFactoryVstsConfiguration"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param github_configuration: github_configuration block.
        :param identity: identity block.
        :param tags: -
        :param timeouts: timeouts block.
        :param vsts_configuration: vsts_configuration block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if github_configuration is not None:
            self._values["github_configuration"] = github_configuration
        if identity is not None:
            self._values["identity"] = identity
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if vsts_configuration is not None:
            self._values["vsts_configuration"] = vsts_configuration

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def github_configuration(
        self,
    ) -> typing.Optional[typing.List["DataFactoryGithubConfiguration"]]:
        """github_configuration block."""
        result = self._values.get("github_configuration")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["DataFactoryIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def vsts_configuration(
        self,
    ) -> typing.Optional[typing.List["DataFactoryVstsConfiguration"]]:
        """vsts_configuration block."""
        result = self._values.get("vsts_configuration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetAzureBlob(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetAzureBlob",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        filename: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        path: typing.Optional[builtins.str] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetAzureBlobSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetAzureBlobTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param filename: -
        :param folder: -
        :param parameters: -
        :param path: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetAzureBlobConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            filename=filename,
            folder=folder,
            parameters=parameters,
            path=path,
            schema_column=schema_column,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetAzureBlob, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFilename")
    def reset_filename(self) -> None:
        return jsii.invoke(self, "resetFilename", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetPath")
    def reset_path(self) -> None:
        return jsii.invoke(self, "resetPath", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filenameInput")
    def filename_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "filenameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathInput")
    def path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "pathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetAzureBlobSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryDatasetAzureBlobTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filename")
    def filename(self) -> builtins.str:
        return jsii.get(self, "filename")

    @filename.setter # type: ignore
    def filename(self, value: builtins.str) -> None:
        jsii.set(self, "filename", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="path")
    def path(self) -> builtins.str:
        return jsii.get(self, "path")

    @path.setter # type: ignore
    def path(self, value: builtins.str) -> None:
        jsii.set(self, "path", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(self) -> typing.List["DataFactoryDatasetAzureBlobSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetAzureBlobSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetAzureBlobTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetAzureBlobTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetAzureBlobConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "filename": "filename",
        "folder": "folder",
        "parameters": "parameters",
        "path": "path",
        "schema_column": "schemaColumn",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetAzureBlobConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        filename: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        path: typing.Optional[builtins.str] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetAzureBlobSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetAzureBlobTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param filename: -
        :param folder: -
        :param parameters: -
        :param path: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetAzureBlobTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if filename is not None:
            self._values["filename"] = filename
        if folder is not None:
            self._values["folder"] = folder
        if parameters is not None:
            self._values["parameters"] = parameters
        if path is not None:
            self._values["path"] = path
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def filename(self) -> typing.Optional[builtins.str]:
        result = self._values.get("filename")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetAzureBlobSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetAzureBlobTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetAzureBlobConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetAzureBlobSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetAzureBlobSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetAzureBlobSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetAzureBlobTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetAzureBlobTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetAzureBlobTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetCosmosdbSqlapi(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetCosmosdbSqlapi",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        collection_name: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetCosmosdbSqlapiSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetCosmosdbSqlapiTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param collection_name: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetCosmosdbSqlapiConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            collection_name=collection_name,
            description=description,
            folder=folder,
            parameters=parameters,
            schema_column=schema_column,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetCosmosdbSqlapi, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetCollectionName")
    def reset_collection_name(self) -> None:
        return jsii.invoke(self, "resetCollectionName", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collectionNameInput")
    def collection_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "collectionNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetCosmosdbSqlapiSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryDatasetCosmosdbSqlapiTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collectionName")
    def collection_name(self) -> builtins.str:
        return jsii.get(self, "collectionName")

    @collection_name.setter # type: ignore
    def collection_name(self, value: builtins.str) -> None:
        jsii.set(self, "collectionName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(
        self,
    ) -> typing.List["DataFactoryDatasetCosmosdbSqlapiSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetCosmosdbSqlapiSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetCosmosdbSqlapiTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetCosmosdbSqlapiTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetCosmosdbSqlapiConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "collection_name": "collectionName",
        "description": "description",
        "folder": "folder",
        "parameters": "parameters",
        "schema_column": "schemaColumn",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetCosmosdbSqlapiConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        collection_name: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetCosmosdbSqlapiSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetCosmosdbSqlapiTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param collection_name: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetCosmosdbSqlapiTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if collection_name is not None:
            self._values["collection_name"] = collection_name
        if description is not None:
            self._values["description"] = description
        if folder is not None:
            self._values["folder"] = folder
        if parameters is not None:
            self._values["parameters"] = parameters
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def collection_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("collection_name")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetCosmosdbSqlapiSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetCosmosdbSqlapiTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetCosmosdbSqlapiConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetCosmosdbSqlapiSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetCosmosdbSqlapiSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetCosmosdbSqlapiSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetCosmosdbSqlapiTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetCosmosdbSqlapiTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetCosmosdbSqlapiTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetDelimitedText(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetDelimitedText",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        azure_blob_storage_location: typing.Optional[typing.List["DataFactoryDatasetDelimitedTextAzureBlobStorageLocation"]] = None,
        column_delimiter: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        encoding: typing.Optional[builtins.str] = None,
        escape_character: typing.Optional[builtins.str] = None,
        first_row_as_header: typing.Optional[builtins.bool] = None,
        folder: typing.Optional[builtins.str] = None,
        http_server_location: typing.Optional[typing.List["DataFactoryDatasetDelimitedTextHttpServerLocation"]] = None,
        null_value: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        quote_character: typing.Optional[builtins.str] = None,
        row_delimiter: typing.Optional[builtins.str] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetDelimitedTextSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetDelimitedTextTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param azure_blob_storage_location: azure_blob_storage_location block.
        :param column_delimiter: -
        :param description: -
        :param encoding: -
        :param escape_character: -
        :param first_row_as_header: -
        :param folder: -
        :param http_server_location: http_server_location block.
        :param null_value: -
        :param parameters: -
        :param quote_character: -
        :param row_delimiter: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetDelimitedTextConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            azure_blob_storage_location=azure_blob_storage_location,
            column_delimiter=column_delimiter,
            description=description,
            encoding=encoding,
            escape_character=escape_character,
            first_row_as_header=first_row_as_header,
            folder=folder,
            http_server_location=http_server_location,
            null_value=null_value,
            parameters=parameters,
            quote_character=quote_character,
            row_delimiter=row_delimiter,
            schema_column=schema_column,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetDelimitedText, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetAzureBlobStorageLocation")
    def reset_azure_blob_storage_location(self) -> None:
        return jsii.invoke(self, "resetAzureBlobStorageLocation", [])

    @jsii.member(jsii_name="resetColumnDelimiter")
    def reset_column_delimiter(self) -> None:
        return jsii.invoke(self, "resetColumnDelimiter", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEncoding")
    def reset_encoding(self) -> None:
        return jsii.invoke(self, "resetEncoding", [])

    @jsii.member(jsii_name="resetEscapeCharacter")
    def reset_escape_character(self) -> None:
        return jsii.invoke(self, "resetEscapeCharacter", [])

    @jsii.member(jsii_name="resetFirstRowAsHeader")
    def reset_first_row_as_header(self) -> None:
        return jsii.invoke(self, "resetFirstRowAsHeader", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetHttpServerLocation")
    def reset_http_server_location(self) -> None:
        return jsii.invoke(self, "resetHttpServerLocation", [])

    @jsii.member(jsii_name="resetNullValue")
    def reset_null_value(self) -> None:
        return jsii.invoke(self, "resetNullValue", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetQuoteCharacter")
    def reset_quote_character(self) -> None:
        return jsii.invoke(self, "resetQuoteCharacter", [])

    @jsii.member(jsii_name="resetRowDelimiter")
    def reset_row_delimiter(self) -> None:
        return jsii.invoke(self, "resetRowDelimiter", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureBlobStorageLocationInput")
    def azure_blob_storage_location_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetDelimitedTextAzureBlobStorageLocation"]]:
        return jsii.get(self, "azureBlobStorageLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="columnDelimiterInput")
    def column_delimiter_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "columnDelimiterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encodingInput")
    def encoding_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "encodingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="escapeCharacterInput")
    def escape_character_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "escapeCharacterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firstRowAsHeaderInput")
    def first_row_as_header_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "firstRowAsHeaderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpServerLocationInput")
    def http_server_location_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetDelimitedTextHttpServerLocation"]]:
        return jsii.get(self, "httpServerLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nullValueInput")
    def null_value_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nullValueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="quoteCharacterInput")
    def quote_character_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "quoteCharacterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rowDelimiterInput")
    def row_delimiter_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "rowDelimiterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetDelimitedTextSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryDatasetDelimitedTextTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureBlobStorageLocation")
    def azure_blob_storage_location(
        self,
    ) -> typing.List["DataFactoryDatasetDelimitedTextAzureBlobStorageLocation"]:
        return jsii.get(self, "azureBlobStorageLocation")

    @azure_blob_storage_location.setter # type: ignore
    def azure_blob_storage_location(
        self,
        value: typing.List["DataFactoryDatasetDelimitedTextAzureBlobStorageLocation"],
    ) -> None:
        jsii.set(self, "azureBlobStorageLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="columnDelimiter")
    def column_delimiter(self) -> builtins.str:
        return jsii.get(self, "columnDelimiter")

    @column_delimiter.setter # type: ignore
    def column_delimiter(self, value: builtins.str) -> None:
        jsii.set(self, "columnDelimiter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encoding")
    def encoding(self) -> builtins.str:
        return jsii.get(self, "encoding")

    @encoding.setter # type: ignore
    def encoding(self, value: builtins.str) -> None:
        jsii.set(self, "encoding", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="escapeCharacter")
    def escape_character(self) -> builtins.str:
        return jsii.get(self, "escapeCharacter")

    @escape_character.setter # type: ignore
    def escape_character(self, value: builtins.str) -> None:
        jsii.set(self, "escapeCharacter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firstRowAsHeader")
    def first_row_as_header(self) -> builtins.bool:
        return jsii.get(self, "firstRowAsHeader")

    @first_row_as_header.setter # type: ignore
    def first_row_as_header(self, value: builtins.bool) -> None:
        jsii.set(self, "firstRowAsHeader", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpServerLocation")
    def http_server_location(
        self,
    ) -> typing.List["DataFactoryDatasetDelimitedTextHttpServerLocation"]:
        return jsii.get(self, "httpServerLocation")

    @http_server_location.setter # type: ignore
    def http_server_location(
        self,
        value: typing.List["DataFactoryDatasetDelimitedTextHttpServerLocation"],
    ) -> None:
        jsii.set(self, "httpServerLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nullValue")
    def null_value(self) -> builtins.str:
        return jsii.get(self, "nullValue")

    @null_value.setter # type: ignore
    def null_value(self, value: builtins.str) -> None:
        jsii.set(self, "nullValue", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="quoteCharacter")
    def quote_character(self) -> builtins.str:
        return jsii.get(self, "quoteCharacter")

    @quote_character.setter # type: ignore
    def quote_character(self, value: builtins.str) -> None:
        jsii.set(self, "quoteCharacter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rowDelimiter")
    def row_delimiter(self) -> builtins.str:
        return jsii.get(self, "rowDelimiter")

    @row_delimiter.setter # type: ignore
    def row_delimiter(self, value: builtins.str) -> None:
        jsii.set(self, "rowDelimiter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(
        self,
    ) -> typing.List["DataFactoryDatasetDelimitedTextSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetDelimitedTextSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetDelimitedTextTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetDelimitedTextTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetDelimitedTextAzureBlobStorageLocation",
    jsii_struct_bases=[],
    name_mapping={"container": "container", "filename": "filename", "path": "path"},
)
class DataFactoryDatasetDelimitedTextAzureBlobStorageLocation:
    def __init__(
        self,
        *,
        container: builtins.str,
        filename: builtins.str,
        path: builtins.str,
    ) -> None:
        """
        :param container: -
        :param filename: -
        :param path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "container": container,
            "filename": filename,
            "path": path,
        }

    @builtins.property
    def container(self) -> builtins.str:
        result = self._values.get("container")
        assert result is not None, "Required property 'container' is missing"
        return result

    @builtins.property
    def filename(self) -> builtins.str:
        result = self._values.get("filename")
        assert result is not None, "Required property 'filename' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetDelimitedTextAzureBlobStorageLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetDelimitedTextConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "azure_blob_storage_location": "azureBlobStorageLocation",
        "column_delimiter": "columnDelimiter",
        "description": "description",
        "encoding": "encoding",
        "escape_character": "escapeCharacter",
        "first_row_as_header": "firstRowAsHeader",
        "folder": "folder",
        "http_server_location": "httpServerLocation",
        "null_value": "nullValue",
        "parameters": "parameters",
        "quote_character": "quoteCharacter",
        "row_delimiter": "rowDelimiter",
        "schema_column": "schemaColumn",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetDelimitedTextConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        azure_blob_storage_location: typing.Optional[typing.List[DataFactoryDatasetDelimitedTextAzureBlobStorageLocation]] = None,
        column_delimiter: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        encoding: typing.Optional[builtins.str] = None,
        escape_character: typing.Optional[builtins.str] = None,
        first_row_as_header: typing.Optional[builtins.bool] = None,
        folder: typing.Optional[builtins.str] = None,
        http_server_location: typing.Optional[typing.List["DataFactoryDatasetDelimitedTextHttpServerLocation"]] = None,
        null_value: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        quote_character: typing.Optional[builtins.str] = None,
        row_delimiter: typing.Optional[builtins.str] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetDelimitedTextSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetDelimitedTextTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param azure_blob_storage_location: azure_blob_storage_location block.
        :param column_delimiter: -
        :param description: -
        :param encoding: -
        :param escape_character: -
        :param first_row_as_header: -
        :param folder: -
        :param http_server_location: http_server_location block.
        :param null_value: -
        :param parameters: -
        :param quote_character: -
        :param row_delimiter: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetDelimitedTextTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if azure_blob_storage_location is not None:
            self._values["azure_blob_storage_location"] = azure_blob_storage_location
        if column_delimiter is not None:
            self._values["column_delimiter"] = column_delimiter
        if description is not None:
            self._values["description"] = description
        if encoding is not None:
            self._values["encoding"] = encoding
        if escape_character is not None:
            self._values["escape_character"] = escape_character
        if first_row_as_header is not None:
            self._values["first_row_as_header"] = first_row_as_header
        if folder is not None:
            self._values["folder"] = folder
        if http_server_location is not None:
            self._values["http_server_location"] = http_server_location
        if null_value is not None:
            self._values["null_value"] = null_value
        if parameters is not None:
            self._values["parameters"] = parameters
        if quote_character is not None:
            self._values["quote_character"] = quote_character
        if row_delimiter is not None:
            self._values["row_delimiter"] = row_delimiter
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def azure_blob_storage_location(
        self,
    ) -> typing.Optional[typing.List[DataFactoryDatasetDelimitedTextAzureBlobStorageLocation]]:
        """azure_blob_storage_location block."""
        result = self._values.get("azure_blob_storage_location")
        return result

    @builtins.property
    def column_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("column_delimiter")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def escape_character(self) -> typing.Optional[builtins.str]:
        result = self._values.get("escape_character")
        return result

    @builtins.property
    def first_row_as_header(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("first_row_as_header")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def http_server_location(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetDelimitedTextHttpServerLocation"]]:
        """http_server_location block."""
        result = self._values.get("http_server_location")
        return result

    @builtins.property
    def null_value(self) -> typing.Optional[builtins.str]:
        result = self._values.get("null_value")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def quote_character(self) -> typing.Optional[builtins.str]:
        result = self._values.get("quote_character")
        return result

    @builtins.property
    def row_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("row_delimiter")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetDelimitedTextSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetDelimitedTextTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetDelimitedTextConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetDelimitedTextHttpServerLocation",
    jsii_struct_bases=[],
    name_mapping={
        "filename": "filename",
        "path": "path",
        "relative_url": "relativeUrl",
    },
)
class DataFactoryDatasetDelimitedTextHttpServerLocation:
    def __init__(
        self,
        *,
        filename: builtins.str,
        path: builtins.str,
        relative_url: builtins.str,
    ) -> None:
        """
        :param filename: -
        :param path: -
        :param relative_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "filename": filename,
            "path": path,
            "relative_url": relative_url,
        }

    @builtins.property
    def filename(self) -> builtins.str:
        result = self._values.get("filename")
        assert result is not None, "Required property 'filename' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    @builtins.property
    def relative_url(self) -> builtins.str:
        result = self._values.get("relative_url")
        assert result is not None, "Required property 'relative_url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetDelimitedTextHttpServerLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetDelimitedTextSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetDelimitedTextSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetDelimitedTextSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetDelimitedTextTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetDelimitedTextTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetDelimitedTextTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetHttp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetHttp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        relative_url: typing.Optional[builtins.str] = None,
        request_body: typing.Optional[builtins.str] = None,
        request_method: typing.Optional[builtins.str] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetHttpSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetHttpTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param relative_url: -
        :param request_body: -
        :param request_method: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetHttpConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            folder=folder,
            parameters=parameters,
            relative_url=relative_url,
            request_body=request_body,
            request_method=request_method,
            schema_column=schema_column,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetHttp, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetRelativeUrl")
    def reset_relative_url(self) -> None:
        return jsii.invoke(self, "resetRelativeUrl", [])

    @jsii.member(jsii_name="resetRequestBody")
    def reset_request_body(self) -> None:
        return jsii.invoke(self, "resetRequestBody", [])

    @jsii.member(jsii_name="resetRequestMethod")
    def reset_request_method(self) -> None:
        return jsii.invoke(self, "resetRequestMethod", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relativeUrlInput")
    def relative_url_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "relativeUrlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestBodyInput")
    def request_body_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "requestBodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestMethodInput")
    def request_method_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "requestMethodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetHttpSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryDatasetHttpTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relativeUrl")
    def relative_url(self) -> builtins.str:
        return jsii.get(self, "relativeUrl")

    @relative_url.setter # type: ignore
    def relative_url(self, value: builtins.str) -> None:
        jsii.set(self, "relativeUrl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestBody")
    def request_body(self) -> builtins.str:
        return jsii.get(self, "requestBody")

    @request_body.setter # type: ignore
    def request_body(self, value: builtins.str) -> None:
        jsii.set(self, "requestBody", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestMethod")
    def request_method(self) -> builtins.str:
        return jsii.get(self, "requestMethod")

    @request_method.setter # type: ignore
    def request_method(self, value: builtins.str) -> None:
        jsii.set(self, "requestMethod", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(self) -> typing.List["DataFactoryDatasetHttpSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetHttpSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetHttpTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetHttpTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetHttpConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "folder": "folder",
        "parameters": "parameters",
        "relative_url": "relativeUrl",
        "request_body": "requestBody",
        "request_method": "requestMethod",
        "schema_column": "schemaColumn",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetHttpConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        relative_url: typing.Optional[builtins.str] = None,
        request_body: typing.Optional[builtins.str] = None,
        request_method: typing.Optional[builtins.str] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetHttpSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetHttpTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param relative_url: -
        :param request_body: -
        :param request_method: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetHttpTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if folder is not None:
            self._values["folder"] = folder
        if parameters is not None:
            self._values["parameters"] = parameters
        if relative_url is not None:
            self._values["relative_url"] = relative_url
        if request_body is not None:
            self._values["request_body"] = request_body
        if request_method is not None:
            self._values["request_method"] = request_method
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def relative_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("relative_url")
        return result

    @builtins.property
    def request_body(self) -> typing.Optional[builtins.str]:
        result = self._values.get("request_body")
        return result

    @builtins.property
    def request_method(self) -> typing.Optional[builtins.str]:
        result = self._values.get("request_method")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetHttpSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetHttpTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetHttpConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetHttpSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetHttpSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetHttpSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetHttpTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetHttpTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetHttpTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetJson(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetJson",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        azure_blob_storage_location: typing.Optional[typing.List["DataFactoryDatasetJsonAzureBlobStorageLocation"]] = None,
        description: typing.Optional[builtins.str] = None,
        encoding: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        http_server_location: typing.Optional[typing.List["DataFactoryDatasetJsonHttpServerLocation"]] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetJsonSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetJsonTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param azure_blob_storage_location: azure_blob_storage_location block.
        :param description: -
        :param encoding: -
        :param folder: -
        :param http_server_location: http_server_location block.
        :param parameters: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetJsonConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            azure_blob_storage_location=azure_blob_storage_location,
            description=description,
            encoding=encoding,
            folder=folder,
            http_server_location=http_server_location,
            parameters=parameters,
            schema_column=schema_column,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetJson, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetAzureBlobStorageLocation")
    def reset_azure_blob_storage_location(self) -> None:
        return jsii.invoke(self, "resetAzureBlobStorageLocation", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEncoding")
    def reset_encoding(self) -> None:
        return jsii.invoke(self, "resetEncoding", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetHttpServerLocation")
    def reset_http_server_location(self) -> None:
        return jsii.invoke(self, "resetHttpServerLocation", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureBlobStorageLocationInput")
    def azure_blob_storage_location_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetJsonAzureBlobStorageLocation"]]:
        return jsii.get(self, "azureBlobStorageLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encodingInput")
    def encoding_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "encodingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpServerLocationInput")
    def http_server_location_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetJsonHttpServerLocation"]]:
        return jsii.get(self, "httpServerLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetJsonSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryDatasetJsonTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureBlobStorageLocation")
    def azure_blob_storage_location(
        self,
    ) -> typing.List["DataFactoryDatasetJsonAzureBlobStorageLocation"]:
        return jsii.get(self, "azureBlobStorageLocation")

    @azure_blob_storage_location.setter # type: ignore
    def azure_blob_storage_location(
        self,
        value: typing.List["DataFactoryDatasetJsonAzureBlobStorageLocation"],
    ) -> None:
        jsii.set(self, "azureBlobStorageLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encoding")
    def encoding(self) -> builtins.str:
        return jsii.get(self, "encoding")

    @encoding.setter # type: ignore
    def encoding(self, value: builtins.str) -> None:
        jsii.set(self, "encoding", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpServerLocation")
    def http_server_location(
        self,
    ) -> typing.List["DataFactoryDatasetJsonHttpServerLocation"]:
        return jsii.get(self, "httpServerLocation")

    @http_server_location.setter # type: ignore
    def http_server_location(
        self,
        value: typing.List["DataFactoryDatasetJsonHttpServerLocation"],
    ) -> None:
        jsii.set(self, "httpServerLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(self) -> typing.List["DataFactoryDatasetJsonSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetJsonSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetJsonTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetJsonTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetJsonAzureBlobStorageLocation",
    jsii_struct_bases=[],
    name_mapping={"container": "container", "filename": "filename", "path": "path"},
)
class DataFactoryDatasetJsonAzureBlobStorageLocation:
    def __init__(
        self,
        *,
        container: builtins.str,
        filename: builtins.str,
        path: builtins.str,
    ) -> None:
        """
        :param container: -
        :param filename: -
        :param path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "container": container,
            "filename": filename,
            "path": path,
        }

    @builtins.property
    def container(self) -> builtins.str:
        result = self._values.get("container")
        assert result is not None, "Required property 'container' is missing"
        return result

    @builtins.property
    def filename(self) -> builtins.str:
        result = self._values.get("filename")
        assert result is not None, "Required property 'filename' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetJsonAzureBlobStorageLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetJsonConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "azure_blob_storage_location": "azureBlobStorageLocation",
        "description": "description",
        "encoding": "encoding",
        "folder": "folder",
        "http_server_location": "httpServerLocation",
        "parameters": "parameters",
        "schema_column": "schemaColumn",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetJsonConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        azure_blob_storage_location: typing.Optional[typing.List[DataFactoryDatasetJsonAzureBlobStorageLocation]] = None,
        description: typing.Optional[builtins.str] = None,
        encoding: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        http_server_location: typing.Optional[typing.List["DataFactoryDatasetJsonHttpServerLocation"]] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetJsonSchemaColumn"]] = None,
        timeouts: typing.Optional["DataFactoryDatasetJsonTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param azure_blob_storage_location: azure_blob_storage_location block.
        :param description: -
        :param encoding: -
        :param folder: -
        :param http_server_location: http_server_location block.
        :param parameters: -
        :param schema_column: schema_column block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetJsonTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if azure_blob_storage_location is not None:
            self._values["azure_blob_storage_location"] = azure_blob_storage_location
        if description is not None:
            self._values["description"] = description
        if encoding is not None:
            self._values["encoding"] = encoding
        if folder is not None:
            self._values["folder"] = folder
        if http_server_location is not None:
            self._values["http_server_location"] = http_server_location
        if parameters is not None:
            self._values["parameters"] = parameters
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def azure_blob_storage_location(
        self,
    ) -> typing.Optional[typing.List[DataFactoryDatasetJsonAzureBlobStorageLocation]]:
        """azure_blob_storage_location block."""
        result = self._values.get("azure_blob_storage_location")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def http_server_location(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetJsonHttpServerLocation"]]:
        """http_server_location block."""
        result = self._values.get("http_server_location")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetJsonSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetJsonTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetJsonConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetJsonHttpServerLocation",
    jsii_struct_bases=[],
    name_mapping={
        "filename": "filename",
        "path": "path",
        "relative_url": "relativeUrl",
    },
)
class DataFactoryDatasetJsonHttpServerLocation:
    def __init__(
        self,
        *,
        filename: builtins.str,
        path: builtins.str,
        relative_url: builtins.str,
    ) -> None:
        """
        :param filename: -
        :param path: -
        :param relative_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "filename": filename,
            "path": path,
            "relative_url": relative_url,
        }

    @builtins.property
    def filename(self) -> builtins.str:
        result = self._values.get("filename")
        assert result is not None, "Required property 'filename' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    @builtins.property
    def relative_url(self) -> builtins.str:
        result = self._values.get("relative_url")
        assert result is not None, "Required property 'relative_url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetJsonHttpServerLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetJsonSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetJsonSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetJsonSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetJsonTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetJsonTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetJsonTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetMysql(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetMysql",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetMysqlSchemaColumn"]] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryDatasetMysqlTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param table_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetMysqlConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            folder=folder,
            parameters=parameters,
            schema_column=schema_column,
            table_name=table_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetMysql, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTableName")
    def reset_table_name(self) -> None:
        return jsii.invoke(self, "resetTableName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetMysqlSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNameInput")
    def table_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tableNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryDatasetMysqlTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(self) -> typing.List["DataFactoryDatasetMysqlSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetMysqlSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableName")
    def table_name(self) -> builtins.str:
        return jsii.get(self, "tableName")

    @table_name.setter # type: ignore
    def table_name(self, value: builtins.str) -> None:
        jsii.set(self, "tableName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetMysqlTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetMysqlTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetMysqlConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "folder": "folder",
        "parameters": "parameters",
        "schema_column": "schemaColumn",
        "table_name": "tableName",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetMysqlConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetMysqlSchemaColumn"]] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryDatasetMysqlTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param table_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetMysqlTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if folder is not None:
            self._values["folder"] = folder
        if parameters is not None:
            self._values["parameters"] = parameters
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if table_name is not None:
            self._values["table_name"] = table_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetMysqlSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def table_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("table_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetMysqlTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetMysqlConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetMysqlSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetMysqlSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetMysqlSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetMysqlTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetMysqlTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetMysqlTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetPostgresql(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetPostgresql",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetPostgresqlSchemaColumn"]] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryDatasetPostgresqlTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param table_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetPostgresqlConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            folder=folder,
            parameters=parameters,
            schema_column=schema_column,
            table_name=table_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetPostgresql, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTableName")
    def reset_table_name(self) -> None:
        return jsii.invoke(self, "resetTableName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetPostgresqlSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNameInput")
    def table_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tableNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryDatasetPostgresqlTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(self) -> typing.List["DataFactoryDatasetPostgresqlSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetPostgresqlSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableName")
    def table_name(self) -> builtins.str:
        return jsii.get(self, "tableName")

    @table_name.setter # type: ignore
    def table_name(self, value: builtins.str) -> None:
        jsii.set(self, "tableName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetPostgresqlTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetPostgresqlTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetPostgresqlConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "folder": "folder",
        "parameters": "parameters",
        "schema_column": "schemaColumn",
        "table_name": "tableName",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetPostgresqlConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetPostgresqlSchemaColumn"]] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryDatasetPostgresqlTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param table_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetPostgresqlTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if folder is not None:
            self._values["folder"] = folder
        if parameters is not None:
            self._values["parameters"] = parameters
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if table_name is not None:
            self._values["table_name"] = table_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetPostgresqlSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def table_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("table_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetPostgresqlTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetPostgresqlConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetPostgresqlSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetPostgresqlSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetPostgresqlSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetPostgresqlTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetPostgresqlTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetPostgresqlTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryDatasetSqlServerTable(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryDatasetSqlServerTable",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetSqlServerTableSchemaColumn"]] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryDatasetSqlServerTableTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param table_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryDatasetSqlServerTableConfig(
            data_factory_name=data_factory_name,
            linked_service_name=linked_service_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            folder=folder,
            parameters=parameters,
            schema_column=schema_column,
            table_name=table_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryDatasetSqlServerTable, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFolder")
    def reset_folder(self) -> None:
        return jsii.invoke(self, "resetFolder", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetSchemaColumn")
    def reset_schema_column(self) -> None:
        return jsii.invoke(self, "resetSchemaColumn", [])

    @jsii.member(jsii_name="resetTableName")
    def reset_table_name(self) -> None:
        return jsii.invoke(self, "resetTableName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> builtins.str:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderInput")
    def folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumnInput")
    def schema_column_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetSqlServerTableSchemaColumn"]]:
        return jsii.get(self, "schemaColumnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNameInput")
    def table_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tableNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryDatasetSqlServerTableTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folder")
    def folder(self) -> builtins.str:
        return jsii.get(self, "folder")

    @folder.setter # type: ignore
    def folder(self, value: builtins.str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaColumn")
    def schema_column(
        self,
    ) -> typing.List["DataFactoryDatasetSqlServerTableSchemaColumn"]:
        return jsii.get(self, "schemaColumn")

    @schema_column.setter # type: ignore
    def schema_column(
        self,
        value: typing.List["DataFactoryDatasetSqlServerTableSchemaColumn"],
    ) -> None:
        jsii.set(self, "schemaColumn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableName")
    def table_name(self) -> builtins.str:
        return jsii.get(self, "tableName")

    @table_name.setter # type: ignore
    def table_name(self, value: builtins.str) -> None:
        jsii.set(self, "tableName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryDatasetSqlServerTableTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryDatasetSqlServerTableTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetSqlServerTableConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "linked_service_name": "linkedServiceName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "folder": "folder",
        "parameters": "parameters",
        "schema_column": "schemaColumn",
        "table_name": "tableName",
        "timeouts": "timeouts",
    },
)
class DataFactoryDatasetSqlServerTableConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        linked_service_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        folder: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        schema_column: typing.Optional[typing.List["DataFactoryDatasetSqlServerTableSchemaColumn"]] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryDatasetSqlServerTableTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param linked_service_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param folder: -
        :param parameters: -
        :param schema_column: schema_column block.
        :param table_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryDatasetSqlServerTableTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "linked_service_name": linked_service_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if folder is not None:
            self._values["folder"] = folder
        if parameters is not None:
            self._values["parameters"] = parameters
        if schema_column is not None:
            self._values["schema_column"] = schema_column
        if table_name is not None:
            self._values["table_name"] = table_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> builtins.str:
        result = self._values.get("linked_service_name")
        assert result is not None, "Required property 'linked_service_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def schema_column(
        self,
    ) -> typing.Optional[typing.List["DataFactoryDatasetSqlServerTableSchemaColumn"]]:
        """schema_column block."""
        result = self._values.get("schema_column")
        return result

    @builtins.property
    def table_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("table_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryDatasetSqlServerTableTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetSqlServerTableConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetSqlServerTableSchemaColumn",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "description": "description", "type": "type"},
)
class DataFactoryDatasetSqlServerTableSchemaColumn:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetSqlServerTableSchemaColumn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryDatasetSqlServerTableTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryDatasetSqlServerTableTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryDatasetSqlServerTableTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryGithubConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "account_name": "accountName",
        "branch_name": "branchName",
        "git_url": "gitUrl",
        "repository_name": "repositoryName",
        "root_folder": "rootFolder",
    },
)
class DataFactoryGithubConfiguration:
    def __init__(
        self,
        *,
        account_name: builtins.str,
        branch_name: builtins.str,
        git_url: builtins.str,
        repository_name: builtins.str,
        root_folder: builtins.str,
    ) -> None:
        """
        :param account_name: -
        :param branch_name: -
        :param git_url: -
        :param repository_name: -
        :param root_folder: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "branch_name": branch_name,
            "git_url": git_url,
            "repository_name": repository_name,
            "root_folder": root_folder,
        }

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def branch_name(self) -> builtins.str:
        result = self._values.get("branch_name")
        assert result is not None, "Required property 'branch_name' is missing"
        return result

    @builtins.property
    def git_url(self) -> builtins.str:
        result = self._values.get("git_url")
        assert result is not None, "Required property 'git_url' is missing"
        return result

    @builtins.property
    def repository_name(self) -> builtins.str:
        result = self._values.get("repository_name")
        assert result is not None, "Required property 'repository_name' is missing"
        return result

    @builtins.property
    def root_folder(self) -> builtins.str:
        result = self._values.get("root_folder")
        assert result is not None, "Required property 'root_folder' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryGithubConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class DataFactoryIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryIntegrationRuntimeManaged(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryIntegrationRuntimeManaged",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        node_size: builtins.str,
        resource_group_name: builtins.str,
        catalog_info: typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedCatalogInfo"]] = None,
        custom_setup_script: typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedCustomSetupScript"]] = None,
        description: typing.Optional[builtins.str] = None,
        edition: typing.Optional[builtins.str] = None,
        license_type: typing.Optional[builtins.str] = None,
        max_parallel_executions_per_node: typing.Optional[jsii.Number] = None,
        number_of_nodes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["DataFactoryIntegrationRuntimeManagedTimeouts"] = None,
        vnet_integration: typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedVnetIntegration"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param location: -
        :param name: -
        :param node_size: -
        :param resource_group_name: -
        :param catalog_info: catalog_info block.
        :param custom_setup_script: custom_setup_script block.
        :param description: -
        :param edition: -
        :param license_type: -
        :param max_parallel_executions_per_node: -
        :param number_of_nodes: -
        :param timeouts: timeouts block.
        :param vnet_integration: vnet_integration block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryIntegrationRuntimeManagedConfig(
            data_factory_name=data_factory_name,
            location=location,
            name=name,
            node_size=node_size,
            resource_group_name=resource_group_name,
            catalog_info=catalog_info,
            custom_setup_script=custom_setup_script,
            description=description,
            edition=edition,
            license_type=license_type,
            max_parallel_executions_per_node=max_parallel_executions_per_node,
            number_of_nodes=number_of_nodes,
            timeouts=timeouts,
            vnet_integration=vnet_integration,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryIntegrationRuntimeManaged, self, [scope, id, config])

    @jsii.member(jsii_name="resetCatalogInfo")
    def reset_catalog_info(self) -> None:
        return jsii.invoke(self, "resetCatalogInfo", [])

    @jsii.member(jsii_name="resetCustomSetupScript")
    def reset_custom_setup_script(self) -> None:
        return jsii.invoke(self, "resetCustomSetupScript", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEdition")
    def reset_edition(self) -> None:
        return jsii.invoke(self, "resetEdition", [])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetMaxParallelExecutionsPerNode")
    def reset_max_parallel_executions_per_node(self) -> None:
        return jsii.invoke(self, "resetMaxParallelExecutionsPerNode", [])

    @jsii.member(jsii_name="resetNumberOfNodes")
    def reset_number_of_nodes(self) -> None:
        return jsii.invoke(self, "resetNumberOfNodes", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVnetIntegration")
    def reset_vnet_integration(self) -> None:
        return jsii.invoke(self, "resetVnetIntegration", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeSizeInput")
    def node_size_input(self) -> builtins.str:
        return jsii.get(self, "nodeSizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="catalogInfoInput")
    def catalog_info_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedCatalogInfo"]]:
        return jsii.get(self, "catalogInfoInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customSetupScriptInput")
    def custom_setup_script_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedCustomSetupScript"]]:
        return jsii.get(self, "customSetupScriptInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="editionInput")
    def edition_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "editionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxParallelExecutionsPerNodeInput")
    def max_parallel_executions_per_node_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxParallelExecutionsPerNodeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfNodesInput")
    def number_of_nodes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "numberOfNodesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryIntegrationRuntimeManagedTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vnetIntegrationInput")
    def vnet_integration_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedVnetIntegration"]]:
        return jsii.get(self, "vnetIntegrationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="catalogInfo")
    def catalog_info(
        self,
    ) -> typing.List["DataFactoryIntegrationRuntimeManagedCatalogInfo"]:
        return jsii.get(self, "catalogInfo")

    @catalog_info.setter # type: ignore
    def catalog_info(
        self,
        value: typing.List["DataFactoryIntegrationRuntimeManagedCatalogInfo"],
    ) -> None:
        jsii.set(self, "catalogInfo", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customSetupScript")
    def custom_setup_script(
        self,
    ) -> typing.List["DataFactoryIntegrationRuntimeManagedCustomSetupScript"]:
        return jsii.get(self, "customSetupScript")

    @custom_setup_script.setter # type: ignore
    def custom_setup_script(
        self,
        value: typing.List["DataFactoryIntegrationRuntimeManagedCustomSetupScript"],
    ) -> None:
        jsii.set(self, "customSetupScript", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="edition")
    def edition(self) -> builtins.str:
        return jsii.get(self, "edition")

    @edition.setter # type: ignore
    def edition(self, value: builtins.str) -> None:
        jsii.set(self, "edition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxParallelExecutionsPerNode")
    def max_parallel_executions_per_node(self) -> jsii.Number:
        return jsii.get(self, "maxParallelExecutionsPerNode")

    @max_parallel_executions_per_node.setter # type: ignore
    def max_parallel_executions_per_node(self, value: jsii.Number) -> None:
        jsii.set(self, "maxParallelExecutionsPerNode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeSize")
    def node_size(self) -> builtins.str:
        return jsii.get(self, "nodeSize")

    @node_size.setter # type: ignore
    def node_size(self, value: builtins.str) -> None:
        jsii.set(self, "nodeSize", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfNodes")
    def number_of_nodes(self) -> jsii.Number:
        return jsii.get(self, "numberOfNodes")

    @number_of_nodes.setter # type: ignore
    def number_of_nodes(self, value: jsii.Number) -> None:
        jsii.set(self, "numberOfNodes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryIntegrationRuntimeManagedTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryIntegrationRuntimeManagedTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vnetIntegration")
    def vnet_integration(
        self,
    ) -> typing.List["DataFactoryIntegrationRuntimeManagedVnetIntegration"]:
        return jsii.get(self, "vnetIntegration")

    @vnet_integration.setter # type: ignore
    def vnet_integration(
        self,
        value: typing.List["DataFactoryIntegrationRuntimeManagedVnetIntegration"],
    ) -> None:
        jsii.set(self, "vnetIntegration", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeManagedCatalogInfo",
    jsii_struct_bases=[],
    name_mapping={
        "administrator_login": "administratorLogin",
        "administrator_password": "administratorPassword",
        "server_endpoint": "serverEndpoint",
        "pricing_tier": "pricingTier",
    },
)
class DataFactoryIntegrationRuntimeManagedCatalogInfo:
    def __init__(
        self,
        *,
        administrator_login: builtins.str,
        administrator_password: builtins.str,
        server_endpoint: builtins.str,
        pricing_tier: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param administrator_login: -
        :param administrator_password: -
        :param server_endpoint: -
        :param pricing_tier: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "administrator_login": administrator_login,
            "administrator_password": administrator_password,
            "server_endpoint": server_endpoint,
        }
        if pricing_tier is not None:
            self._values["pricing_tier"] = pricing_tier

    @builtins.property
    def administrator_login(self) -> builtins.str:
        result = self._values.get("administrator_login")
        assert result is not None, "Required property 'administrator_login' is missing"
        return result

    @builtins.property
    def administrator_password(self) -> builtins.str:
        result = self._values.get("administrator_password")
        assert result is not None, "Required property 'administrator_password' is missing"
        return result

    @builtins.property
    def server_endpoint(self) -> builtins.str:
        result = self._values.get("server_endpoint")
        assert result is not None, "Required property 'server_endpoint' is missing"
        return result

    @builtins.property
    def pricing_tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("pricing_tier")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeManagedCatalogInfo(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeManagedConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "location": "location",
        "name": "name",
        "node_size": "nodeSize",
        "resource_group_name": "resourceGroupName",
        "catalog_info": "catalogInfo",
        "custom_setup_script": "customSetupScript",
        "description": "description",
        "edition": "edition",
        "license_type": "licenseType",
        "max_parallel_executions_per_node": "maxParallelExecutionsPerNode",
        "number_of_nodes": "numberOfNodes",
        "timeouts": "timeouts",
        "vnet_integration": "vnetIntegration",
    },
)
class DataFactoryIntegrationRuntimeManagedConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        node_size: builtins.str,
        resource_group_name: builtins.str,
        catalog_info: typing.Optional[typing.List[DataFactoryIntegrationRuntimeManagedCatalogInfo]] = None,
        custom_setup_script: typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedCustomSetupScript"]] = None,
        description: typing.Optional[builtins.str] = None,
        edition: typing.Optional[builtins.str] = None,
        license_type: typing.Optional[builtins.str] = None,
        max_parallel_executions_per_node: typing.Optional[jsii.Number] = None,
        number_of_nodes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["DataFactoryIntegrationRuntimeManagedTimeouts"] = None,
        vnet_integration: typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedVnetIntegration"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param location: -
        :param name: -
        :param node_size: -
        :param resource_group_name: -
        :param catalog_info: catalog_info block.
        :param custom_setup_script: custom_setup_script block.
        :param description: -
        :param edition: -
        :param license_type: -
        :param max_parallel_executions_per_node: -
        :param number_of_nodes: -
        :param timeouts: timeouts block.
        :param vnet_integration: vnet_integration block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryIntegrationRuntimeManagedTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "location": location,
            "name": name,
            "node_size": node_size,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if catalog_info is not None:
            self._values["catalog_info"] = catalog_info
        if custom_setup_script is not None:
            self._values["custom_setup_script"] = custom_setup_script
        if description is not None:
            self._values["description"] = description
        if edition is not None:
            self._values["edition"] = edition
        if license_type is not None:
            self._values["license_type"] = license_type
        if max_parallel_executions_per_node is not None:
            self._values["max_parallel_executions_per_node"] = max_parallel_executions_per_node
        if number_of_nodes is not None:
            self._values["number_of_nodes"] = number_of_nodes
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if vnet_integration is not None:
            self._values["vnet_integration"] = vnet_integration

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def node_size(self) -> builtins.str:
        result = self._values.get("node_size")
        assert result is not None, "Required property 'node_size' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def catalog_info(
        self,
    ) -> typing.Optional[typing.List[DataFactoryIntegrationRuntimeManagedCatalogInfo]]:
        """catalog_info block."""
        result = self._values.get("catalog_info")
        return result

    @builtins.property
    def custom_setup_script(
        self,
    ) -> typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedCustomSetupScript"]]:
        """custom_setup_script block."""
        result = self._values.get("custom_setup_script")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def edition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("edition")
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def max_parallel_executions_per_node(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_parallel_executions_per_node")
        return result

    @builtins.property
    def number_of_nodes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("number_of_nodes")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataFactoryIntegrationRuntimeManagedTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def vnet_integration(
        self,
    ) -> typing.Optional[typing.List["DataFactoryIntegrationRuntimeManagedVnetIntegration"]]:
        """vnet_integration block."""
        result = self._values.get("vnet_integration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeManagedConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeManagedCustomSetupScript",
    jsii_struct_bases=[],
    name_mapping={"blob_container_uri": "blobContainerUri", "sas_token": "sasToken"},
)
class DataFactoryIntegrationRuntimeManagedCustomSetupScript:
    def __init__(
        self,
        *,
        blob_container_uri: builtins.str,
        sas_token: builtins.str,
    ) -> None:
        """
        :param blob_container_uri: -
        :param sas_token: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "blob_container_uri": blob_container_uri,
            "sas_token": sas_token,
        }

    @builtins.property
    def blob_container_uri(self) -> builtins.str:
        result = self._values.get("blob_container_uri")
        assert result is not None, "Required property 'blob_container_uri' is missing"
        return result

    @builtins.property
    def sas_token(self) -> builtins.str:
        result = self._values.get("sas_token")
        assert result is not None, "Required property 'sas_token' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeManagedCustomSetupScript(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeManagedTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryIntegrationRuntimeManagedTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeManagedTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeManagedVnetIntegration",
    jsii_struct_bases=[],
    name_mapping={"subnet_name": "subnetName", "vnet_id": "vnetId"},
)
class DataFactoryIntegrationRuntimeManagedVnetIntegration:
    def __init__(self, *, subnet_name: builtins.str, vnet_id: builtins.str) -> None:
        """
        :param subnet_name: -
        :param vnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "subnet_name": subnet_name,
            "vnet_id": vnet_id,
        }

    @builtins.property
    def subnet_name(self) -> builtins.str:
        result = self._values.get("subnet_name")
        assert result is not None, "Required property 'subnet_name' is missing"
        return result

    @builtins.property
    def vnet_id(self) -> builtins.str:
        result = self._values.get("vnet_id")
        assert result is not None, "Required property 'vnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeManagedVnetIntegration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryIntegrationRuntimeSelfHosted(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryIntegrationRuntimeSelfHosted",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        rbac_authorization: typing.Optional[typing.List["DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization"]] = None,
        timeouts: typing.Optional["DataFactoryIntegrationRuntimeSelfHostedTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param rbac_authorization: rbac_authorization block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryIntegrationRuntimeSelfHostedConfig(
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            rbac_authorization=rbac_authorization,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryIntegrationRuntimeSelfHosted, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetRbacAuthorization")
    def reset_rbac_authorization(self) -> None:
        return jsii.invoke(self, "resetRbacAuthorization", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authKey1")
    def auth_key1(self) -> builtins.str:
        return jsii.get(self, "authKey1")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authKey2")
    def auth_key2(self) -> builtins.str:
        return jsii.get(self, "authKey2")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rbacAuthorizationInput")
    def rbac_authorization_input(
        self,
    ) -> typing.Optional[typing.List["DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization"]]:
        return jsii.get(self, "rbacAuthorizationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryIntegrationRuntimeSelfHostedTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rbacAuthorization")
    def rbac_authorization(
        self,
    ) -> typing.List["DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization"]:
        return jsii.get(self, "rbacAuthorization")

    @rbac_authorization.setter # type: ignore
    def rbac_authorization(
        self,
        value: typing.List["DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization"],
    ) -> None:
        jsii.set(self, "rbacAuthorization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryIntegrationRuntimeSelfHostedTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataFactoryIntegrationRuntimeSelfHostedTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeSelfHostedConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "rbac_authorization": "rbacAuthorization",
        "timeouts": "timeouts",
    },
)
class DataFactoryIntegrationRuntimeSelfHostedConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        rbac_authorization: typing.Optional[typing.List["DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization"]] = None,
        timeouts: typing.Optional["DataFactoryIntegrationRuntimeSelfHostedTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param rbac_authorization: rbac_authorization block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryIntegrationRuntimeSelfHostedTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if rbac_authorization is not None:
            self._values["rbac_authorization"] = rbac_authorization
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def rbac_authorization(
        self,
    ) -> typing.Optional[typing.List["DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization"]]:
        """rbac_authorization block."""
        result = self._values.get("rbac_authorization")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataFactoryIntegrationRuntimeSelfHostedTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeSelfHostedConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization",
    jsii_struct_bases=[],
    name_mapping={"resource_id": "resourceId"},
)
class DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization:
    def __init__(self, *, resource_id: builtins.str) -> None:
        """
        :param resource_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "resource_id": resource_id,
        }

    @builtins.property
    def resource_id(self) -> builtins.str:
        result = self._values.get("resource_id")
        assert result is not None, "Required property 'resource_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryIntegrationRuntimeSelfHostedTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryIntegrationRuntimeSelfHostedTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryIntegrationRuntimeSelfHostedTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceAzureBlobStorage(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceAzureBlobStorage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureBlobStorageTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceAzureBlobStorageConfig(
            connection_string=connection_string,
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceAzureBlobStorage, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureBlobStorageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceAzureBlobStorageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataFactoryLinkedServiceAzureBlobStorageTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureBlobStorageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceAzureBlobStorageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureBlobStorageTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceAzureBlobStorageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureBlobStorageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureBlobStorageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureBlobStorageTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceAzureBlobStorageTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureBlobStorageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceAzureFileStorage(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceAzureFileStorage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        host: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureFileStorageTimeouts"] = None,
        user_id: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param host: -
        :param integration_runtime_name: -
        :param parameters: -
        :param password: -
        :param timeouts: timeouts block.
        :param user_id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceAzureFileStorageConfig(
            connection_string=connection_string,
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            host=host,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            password=password,
            timeouts=timeouts,
            user_id=user_id,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceAzureFileStorage, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetHost")
    def reset_host(self) -> None:
        return jsii.invoke(self, "resetHost", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUserId")
    def reset_user_id(self) -> None:
        return jsii.invoke(self, "resetUserId", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostInput")
    def host_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "hostInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureFileStorageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userIdInput")
    def user_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "userIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="host")
    def host(self) -> builtins.str:
        return jsii.get(self, "host")

    @host.setter # type: ignore
    def host(self, value: builtins.str) -> None:
        jsii.set(self, "host", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceAzureFileStorageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataFactoryLinkedServiceAzureFileStorageTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userId")
    def user_id(self) -> builtins.str:
        return jsii.get(self, "userId")

    @user_id.setter # type: ignore
    def user_id(self, value: builtins.str) -> None:
        jsii.set(self, "userId", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureFileStorageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "host": "host",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "password": "password",
        "timeouts": "timeouts",
        "user_id": "userId",
    },
)
class DataFactoryLinkedServiceAzureFileStorageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        host: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureFileStorageTimeouts"] = None,
        user_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param host: -
        :param integration_runtime_name: -
        :param parameters: -
        :param password: -
        :param timeouts: timeouts block.
        :param user_id: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceAzureFileStorageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if host is not None:
            self._values["host"] = host
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if password is not None:
            self._values["password"] = password
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if user_id is not None:
            self._values["user_id"] = user_id

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def host(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureFileStorageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def user_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("user_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureFileStorageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureFileStorageTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceAzureFileStorageTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureFileStorageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceAzureFunction(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceAzureFunction",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        key: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureFunctionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param key: -
        :param name: -
        :param resource_group_name: -
        :param url: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceAzureFunctionConfig(
            data_factory_name=data_factory_name,
            key=key,
            name=name,
            resource_group_name=resource_group_name,
            url=url,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceAzureFunction, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyInput")
    def key_input(self) -> builtins.str:
        return jsii.get(self, "keyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlInput")
    def url_input(self) -> builtins.str:
        return jsii.get(self, "urlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureFunctionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="key")
    def key(self) -> builtins.str:
        return jsii.get(self, "key")

    @key.setter # type: ignore
    def key(self, value: builtins.str) -> None:
        jsii.set(self, "key", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceAzureFunctionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServiceAzureFunctionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="url")
    def url(self) -> builtins.str:
        return jsii.get(self, "url")

    @url.setter # type: ignore
    def url(self, value: builtins.str) -> None:
        jsii.set(self, "url", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureFunctionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "key": "key",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "url": "url",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceAzureFunctionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        key: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureFunctionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param key: -
        :param name: -
        :param resource_group_name: -
        :param url: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceAzureFunctionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "key": key,
            "name": name,
            "resource_group_name": resource_group_name,
            "url": url,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureFunctionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureFunctionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureFunctionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceAzureFunctionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureFunctionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceAzureSqlDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceAzureSqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureSqlDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceAzureSqlDatabaseConfig(
            connection_string=connection_string,
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceAzureSqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureSqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceAzureSqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataFactoryLinkedServiceAzureSqlDatabaseTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureSqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceAzureSqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceAzureSqlDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceAzureSqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceAzureSqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureSqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceAzureSqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceAzureSqlDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceAzureSqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceCosmosdb(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceCosmosdb",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        account_endpoint: typing.Optional[builtins.str] = None,
        account_key: typing.Optional[builtins.str] = None,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        connection_string: typing.Optional[builtins.str] = None,
        database: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceCosmosdbTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param account_endpoint: -
        :param account_key: -
        :param additional_properties: -
        :param annotations: -
        :param connection_string: -
        :param database: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceCosmosdbConfig(
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            account_endpoint=account_endpoint,
            account_key=account_key,
            additional_properties=additional_properties,
            annotations=annotations,
            connection_string=connection_string,
            database=database,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceCosmosdb, self, [scope, id, config])

    @jsii.member(jsii_name="resetAccountEndpoint")
    def reset_account_endpoint(self) -> None:
        return jsii.invoke(self, "resetAccountEndpoint", [])

    @jsii.member(jsii_name="resetAccountKey")
    def reset_account_key(self) -> None:
        return jsii.invoke(self, "resetAccountKey", [])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetConnectionString")
    def reset_connection_string(self) -> None:
        return jsii.invoke(self, "resetConnectionString", [])

    @jsii.member(jsii_name="resetDatabase")
    def reset_database(self) -> None:
        return jsii.invoke(self, "resetDatabase", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountEndpointInput")
    def account_endpoint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "accountEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountKeyInput")
    def account_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "accountKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseInput")
    def database_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "databaseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceCosmosdbTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountEndpoint")
    def account_endpoint(self) -> builtins.str:
        return jsii.get(self, "accountEndpoint")

    @account_endpoint.setter # type: ignore
    def account_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "accountEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountKey")
    def account_key(self) -> builtins.str:
        return jsii.get(self, "accountKey")

    @account_key.setter # type: ignore
    def account_key(self, value: builtins.str) -> None:
        jsii.set(self, "accountKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="database")
    def database(self) -> builtins.str:
        return jsii.get(self, "database")

    @database.setter # type: ignore
    def database(self, value: builtins.str) -> None:
        jsii.set(self, "database", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceCosmosdbTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServiceCosmosdbTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceCosmosdbConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "account_endpoint": "accountEndpoint",
        "account_key": "accountKey",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "connection_string": "connectionString",
        "database": "database",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceCosmosdbConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        account_endpoint: typing.Optional[builtins.str] = None,
        account_key: typing.Optional[builtins.str] = None,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        connection_string: typing.Optional[builtins.str] = None,
        database: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceCosmosdbTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param account_endpoint: -
        :param account_key: -
        :param additional_properties: -
        :param annotations: -
        :param connection_string: -
        :param database: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceCosmosdbTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if account_endpoint is not None:
            self._values["account_endpoint"] = account_endpoint
        if account_key is not None:
            self._values["account_key"] = account_key
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if connection_string is not None:
            self._values["connection_string"] = connection_string
        if database is not None:
            self._values["database"] = database
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def account_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("account_endpoint")
        return result

    @builtins.property
    def account_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("account_key")
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def connection_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("connection_string")
        return result

    @builtins.property
    def database(self) -> typing.Optional[builtins.str]:
        result = self._values.get("database")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryLinkedServiceCosmosdbTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceCosmosdbConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceCosmosdbTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceCosmosdbTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceCosmosdbTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceDataLakeStorageGen2(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceDataLakeStorageGen2",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        service_principal_id: typing.Optional[builtins.str] = None,
        service_principal_key: typing.Optional[builtins.str] = None,
        tenant: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceDataLakeStorageGen2Timeouts"] = None,
        use_managed_identity: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param url: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param service_principal_id: -
        :param service_principal_key: -
        :param tenant: -
        :param timeouts: timeouts block.
        :param use_managed_identity: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceDataLakeStorageGen2Config(
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            url=url,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            service_principal_id=service_principal_id,
            service_principal_key=service_principal_key,
            tenant=tenant,
            timeouts=timeouts,
            use_managed_identity=use_managed_identity,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceDataLakeStorageGen2, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetServicePrincipalId")
    def reset_service_principal_id(self) -> None:
        return jsii.invoke(self, "resetServicePrincipalId", [])

    @jsii.member(jsii_name="resetServicePrincipalKey")
    def reset_service_principal_key(self) -> None:
        return jsii.invoke(self, "resetServicePrincipalKey", [])

    @jsii.member(jsii_name="resetTenant")
    def reset_tenant(self) -> None:
        return jsii.invoke(self, "resetTenant", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUseManagedIdentity")
    def reset_use_managed_identity(self) -> None:
        return jsii.invoke(self, "resetUseManagedIdentity", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlInput")
    def url_input(self) -> builtins.str:
        return jsii.get(self, "urlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicePrincipalIdInput")
    def service_principal_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "servicePrincipalIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicePrincipalKeyInput")
    def service_principal_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "servicePrincipalKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantInput")
    def tenant_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tenantInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceDataLakeStorageGen2Timeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useManagedIdentityInput")
    def use_managed_identity_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "useManagedIdentityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicePrincipalId")
    def service_principal_id(self) -> builtins.str:
        return jsii.get(self, "servicePrincipalId")

    @service_principal_id.setter # type: ignore
    def service_principal_id(self, value: builtins.str) -> None:
        jsii.set(self, "servicePrincipalId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicePrincipalKey")
    def service_principal_key(self) -> builtins.str:
        return jsii.get(self, "servicePrincipalKey")

    @service_principal_key.setter # type: ignore
    def service_principal_key(self, value: builtins.str) -> None:
        jsii.set(self, "servicePrincipalKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenant")
    def tenant(self) -> builtins.str:
        return jsii.get(self, "tenant")

    @tenant.setter # type: ignore
    def tenant(self, value: builtins.str) -> None:
        jsii.set(self, "tenant", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceDataLakeStorageGen2Timeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "DataFactoryLinkedServiceDataLakeStorageGen2Timeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="url")
    def url(self) -> builtins.str:
        return jsii.get(self, "url")

    @url.setter # type: ignore
    def url(self, value: builtins.str) -> None:
        jsii.set(self, "url", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useManagedIdentity")
    def use_managed_identity(self) -> builtins.bool:
        return jsii.get(self, "useManagedIdentity")

    @use_managed_identity.setter # type: ignore
    def use_managed_identity(self, value: builtins.bool) -> None:
        jsii.set(self, "useManagedIdentity", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceDataLakeStorageGen2Config",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "url": "url",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "service_principal_id": "servicePrincipalId",
        "service_principal_key": "servicePrincipalKey",
        "tenant": "tenant",
        "timeouts": "timeouts",
        "use_managed_identity": "useManagedIdentity",
    },
)
class DataFactoryLinkedServiceDataLakeStorageGen2Config(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        service_principal_id: typing.Optional[builtins.str] = None,
        service_principal_key: typing.Optional[builtins.str] = None,
        tenant: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceDataLakeStorageGen2Timeouts"] = None,
        use_managed_identity: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param url: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param service_principal_id: -
        :param service_principal_key: -
        :param tenant: -
        :param timeouts: timeouts block.
        :param use_managed_identity: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceDataLakeStorageGen2Timeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "url": url,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if service_principal_id is not None:
            self._values["service_principal_id"] = service_principal_id
        if service_principal_key is not None:
            self._values["service_principal_key"] = service_principal_key
        if tenant is not None:
            self._values["tenant"] = tenant
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if use_managed_identity is not None:
            self._values["use_managed_identity"] = use_managed_identity

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def service_principal_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("service_principal_id")
        return result

    @builtins.property
    def service_principal_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("service_principal_key")
        return result

    @builtins.property
    def tenant(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tenant")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceDataLakeStorageGen2Timeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def use_managed_identity(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_managed_identity")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceDataLakeStorageGen2Config(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceDataLakeStorageGen2Timeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceDataLakeStorageGen2Timeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceDataLakeStorageGen2Timeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceKeyVault(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceKeyVault",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        key_vault_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceKeyVaultTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param key_vault_id: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceKeyVaultConfig(
            data_factory_name=data_factory_name,
            key_vault_id=key_vault_id,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceKeyVault, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceKeyVaultTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceKeyVaultTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServiceKeyVaultTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceKeyVaultConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceKeyVaultConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        key_vault_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceKeyVaultTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param key_vault_id: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceKeyVaultTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "key_vault_id": key_vault_id,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryLinkedServiceKeyVaultTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceKeyVaultConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceKeyVaultTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceKeyVaultTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceKeyVaultTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceMysql(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceMysql",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceMysqlTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceMysqlConfig(
            connection_string=connection_string,
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceMysql, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceMysqlTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceMysqlTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServiceMysqlTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceMysqlConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceMysqlConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceMysqlTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceMysqlTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryLinkedServiceMysqlTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceMysqlConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceMysqlTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceMysqlTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceMysqlTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServicePostgresql(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServicePostgresql",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServicePostgresqlTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServicePostgresqlConfig(
            connection_string=connection_string,
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServicePostgresql, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServicePostgresqlTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServicePostgresqlTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServicePostgresqlTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServicePostgresqlConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServicePostgresqlConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServicePostgresqlTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServicePostgresqlTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryLinkedServicePostgresqlTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServicePostgresqlConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServicePostgresqlTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServicePostgresqlTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServicePostgresqlTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceSftp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceSftp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        authentication_type: builtins.str,
        data_factory_name: builtins.str,
        host: builtins.str,
        name: builtins.str,
        password: builtins.str,
        port: jsii.Number,
        resource_group_name: builtins.str,
        username: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceSftpTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param authentication_type: -
        :param data_factory_name: -
        :param host: -
        :param name: -
        :param password: -
        :param port: -
        :param resource_group_name: -
        :param username: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceSftpConfig(
            authentication_type=authentication_type,
            data_factory_name=data_factory_name,
            host=host,
            name=name,
            password=password,
            port=port,
            resource_group_name=resource_group_name,
            username=username,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceSftp, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationTypeInput")
    def authentication_type_input(self) -> builtins.str:
        return jsii.get(self, "authenticationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostInput")
    def host_input(self) -> builtins.str:
        return jsii.get(self, "hostInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> builtins.str:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portInput")
    def port_input(self) -> jsii.Number:
        return jsii.get(self, "portInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usernameInput")
    def username_input(self) -> builtins.str:
        return jsii.get(self, "usernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryLinkedServiceSftpTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationType")
    def authentication_type(self) -> builtins.str:
        return jsii.get(self, "authenticationType")

    @authentication_type.setter # type: ignore
    def authentication_type(self, value: builtins.str) -> None:
        jsii.set(self, "authenticationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="host")
    def host(self) -> builtins.str:
        return jsii.get(self, "host")

    @host.setter # type: ignore
    def host(self, value: builtins.str) -> None:
        jsii.set(self, "host", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @port.setter # type: ignore
    def port(self, value: jsii.Number) -> None:
        jsii.set(self, "port", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceSftpTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServiceSftpTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")

    @username.setter # type: ignore
    def username(self, value: builtins.str) -> None:
        jsii.set(self, "username", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceSftpConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "authentication_type": "authenticationType",
        "data_factory_name": "dataFactoryName",
        "host": "host",
        "name": "name",
        "password": "password",
        "port": "port",
        "resource_group_name": "resourceGroupName",
        "username": "username",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceSftpConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        authentication_type: builtins.str,
        data_factory_name: builtins.str,
        host: builtins.str,
        name: builtins.str,
        password: builtins.str,
        port: jsii.Number,
        resource_group_name: builtins.str,
        username: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceSftpTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param authentication_type: -
        :param data_factory_name: -
        :param host: -
        :param name: -
        :param password: -
        :param port: -
        :param resource_group_name: -
        :param username: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceSftpTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "authentication_type": authentication_type,
            "data_factory_name": data_factory_name,
            "host": host,
            "name": name,
            "password": password,
            "port": port,
            "resource_group_name": resource_group_name,
            "username": username,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def authentication_type(self) -> builtins.str:
        result = self._values.get("authentication_type")
        assert result is not None, "Required property 'authentication_type' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def host(self) -> builtins.str:
        result = self._values.get("host")
        assert result is not None, "Required property 'host' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryLinkedServiceSftpTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceSftpConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceSftpTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceSftpTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceSftpTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceSqlServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceSqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceSqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceSqlServerConfig(
            connection_string=connection_string,
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceSqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataFactoryLinkedServiceSqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceSqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServiceSqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceSqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class DataFactoryLinkedServiceSqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceSqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceSqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryLinkedServiceSqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceSqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceSqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceSqlServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceSqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryLinkedServiceWeb(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryLinkedServiceWeb",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        authentication_type: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceWebTimeouts"] = None,
        username: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param authentication_type: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param url: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param password: -
        :param timeouts: timeouts block.
        :param username: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryLinkedServiceWebConfig(
            authentication_type=authentication_type,
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            url=url,
            additional_properties=additional_properties,
            annotations=annotations,
            description=description,
            integration_runtime_name=integration_runtime_name,
            parameters=parameters,
            password=password,
            timeouts=timeouts,
            username=username,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryLinkedServiceWeb, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalProperties")
    def reset_additional_properties(self) -> None:
        return jsii.invoke(self, "resetAdditionalProperties", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetIntegrationRuntimeName")
    def reset_integration_runtime_name(self) -> None:
        return jsii.invoke(self, "resetIntegrationRuntimeName", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUsername")
    def reset_username(self) -> None:
        return jsii.invoke(self, "resetUsername", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationTypeInput")
    def authentication_type_input(self) -> builtins.str:
        return jsii.get(self, "authenticationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="urlInput")
    def url_input(self) -> builtins.str:
        return jsii.get(self, "urlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalPropertiesInput")
    def additional_properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "additionalPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeNameInput")
    def integration_runtime_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationRuntimeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryLinkedServiceWebTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usernameInput")
    def username_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "usernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalProperties")
    def additional_properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "additionalProperties")

    @additional_properties.setter # type: ignore
    def additional_properties(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "additionalProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationType")
    def authentication_type(self) -> builtins.str:
        return jsii.get(self, "authenticationType")

    @authentication_type.setter # type: ignore
    def authentication_type(self, value: builtins.str) -> None:
        jsii.set(self, "authenticationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationRuntimeName")
    def integration_runtime_name(self) -> builtins.str:
        return jsii.get(self, "integrationRuntimeName")

    @integration_runtime_name.setter # type: ignore
    def integration_runtime_name(self, value: builtins.str) -> None:
        jsii.set(self, "integrationRuntimeName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryLinkedServiceWebTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryLinkedServiceWebTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="url")
    def url(self) -> builtins.str:
        return jsii.get(self, "url")

    @url.setter # type: ignore
    def url(self, value: builtins.str) -> None:
        jsii.set(self, "url", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")

    @username.setter # type: ignore
    def username(self, value: builtins.str) -> None:
        jsii.set(self, "username", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceWebConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "authentication_type": "authenticationType",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "url": "url",
        "additional_properties": "additionalProperties",
        "annotations": "annotations",
        "description": "description",
        "integration_runtime_name": "integrationRuntimeName",
        "parameters": "parameters",
        "password": "password",
        "timeouts": "timeouts",
        "username": "username",
    },
)
class DataFactoryLinkedServiceWebConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        authentication_type: builtins.str,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        url: builtins.str,
        additional_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        integration_runtime_name: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryLinkedServiceWebTimeouts"] = None,
        username: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param authentication_type: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param url: -
        :param additional_properties: -
        :param annotations: -
        :param description: -
        :param integration_runtime_name: -
        :param parameters: -
        :param password: -
        :param timeouts: timeouts block.
        :param username: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryLinkedServiceWebTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "authentication_type": authentication_type,
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "url": url,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_properties is not None:
            self._values["additional_properties"] = additional_properties
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if integration_runtime_name is not None:
            self._values["integration_runtime_name"] = integration_runtime_name
        if parameters is not None:
            self._values["parameters"] = parameters
        if password is not None:
            self._values["password"] = password
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if username is not None:
            self._values["username"] = username

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def authentication_type(self) -> builtins.str:
        result = self._values.get("authentication_type")
        assert result is not None, "Required property 'authentication_type' is missing"
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    @builtins.property
    def additional_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_properties")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def integration_runtime_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_runtime_name")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryLinkedServiceWebTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def username(self) -> typing.Optional[builtins.str]:
        result = self._values.get("username")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceWebConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryLinkedServiceWebTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryLinkedServiceWebTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryLinkedServiceWebTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryPipeline(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryPipeline",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        activities_json: typing.Optional[builtins.str] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryPipelineTimeouts"] = None,
        variables: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param activities_json: -
        :param annotations: -
        :param description: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param variables: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryPipelineConfig(
            data_factory_name=data_factory_name,
            name=name,
            resource_group_name=resource_group_name,
            activities_json=activities_json,
            annotations=annotations,
            description=description,
            parameters=parameters,
            timeouts=timeouts,
            variables=variables,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryPipeline, self, [scope, id, config])

    @jsii.member(jsii_name="resetActivitiesJson")
    def reset_activities_json(self) -> None:
        return jsii.invoke(self, "resetActivitiesJson", [])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVariables")
    def reset_variables(self) -> None:
        return jsii.invoke(self, "resetVariables", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activitiesJsonInput")
    def activities_json_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "activitiesJsonInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryPipelineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="variablesInput")
    def variables_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "variablesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activitiesJson")
    def activities_json(self) -> builtins.str:
        return jsii.get(self, "activitiesJson")

    @activities_json.setter # type: ignore
    def activities_json(self, value: builtins.str) -> None:
        jsii.set(self, "activitiesJson", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryPipelineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryPipelineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="variables")
    def variables(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "variables")

    @variables.setter # type: ignore
    def variables(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "variables", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryPipelineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "activities_json": "activitiesJson",
        "annotations": "annotations",
        "description": "description",
        "parameters": "parameters",
        "timeouts": "timeouts",
        "variables": "variables",
    },
)
class DataFactoryPipelineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        activities_json: typing.Optional[builtins.str] = None,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataFactoryPipelineTimeouts"] = None,
        variables: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param name: -
        :param resource_group_name: -
        :param activities_json: -
        :param annotations: -
        :param description: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param variables: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryPipelineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if activities_json is not None:
            self._values["activities_json"] = activities_json
        if annotations is not None:
            self._values["annotations"] = annotations
        if description is not None:
            self._values["description"] = description
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if variables is not None:
            self._values["variables"] = variables

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def activities_json(self) -> typing.Optional[builtins.str]:
        result = self._values.get("activities_json")
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryPipelineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def variables(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("variables")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryPipelineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryPipelineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryPipelineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryPipelineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataFactoryTriggerSchedule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataFactoryTriggerSchedule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_factory_name: builtins.str,
        name: builtins.str,
        pipeline_name: builtins.str,
        resource_group_name: builtins.str,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        end_time: typing.Optional[builtins.str] = None,
        frequency: typing.Optional[builtins.str] = None,
        interval: typing.Optional[jsii.Number] = None,
        pipeline_parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        start_time: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryTriggerScheduleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_factory_name: -
        :param name: -
        :param pipeline_name: -
        :param resource_group_name: -
        :param annotations: -
        :param end_time: -
        :param frequency: -
        :param interval: -
        :param pipeline_parameters: -
        :param start_time: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataFactoryTriggerScheduleConfig(
            data_factory_name=data_factory_name,
            name=name,
            pipeline_name=pipeline_name,
            resource_group_name=resource_group_name,
            annotations=annotations,
            end_time=end_time,
            frequency=frequency,
            interval=interval,
            pipeline_parameters=pipeline_parameters,
            start_time=start_time,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataFactoryTriggerSchedule, self, [scope, id, config])

    @jsii.member(jsii_name="resetAnnotations")
    def reset_annotations(self) -> None:
        return jsii.invoke(self, "resetAnnotations", [])

    @jsii.member(jsii_name="resetEndTime")
    def reset_end_time(self) -> None:
        return jsii.invoke(self, "resetEndTime", [])

    @jsii.member(jsii_name="resetFrequency")
    def reset_frequency(self) -> None:
        return jsii.invoke(self, "resetFrequency", [])

    @jsii.member(jsii_name="resetInterval")
    def reset_interval(self) -> None:
        return jsii.invoke(self, "resetInterval", [])

    @jsii.member(jsii_name="resetPipelineParameters")
    def reset_pipeline_parameters(self) -> None:
        return jsii.invoke(self, "resetPipelineParameters", [])

    @jsii.member(jsii_name="resetStartTime")
    def reset_start_time(self) -> None:
        return jsii.invoke(self, "resetStartTime", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryNameInput")
    def data_factory_name_input(self) -> builtins.str:
        return jsii.get(self, "dataFactoryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pipelineNameInput")
    def pipeline_name_input(self) -> builtins.str:
        return jsii.get(self, "pipelineNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotationsInput")
    def annotations_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "annotationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endTimeInput")
    def end_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "endTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequencyInput")
    def frequency_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "frequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInput")
    def interval_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "intervalInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pipelineParametersInput")
    def pipeline_parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "pipelineParametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTimeInput")
    def start_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "startTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataFactoryTriggerScheduleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="annotations")
    def annotations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "annotations")

    @annotations.setter # type: ignore
    def annotations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "annotations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFactoryName")
    def data_factory_name(self) -> builtins.str:
        return jsii.get(self, "dataFactoryName")

    @data_factory_name.setter # type: ignore
    def data_factory_name(self, value: builtins.str) -> None:
        jsii.set(self, "dataFactoryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endTime")
    def end_time(self) -> builtins.str:
        return jsii.get(self, "endTime")

    @end_time.setter # type: ignore
    def end_time(self, value: builtins.str) -> None:
        jsii.set(self, "endTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> builtins.str:
        return jsii.get(self, "frequency")

    @frequency.setter # type: ignore
    def frequency(self, value: builtins.str) -> None:
        jsii.set(self, "frequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="interval")
    def interval(self) -> jsii.Number:
        return jsii.get(self, "interval")

    @interval.setter # type: ignore
    def interval(self, value: jsii.Number) -> None:
        jsii.set(self, "interval", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pipelineName")
    def pipeline_name(self) -> builtins.str:
        return jsii.get(self, "pipelineName")

    @pipeline_name.setter # type: ignore
    def pipeline_name(self, value: builtins.str) -> None:
        jsii.set(self, "pipelineName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pipelineParameters")
    def pipeline_parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "pipelineParameters")

    @pipeline_parameters.setter # type: ignore
    def pipeline_parameters(
        self,
        value: typing.Mapping[builtins.str, builtins.str],
    ) -> None:
        jsii.set(self, "pipelineParameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTime")
    def start_time(self) -> builtins.str:
        return jsii.get(self, "startTime")

    @start_time.setter # type: ignore
    def start_time(self, value: builtins.str) -> None:
        jsii.set(self, "startTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataFactoryTriggerScheduleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataFactoryTriggerScheduleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataFactoryTriggerScheduleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_factory_name": "dataFactoryName",
        "name": "name",
        "pipeline_name": "pipelineName",
        "resource_group_name": "resourceGroupName",
        "annotations": "annotations",
        "end_time": "endTime",
        "frequency": "frequency",
        "interval": "interval",
        "pipeline_parameters": "pipelineParameters",
        "start_time": "startTime",
        "timeouts": "timeouts",
    },
)
class DataFactoryTriggerScheduleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_factory_name: builtins.str,
        name: builtins.str,
        pipeline_name: builtins.str,
        resource_group_name: builtins.str,
        annotations: typing.Optional[typing.List[builtins.str]] = None,
        end_time: typing.Optional[builtins.str] = None,
        frequency: typing.Optional[builtins.str] = None,
        interval: typing.Optional[jsii.Number] = None,
        pipeline_parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        start_time: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataFactoryTriggerScheduleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_factory_name: -
        :param name: -
        :param pipeline_name: -
        :param resource_group_name: -
        :param annotations: -
        :param end_time: -
        :param frequency: -
        :param interval: -
        :param pipeline_parameters: -
        :param start_time: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataFactoryTriggerScheduleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_factory_name": data_factory_name,
            "name": name,
            "pipeline_name": pipeline_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if annotations is not None:
            self._values["annotations"] = annotations
        if end_time is not None:
            self._values["end_time"] = end_time
        if frequency is not None:
            self._values["frequency"] = frequency
        if interval is not None:
            self._values["interval"] = interval
        if pipeline_parameters is not None:
            self._values["pipeline_parameters"] = pipeline_parameters
        if start_time is not None:
            self._values["start_time"] = start_time
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_factory_name(self) -> builtins.str:
        result = self._values.get("data_factory_name")
        assert result is not None, "Required property 'data_factory_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def pipeline_name(self) -> builtins.str:
        result = self._values.get("pipeline_name")
        assert result is not None, "Required property 'pipeline_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def annotations(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("annotations")
        return result

    @builtins.property
    def end_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("end_time")
        return result

    @builtins.property
    def frequency(self) -> typing.Optional[builtins.str]:
        result = self._values.get("frequency")
        return result

    @builtins.property
    def interval(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval")
        return result

    @builtins.property
    def pipeline_parameters(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("pipeline_parameters")
        return result

    @builtins.property
    def start_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("start_time")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataFactoryTriggerScheduleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryTriggerScheduleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryTriggerScheduleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataFactoryTriggerScheduleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryTriggerScheduleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataFactoryVstsConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "account_name": "accountName",
        "branch_name": "branchName",
        "project_name": "projectName",
        "repository_name": "repositoryName",
        "root_folder": "rootFolder",
        "tenant_id": "tenantId",
    },
)
class DataFactoryVstsConfiguration:
    def __init__(
        self,
        *,
        account_name: builtins.str,
        branch_name: builtins.str,
        project_name: builtins.str,
        repository_name: builtins.str,
        root_folder: builtins.str,
        tenant_id: builtins.str,
    ) -> None:
        """
        :param account_name: -
        :param branch_name: -
        :param project_name: -
        :param repository_name: -
        :param root_folder: -
        :param tenant_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "branch_name": branch_name,
            "project_name": project_name,
            "repository_name": repository_name,
            "root_folder": root_folder,
            "tenant_id": tenant_id,
        }

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def branch_name(self) -> builtins.str:
        result = self._values.get("branch_name")
        assert result is not None, "Required property 'branch_name' is missing"
        return result

    @builtins.property
    def project_name(self) -> builtins.str:
        result = self._values.get("project_name")
        assert result is not None, "Required property 'project_name' is missing"
        return result

    @builtins.property
    def repository_name(self) -> builtins.str:
        result = self._values.get("repository_name")
        assert result is not None, "Required property 'repository_name' is missing"
        return result

    @builtins.property
    def root_folder(self) -> builtins.str:
        result = self._values.get("root_folder")
        assert result is not None, "Required property 'root_folder' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataFactoryVstsConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataLakeAnalyticsAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataLakeAnalyticsAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        default_store_account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tier: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataLakeAnalyticsAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param default_store_account_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param tier: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataLakeAnalyticsAccountConfig(
            default_store_account_name=default_store_account_name,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            tier=tier,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataLakeAnalyticsAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTier")
    def reset_tier(self) -> None:
        return jsii.invoke(self, "resetTier", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultStoreAccountNameInput")
    def default_store_account_name_input(self) -> builtins.str:
        return jsii.get(self, "defaultStoreAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataLakeAnalyticsAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultStoreAccountName")
    def default_store_account_name(self) -> builtins.str:
        return jsii.get(self, "defaultStoreAccountName")

    @default_store_account_name.setter # type: ignore
    def default_store_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "defaultStoreAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataLakeAnalyticsAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataLakeAnalyticsAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataLakeAnalyticsAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "default_store_account_name": "defaultStoreAccountName",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "tier": "tier",
        "timeouts": "timeouts",
    },
)
class DataLakeAnalyticsAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        default_store_account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tier: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataLakeAnalyticsAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param default_store_account_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param tier: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataLakeAnalyticsAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "default_store_account_name": default_store_account_name,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if tier is not None:
            self._values["tier"] = tier
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def default_store_account_name(self) -> builtins.str:
        result = self._values.get("default_store_account_name")
        assert result is not None, "Required property 'default_store_account_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tier")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataLakeAnalyticsAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeAnalyticsAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataLakeAnalyticsAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataLakeAnalyticsAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeAnalyticsAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataLakeAnalyticsFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataLakeAnalyticsFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["DataLakeAnalyticsFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataLakeAnalyticsFirewallRuleConfig(
            account_name=account_name,
            end_ip_address=end_ip_address,
            name=name,
            resource_group_name=resource_group_name,
            start_ip_address=start_ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataLakeAnalyticsFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddressInput")
    def end_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "endIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddressInput")
    def start_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "startIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataLakeAnalyticsFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddress")
    def end_ip_address(self) -> builtins.str:
        return jsii.get(self, "endIpAddress")

    @end_ip_address.setter # type: ignore
    def end_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "endIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddress")
    def start_ip_address(self) -> builtins.str:
        return jsii.get(self, "startIpAddress")

    @start_ip_address.setter # type: ignore
    def start_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "startIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataLakeAnalyticsFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataLakeAnalyticsFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataLakeAnalyticsFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "end_ip_address": "endIpAddress",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "start_ip_address": "startIpAddress",
        "timeouts": "timeouts",
    },
)
class DataLakeAnalyticsFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["DataLakeAnalyticsFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataLakeAnalyticsFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "end_ip_address": end_ip_address,
            "name": name,
            "resource_group_name": resource_group_name,
            "start_ip_address": start_ip_address,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def end_ip_address(self) -> builtins.str:
        result = self._values.get("end_ip_address")
        assert result is not None, "Required property 'end_ip_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def start_ip_address(self) -> builtins.str:
        result = self._values.get("start_ip_address")
        assert result is not None, "Required property 'start_ip_address' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataLakeAnalyticsFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeAnalyticsFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataLakeAnalyticsFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataLakeAnalyticsFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeAnalyticsFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataLakeStore(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataLakeStore",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        encryption_state: typing.Optional[builtins.str] = None,
        encryption_type: typing.Optional[builtins.str] = None,
        firewall_allow_azure_ips: typing.Optional[builtins.str] = None,
        firewall_state: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tier: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataLakeStoreTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param encryption_state: -
        :param encryption_type: -
        :param firewall_allow_azure_ips: -
        :param firewall_state: -
        :param tags: -
        :param tier: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataLakeStoreConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            encryption_state=encryption_state,
            encryption_type=encryption_type,
            firewall_allow_azure_ips=firewall_allow_azure_ips,
            firewall_state=firewall_state,
            tags=tags,
            tier=tier,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataLakeStore, self, [scope, id, config])

    @jsii.member(jsii_name="resetEncryptionState")
    def reset_encryption_state(self) -> None:
        return jsii.invoke(self, "resetEncryptionState", [])

    @jsii.member(jsii_name="resetEncryptionType")
    def reset_encryption_type(self) -> None:
        return jsii.invoke(self, "resetEncryptionType", [])

    @jsii.member(jsii_name="resetFirewallAllowAzureIps")
    def reset_firewall_allow_azure_ips(self) -> None:
        return jsii.invoke(self, "resetFirewallAllowAzureIps", [])

    @jsii.member(jsii_name="resetFirewallState")
    def reset_firewall_state(self) -> None:
        return jsii.invoke(self, "resetFirewallState", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTier")
    def reset_tier(self) -> None:
        return jsii.invoke(self, "resetTier", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionStateInput")
    def encryption_state_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "encryptionStateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionTypeInput")
    def encryption_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "encryptionTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallAllowAzureIpsInput")
    def firewall_allow_azure_ips_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "firewallAllowAzureIpsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallStateInput")
    def firewall_state_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "firewallStateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataLakeStoreTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionState")
    def encryption_state(self) -> builtins.str:
        return jsii.get(self, "encryptionState")

    @encryption_state.setter # type: ignore
    def encryption_state(self, value: builtins.str) -> None:
        jsii.set(self, "encryptionState", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionType")
    def encryption_type(self) -> builtins.str:
        return jsii.get(self, "encryptionType")

    @encryption_type.setter # type: ignore
    def encryption_type(self, value: builtins.str) -> None:
        jsii.set(self, "encryptionType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallAllowAzureIps")
    def firewall_allow_azure_ips(self) -> builtins.str:
        return jsii.get(self, "firewallAllowAzureIps")

    @firewall_allow_azure_ips.setter # type: ignore
    def firewall_allow_azure_ips(self, value: builtins.str) -> None:
        jsii.set(self, "firewallAllowAzureIps", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallState")
    def firewall_state(self) -> builtins.str:
        return jsii.get(self, "firewallState")

    @firewall_state.setter # type: ignore
    def firewall_state(self, value: builtins.str) -> None:
        jsii.set(self, "firewallState", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataLakeStoreTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataLakeStoreTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataLakeStoreConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "encryption_state": "encryptionState",
        "encryption_type": "encryptionType",
        "firewall_allow_azure_ips": "firewallAllowAzureIps",
        "firewall_state": "firewallState",
        "tags": "tags",
        "tier": "tier",
        "timeouts": "timeouts",
    },
)
class DataLakeStoreConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        encryption_state: typing.Optional[builtins.str] = None,
        encryption_type: typing.Optional[builtins.str] = None,
        firewall_allow_azure_ips: typing.Optional[builtins.str] = None,
        firewall_state: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tier: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataLakeStoreTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param encryption_state: -
        :param encryption_type: -
        :param firewall_allow_azure_ips: -
        :param firewall_state: -
        :param tags: -
        :param tier: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataLakeStoreTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if encryption_state is not None:
            self._values["encryption_state"] = encryption_state
        if encryption_type is not None:
            self._values["encryption_type"] = encryption_type
        if firewall_allow_azure_ips is not None:
            self._values["firewall_allow_azure_ips"] = firewall_allow_azure_ips
        if firewall_state is not None:
            self._values["firewall_state"] = firewall_state
        if tags is not None:
            self._values["tags"] = tags
        if tier is not None:
            self._values["tier"] = tier
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def encryption_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encryption_state")
        return result

    @builtins.property
    def encryption_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encryption_type")
        return result

    @builtins.property
    def firewall_allow_azure_ips(self) -> typing.Optional[builtins.str]:
        result = self._values.get("firewall_allow_azure_ips")
        return result

    @builtins.property
    def firewall_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("firewall_state")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tier")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataLakeStoreTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeStoreConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataLakeStoreFile(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataLakeStoreFile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        local_file_path: builtins.str,
        remote_file_path: builtins.str,
        timeouts: typing.Optional["DataLakeStoreFileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param local_file_path: -
        :param remote_file_path: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataLakeStoreFileConfig(
            account_name=account_name,
            local_file_path=local_file_path,
            remote_file_path=remote_file_path,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataLakeStoreFile, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localFilePathInput")
    def local_file_path_input(self) -> builtins.str:
        return jsii.get(self, "localFilePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteFilePathInput")
    def remote_file_path_input(self) -> builtins.str:
        return jsii.get(self, "remoteFilePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataLakeStoreFileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localFilePath")
    def local_file_path(self) -> builtins.str:
        return jsii.get(self, "localFilePath")

    @local_file_path.setter # type: ignore
    def local_file_path(self, value: builtins.str) -> None:
        jsii.set(self, "localFilePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteFilePath")
    def remote_file_path(self) -> builtins.str:
        return jsii.get(self, "remoteFilePath")

    @remote_file_path.setter # type: ignore
    def remote_file_path(self, value: builtins.str) -> None:
        jsii.set(self, "remoteFilePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataLakeStoreFileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataLakeStoreFileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataLakeStoreFileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "local_file_path": "localFilePath",
        "remote_file_path": "remoteFilePath",
        "timeouts": "timeouts",
    },
)
class DataLakeStoreFileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        local_file_path: builtins.str,
        remote_file_path: builtins.str,
        timeouts: typing.Optional["DataLakeStoreFileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param local_file_path: -
        :param remote_file_path: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataLakeStoreFileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "local_file_path": local_file_path,
            "remote_file_path": remote_file_path,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def local_file_path(self) -> builtins.str:
        result = self._values.get("local_file_path")
        assert result is not None, "Required property 'local_file_path' is missing"
        return result

    @builtins.property
    def remote_file_path(self) -> builtins.str:
        result = self._values.get("remote_file_path")
        assert result is not None, "Required property 'remote_file_path' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataLakeStoreFileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeStoreFileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataLakeStoreFileTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataLakeStoreFileTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeStoreFileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataLakeStoreFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataLakeStoreFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["DataLakeStoreFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataLakeStoreFirewallRuleConfig(
            account_name=account_name,
            end_ip_address=end_ip_address,
            name=name,
            resource_group_name=resource_group_name,
            start_ip_address=start_ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataLakeStoreFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddressInput")
    def end_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "endIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddressInput")
    def start_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "startIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataLakeStoreFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddress")
    def end_ip_address(self) -> builtins.str:
        return jsii.get(self, "endIpAddress")

    @end_ip_address.setter # type: ignore
    def end_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "endIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddress")
    def start_ip_address(self) -> builtins.str:
        return jsii.get(self, "startIpAddress")

    @start_ip_address.setter # type: ignore
    def start_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "startIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataLakeStoreFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataLakeStoreFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataLakeStoreFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "end_ip_address": "endIpAddress",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "start_ip_address": "startIpAddress",
        "timeouts": "timeouts",
    },
)
class DataLakeStoreFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["DataLakeStoreFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataLakeStoreFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "end_ip_address": end_ip_address,
            "name": name,
            "resource_group_name": resource_group_name,
            "start_ip_address": start_ip_address,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def end_ip_address(self) -> builtins.str:
        result = self._values.get("end_ip_address")
        assert result is not None, "Required property 'end_ip_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def start_ip_address(self) -> builtins.str:
        result = self._values.get("start_ip_address")
        assert result is not None, "Required property 'start_ip_address' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataLakeStoreFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeStoreFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataLakeStoreFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataLakeStoreFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeStoreFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataLakeStoreTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataLakeStoreTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataLakeStoreTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataShare(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataShare",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_id: builtins.str,
        kind: builtins.str,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        snapshot_schedule: typing.Optional[typing.List["DataShareSnapshotSchedule"]] = None,
        terms: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_id: -
        :param kind: -
        :param name: -
        :param description: -
        :param snapshot_schedule: snapshot_schedule block.
        :param terms: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataShareConfig(
            account_id=account_id,
            kind=kind,
            name=name,
            description=description,
            snapshot_schedule=snapshot_schedule,
            terms=terms,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataShare, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetSnapshotSchedule")
    def reset_snapshot_schedule(self) -> None:
        return jsii.invoke(self, "resetSnapshotSchedule", [])

    @jsii.member(jsii_name="resetTerms")
    def reset_terms(self) -> None:
        return jsii.invoke(self, "resetTerms", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountIdInput")
    def account_id_input(self) -> builtins.str:
        return jsii.get(self, "accountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kindInput")
    def kind_input(self) -> builtins.str:
        return jsii.get(self, "kindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="snapshotScheduleInput")
    def snapshot_schedule_input(
        self,
    ) -> typing.Optional[typing.List["DataShareSnapshotSchedule"]]:
        return jsii.get(self, "snapshotScheduleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="termsInput")
    def terms_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "termsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataShareTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountId")
    def account_id(self) -> builtins.str:
        return jsii.get(self, "accountId")

    @account_id.setter # type: ignore
    def account_id(self, value: builtins.str) -> None:
        jsii.set(self, "accountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @kind.setter # type: ignore
    def kind(self, value: builtins.str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="snapshotSchedule")
    def snapshot_schedule(self) -> typing.List["DataShareSnapshotSchedule"]:
        return jsii.get(self, "snapshotSchedule")

    @snapshot_schedule.setter # type: ignore
    def snapshot_schedule(
        self,
        value: typing.List["DataShareSnapshotSchedule"],
    ) -> None:
        jsii.set(self, "snapshotSchedule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terms")
    def terms(self) -> builtins.str:
        return jsii.get(self, "terms")

    @terms.setter # type: ignore
    def terms(self, value: builtins.str) -> None:
        jsii.set(self, "terms", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataShareTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataShareTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class DataShareAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataShareAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        identity: typing.List["DataShareAccountIdentity"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataShareAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param identity: identity block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataShareAccountConfig(
            identity=identity,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataShareAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.List["DataShareAccountIdentity"]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataShareAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["DataShareAccountIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["DataShareAccountIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataShareAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataShareAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataShareAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "identity": "identity",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DataShareAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        identity: typing.List["DataShareAccountIdentity"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DataShareAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param identity: identity block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataShareAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "identity": identity,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def identity(self) -> typing.List["DataShareAccountIdentity"]:
        """identity block."""
        result = self._values.get("identity")
        assert result is not None, "Required property 'identity' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataShareAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareAccountIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class DataShareAccountIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareAccountIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataShareAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_id": "accountId",
        "kind": "kind",
        "name": "name",
        "description": "description",
        "snapshot_schedule": "snapshotSchedule",
        "terms": "terms",
        "timeouts": "timeouts",
    },
)
class DataShareConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_id: builtins.str,
        kind: builtins.str,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        snapshot_schedule: typing.Optional[typing.List["DataShareSnapshotSchedule"]] = None,
        terms: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_id: -
        :param kind: -
        :param name: -
        :param description: -
        :param snapshot_schedule: snapshot_schedule block.
        :param terms: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataShareTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_id": account_id,
            "kind": kind,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if snapshot_schedule is not None:
            self._values["snapshot_schedule"] = snapshot_schedule
        if terms is not None:
            self._values["terms"] = terms
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_id(self) -> builtins.str:
        result = self._values.get("account_id")
        assert result is not None, "Required property 'account_id' is missing"
        return result

    @builtins.property
    def kind(self) -> builtins.str:
        result = self._values.get("kind")
        assert result is not None, "Required property 'kind' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def snapshot_schedule(
        self,
    ) -> typing.Optional[typing.List["DataShareSnapshotSchedule"]]:
        """snapshot_schedule block."""
        result = self._values.get("snapshot_schedule")
        return result

    @builtins.property
    def terms(self) -> typing.Optional[builtins.str]:
        result = self._values.get("terms")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataShareTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataShareDatasetBlobStorage(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataShareDatasetBlobStorage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        container_name: builtins.str,
        data_share_id: builtins.str,
        name: builtins.str,
        storage_account: typing.List["DataShareDatasetBlobStorageStorageAccount"],
        file_path: typing.Optional[builtins.str] = None,
        folder_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareDatasetBlobStorageTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param container_name: -
        :param data_share_id: -
        :param name: -
        :param storage_account: storage_account block.
        :param file_path: -
        :param folder_path: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataShareDatasetBlobStorageConfig(
            container_name=container_name,
            data_share_id=data_share_id,
            name=name,
            storage_account=storage_account,
            file_path=file_path,
            folder_path=folder_path,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataShareDatasetBlobStorage, self, [scope, id, config])

    @jsii.member(jsii_name="resetFilePath")
    def reset_file_path(self) -> None:
        return jsii.invoke(self, "resetFilePath", [])

    @jsii.member(jsii_name="resetFolderPath")
    def reset_folder_path(self) -> None:
        return jsii.invoke(self, "resetFolderPath", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerNameInput")
    def container_name_input(self) -> builtins.str:
        return jsii.get(self, "containerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareIdInput")
    def data_share_id_input(self) -> builtins.str:
        return jsii.get(self, "dataShareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.List["DataShareDatasetBlobStorageStorageAccount"]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filePathInput")
    def file_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "filePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPathInput")
    def folder_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataShareDatasetBlobStorageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerName")
    def container_name(self) -> builtins.str:
        return jsii.get(self, "containerName")

    @container_name.setter # type: ignore
    def container_name(self, value: builtins.str) -> None:
        jsii.set(self, "containerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareId")
    def data_share_id(self) -> builtins.str:
        return jsii.get(self, "dataShareId")

    @data_share_id.setter # type: ignore
    def data_share_id(self, value: builtins.str) -> None:
        jsii.set(self, "dataShareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filePath")
    def file_path(self) -> builtins.str:
        return jsii.get(self, "filePath")

    @file_path.setter # type: ignore
    def file_path(self, value: builtins.str) -> None:
        jsii.set(self, "filePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPath")
    def folder_path(self) -> builtins.str:
        return jsii.get(self, "folderPath")

    @folder_path.setter # type: ignore
    def folder_path(self, value: builtins.str) -> None:
        jsii.set(self, "folderPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(
        self,
    ) -> typing.List["DataShareDatasetBlobStorageStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["DataShareDatasetBlobStorageStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataShareDatasetBlobStorageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataShareDatasetBlobStorageTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetBlobStorageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "container_name": "containerName",
        "data_share_id": "dataShareId",
        "name": "name",
        "storage_account": "storageAccount",
        "file_path": "filePath",
        "folder_path": "folderPath",
        "timeouts": "timeouts",
    },
)
class DataShareDatasetBlobStorageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        container_name: builtins.str,
        data_share_id: builtins.str,
        name: builtins.str,
        storage_account: typing.List["DataShareDatasetBlobStorageStorageAccount"],
        file_path: typing.Optional[builtins.str] = None,
        folder_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareDatasetBlobStorageTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param container_name: -
        :param data_share_id: -
        :param name: -
        :param storage_account: storage_account block.
        :param file_path: -
        :param folder_path: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataShareDatasetBlobStorageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "container_name": container_name,
            "data_share_id": data_share_id,
            "name": name,
            "storage_account": storage_account,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if file_path is not None:
            self._values["file_path"] = file_path
        if folder_path is not None:
            self._values["folder_path"] = folder_path
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def container_name(self) -> builtins.str:
        result = self._values.get("container_name")
        assert result is not None, "Required property 'container_name' is missing"
        return result

    @builtins.property
    def data_share_id(self) -> builtins.str:
        result = self._values.get("data_share_id")
        assert result is not None, "Required property 'data_share_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.List["DataShareDatasetBlobStorageStorageAccount"]:
        """storage_account block."""
        result = self._values.get("storage_account")
        assert result is not None, "Required property 'storage_account' is missing"
        return result

    @builtins.property
    def file_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_path")
        return result

    @builtins.property
    def folder_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder_path")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataShareDatasetBlobStorageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetBlobStorageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetBlobStorageStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "subscription_id": "subscriptionId",
    },
)
class DataShareDatasetBlobStorageStorageAccount:
    def __init__(
        self,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        subscription_id: builtins.str,
    ) -> None:
        """
        :param name: -
        :param resource_group_name: -
        :param subscription_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "subscription_id": subscription_id,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def subscription_id(self) -> builtins.str:
        result = self._values.get("subscription_id")
        assert result is not None, "Required property 'subscription_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetBlobStorageStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetBlobStorageTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class DataShareDatasetBlobStorageTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetBlobStorageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataShareDatasetDataLakeGen1(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataShareDatasetDataLakeGen1",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_lake_store_id: builtins.str,
        data_share_id: builtins.str,
        folder_path: builtins.str,
        name: builtins.str,
        file_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareDatasetDataLakeGen1Timeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_lake_store_id: -
        :param data_share_id: -
        :param folder_path: -
        :param name: -
        :param file_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataShareDatasetDataLakeGen1Config(
            data_lake_store_id=data_lake_store_id,
            data_share_id=data_share_id,
            folder_path=folder_path,
            name=name,
            file_name=file_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataShareDatasetDataLakeGen1, self, [scope, id, config])

    @jsii.member(jsii_name="resetFileName")
    def reset_file_name(self) -> None:
        return jsii.invoke(self, "resetFileName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataLakeStoreIdInput")
    def data_lake_store_id_input(self) -> builtins.str:
        return jsii.get(self, "dataLakeStoreIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareIdInput")
    def data_share_id_input(self) -> builtins.str:
        return jsii.get(self, "dataShareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPathInput")
    def folder_path_input(self) -> builtins.str:
        return jsii.get(self, "folderPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileNameInput")
    def file_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "fileNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataShareDatasetDataLakeGen1Timeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataLakeStoreId")
    def data_lake_store_id(self) -> builtins.str:
        return jsii.get(self, "dataLakeStoreId")

    @data_lake_store_id.setter # type: ignore
    def data_lake_store_id(self, value: builtins.str) -> None:
        jsii.set(self, "dataLakeStoreId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataShareId")
    def data_share_id(self) -> builtins.str:
        return jsii.get(self, "dataShareId")

    @data_share_id.setter # type: ignore
    def data_share_id(self, value: builtins.str) -> None:
        jsii.set(self, "dataShareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileName")
    def file_name(self) -> builtins.str:
        return jsii.get(self, "fileName")

    @file_name.setter # type: ignore
    def file_name(self, value: builtins.str) -> None:
        jsii.set(self, "fileName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPath")
    def folder_path(self) -> builtins.str:
        return jsii.get(self, "folderPath")

    @folder_path.setter # type: ignore
    def folder_path(self, value: builtins.str) -> None:
        jsii.set(self, "folderPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataShareDatasetDataLakeGen1Timeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataShareDatasetDataLakeGen1Timeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetDataLakeGen1Config",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_lake_store_id": "dataLakeStoreId",
        "data_share_id": "dataShareId",
        "folder_path": "folderPath",
        "name": "name",
        "file_name": "fileName",
        "timeouts": "timeouts",
    },
)
class DataShareDatasetDataLakeGen1Config(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_lake_store_id: builtins.str,
        data_share_id: builtins.str,
        folder_path: builtins.str,
        name: builtins.str,
        file_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareDatasetDataLakeGen1Timeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_lake_store_id: -
        :param data_share_id: -
        :param folder_path: -
        :param name: -
        :param file_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataShareDatasetDataLakeGen1Timeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_lake_store_id": data_lake_store_id,
            "data_share_id": data_share_id,
            "folder_path": folder_path,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if file_name is not None:
            self._values["file_name"] = file_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_lake_store_id(self) -> builtins.str:
        result = self._values.get("data_lake_store_id")
        assert result is not None, "Required property 'data_lake_store_id' is missing"
        return result

    @builtins.property
    def data_share_id(self) -> builtins.str:
        result = self._values.get("data_share_id")
        assert result is not None, "Required property 'data_share_id' is missing"
        return result

    @builtins.property
    def folder_path(self) -> builtins.str:
        result = self._values.get("folder_path")
        assert result is not None, "Required property 'folder_path' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def file_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataShareDatasetDataLakeGen1Timeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetDataLakeGen1Config(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetDataLakeGen1Timeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class DataShareDatasetDataLakeGen1Timeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetDataLakeGen1Timeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataShareDatasetDataLakeGen2(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataShareDatasetDataLakeGen2",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        file_system_name: builtins.str,
        name: builtins.str,
        share_id: builtins.str,
        storage_account_id: builtins.str,
        file_path: typing.Optional[builtins.str] = None,
        folder_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareDatasetDataLakeGen2Timeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param file_system_name: -
        :param name: -
        :param share_id: -
        :param storage_account_id: -
        :param file_path: -
        :param folder_path: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataShareDatasetDataLakeGen2Config(
            file_system_name=file_system_name,
            name=name,
            share_id=share_id,
            storage_account_id=storage_account_id,
            file_path=file_path,
            folder_path=folder_path,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataShareDatasetDataLakeGen2, self, [scope, id, config])

    @jsii.member(jsii_name="resetFilePath")
    def reset_file_path(self) -> None:
        return jsii.invoke(self, "resetFilePath", [])

    @jsii.member(jsii_name="resetFolderPath")
    def reset_folder_path(self) -> None:
        return jsii.invoke(self, "resetFolderPath", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileSystemNameInput")
    def file_system_name_input(self) -> builtins.str:
        return jsii.get(self, "fileSystemNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareIdInput")
    def share_id_input(self) -> builtins.str:
        return jsii.get(self, "shareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filePathInput")
    def file_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "filePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPathInput")
    def folder_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "folderPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataShareDatasetDataLakeGen2Timeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filePath")
    def file_path(self) -> builtins.str:
        return jsii.get(self, "filePath")

    @file_path.setter # type: ignore
    def file_path(self, value: builtins.str) -> None:
        jsii.set(self, "filePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileSystemName")
    def file_system_name(self) -> builtins.str:
        return jsii.get(self, "fileSystemName")

    @file_system_name.setter # type: ignore
    def file_system_name(self, value: builtins.str) -> None:
        jsii.set(self, "fileSystemName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="folderPath")
    def folder_path(self) -> builtins.str:
        return jsii.get(self, "folderPath")

    @folder_path.setter # type: ignore
    def folder_path(self, value: builtins.str) -> None:
        jsii.set(self, "folderPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareId")
    def share_id(self) -> builtins.str:
        return jsii.get(self, "shareId")

    @share_id.setter # type: ignore
    def share_id(self, value: builtins.str) -> None:
        jsii.set(self, "shareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataShareDatasetDataLakeGen2Timeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataShareDatasetDataLakeGen2Timeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetDataLakeGen2Config",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "file_system_name": "fileSystemName",
        "name": "name",
        "share_id": "shareId",
        "storage_account_id": "storageAccountId",
        "file_path": "filePath",
        "folder_path": "folderPath",
        "timeouts": "timeouts",
    },
)
class DataShareDatasetDataLakeGen2Config(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        file_system_name: builtins.str,
        name: builtins.str,
        share_id: builtins.str,
        storage_account_id: builtins.str,
        file_path: typing.Optional[builtins.str] = None,
        folder_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DataShareDatasetDataLakeGen2Timeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param file_system_name: -
        :param name: -
        :param share_id: -
        :param storage_account_id: -
        :param file_path: -
        :param folder_path: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataShareDatasetDataLakeGen2Timeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "file_system_name": file_system_name,
            "name": name,
            "share_id": share_id,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if file_path is not None:
            self._values["file_path"] = file_path
        if folder_path is not None:
            self._values["folder_path"] = folder_path
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def file_system_name(self) -> builtins.str:
        result = self._values.get("file_system_name")
        assert result is not None, "Required property 'file_system_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_id(self) -> builtins.str:
        result = self._values.get("share_id")
        assert result is not None, "Required property 'share_id' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def file_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_path")
        return result

    @builtins.property
    def folder_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("folder_path")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataShareDatasetDataLakeGen2Timeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetDataLakeGen2Config(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetDataLakeGen2Timeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class DataShareDatasetDataLakeGen2Timeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetDataLakeGen2Timeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataShareDatasetKustoCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataShareDatasetKustoCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        kusto_cluster_id: builtins.str,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataShareDatasetKustoClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param kusto_cluster_id: -
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataShareDatasetKustoClusterConfig(
            kusto_cluster_id=kusto_cluster_id,
            name=name,
            share_id=share_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataShareDatasetKustoCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoClusterIdInput")
    def kusto_cluster_id_input(self) -> builtins.str:
        return jsii.get(self, "kustoClusterIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoClusterLocation")
    def kusto_cluster_location(self) -> builtins.str:
        return jsii.get(self, "kustoClusterLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareIdInput")
    def share_id_input(self) -> builtins.str:
        return jsii.get(self, "shareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DataShareDatasetKustoClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoClusterId")
    def kusto_cluster_id(self) -> builtins.str:
        return jsii.get(self, "kustoClusterId")

    @kusto_cluster_id.setter # type: ignore
    def kusto_cluster_id(self, value: builtins.str) -> None:
        jsii.set(self, "kustoClusterId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareId")
    def share_id(self) -> builtins.str:
        return jsii.get(self, "shareId")

    @share_id.setter # type: ignore
    def share_id(self, value: builtins.str) -> None:
        jsii.set(self, "shareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataShareDatasetKustoClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataShareDatasetKustoClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetKustoClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "kusto_cluster_id": "kustoClusterId",
        "name": "name",
        "share_id": "shareId",
        "timeouts": "timeouts",
    },
)
class DataShareDatasetKustoClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        kusto_cluster_id: builtins.str,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataShareDatasetKustoClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param kusto_cluster_id: -
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataShareDatasetKustoClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "kusto_cluster_id": kusto_cluster_id,
            "name": name,
            "share_id": share_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def kusto_cluster_id(self) -> builtins.str:
        result = self._values.get("kusto_cluster_id")
        assert result is not None, "Required property 'kusto_cluster_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_id(self) -> builtins.str:
        result = self._values.get("share_id")
        assert result is not None, "Required property 'share_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataShareDatasetKustoClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetKustoClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetKustoClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class DataShareDatasetKustoClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetKustoClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DataShareDatasetKustoDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DataShareDatasetKustoDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        kusto_database_id: builtins.str,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataShareDatasetKustoDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param kusto_database_id: -
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataShareDatasetKustoDatabaseConfig(
            kusto_database_id=kusto_database_id,
            name=name,
            share_id=share_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DataShareDatasetKustoDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoClusterLocation")
    def kusto_cluster_location(self) -> builtins.str:
        return jsii.get(self, "kustoClusterLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoDatabaseIdInput")
    def kusto_database_id_input(self) -> builtins.str:
        return jsii.get(self, "kustoDatabaseIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareIdInput")
    def share_id_input(self) -> builtins.str:
        return jsii.get(self, "shareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DataShareDatasetKustoDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kustoDatabaseId")
    def kusto_database_id(self) -> builtins.str:
        return jsii.get(self, "kustoDatabaseId")

    @kusto_database_id.setter # type: ignore
    def kusto_database_id(self, value: builtins.str) -> None:
        jsii.set(self, "kustoDatabaseId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareId")
    def share_id(self) -> builtins.str:
        return jsii.get(self, "shareId")

    @share_id.setter # type: ignore
    def share_id(self, value: builtins.str) -> None:
        jsii.set(self, "shareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DataShareDatasetKustoDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DataShareDatasetKustoDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetKustoDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "kusto_database_id": "kustoDatabaseId",
        "name": "name",
        "share_id": "shareId",
        "timeouts": "timeouts",
    },
)
class DataShareDatasetKustoDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        kusto_database_id: builtins.str,
        name: builtins.str,
        share_id: builtins.str,
        timeouts: typing.Optional["DataShareDatasetKustoDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param kusto_database_id: -
        :param name: -
        :param share_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DataShareDatasetKustoDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "kusto_database_id": kusto_database_id,
            "name": name,
            "share_id": share_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def kusto_database_id(self) -> builtins.str:
        result = self._values.get("kusto_database_id")
        assert result is not None, "Required property 'kusto_database_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_id(self) -> builtins.str:
        result = self._values.get("share_id")
        assert result is not None, "Required property 'share_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DataShareDatasetKustoDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetKustoDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareDatasetKustoDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class DataShareDatasetKustoDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareDatasetKustoDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareSnapshotSchedule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "recurrence": "recurrence",
        "start_time": "startTime",
    },
)
class DataShareSnapshotSchedule:
    def __init__(
        self,
        *,
        name: builtins.str,
        recurrence: builtins.str,
        start_time: builtins.str,
    ) -> None:
        """
        :param name: -
        :param recurrence: -
        :param start_time: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "recurrence": recurrence,
            "start_time": start_time,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recurrence(self) -> builtins.str:
        result = self._values.get("recurrence")
        assert result is not None, "Required property 'recurrence' is missing"
        return result

    @builtins.property
    def start_time(self) -> builtins.str:
        result = self._values.get("start_time")
        assert result is not None, "Required property 'start_time' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareSnapshotSchedule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DataShareTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DataShareTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DataShareTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DatabaseMigrationProject(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DatabaseMigrationProject",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        source_platform: builtins.str,
        target_platform: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DatabaseMigrationProjectTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param source_platform: -
        :param target_platform: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DatabaseMigrationProjectConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            service_name=service_name,
            source_platform=source_platform,
            target_platform=target_platform,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DatabaseMigrationProject, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceNameInput")
    def service_name_input(self) -> builtins.str:
        return jsii.get(self, "serviceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePlatformInput")
    def source_platform_input(self) -> builtins.str:
        return jsii.get(self, "sourcePlatformInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetPlatformInput")
    def target_platform_input(self) -> builtins.str:
        return jsii.get(self, "targetPlatformInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DatabaseMigrationProjectTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> builtins.str:
        return jsii.get(self, "serviceName")

    @service_name.setter # type: ignore
    def service_name(self, value: builtins.str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePlatform")
    def source_platform(self) -> builtins.str:
        return jsii.get(self, "sourcePlatform")

    @source_platform.setter # type: ignore
    def source_platform(self, value: builtins.str) -> None:
        jsii.set(self, "sourcePlatform", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetPlatform")
    def target_platform(self) -> builtins.str:
        return jsii.get(self, "targetPlatform")

    @target_platform.setter # type: ignore
    def target_platform(self, value: builtins.str) -> None:
        jsii.set(self, "targetPlatform", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DatabaseMigrationProjectTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DatabaseMigrationProjectTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DatabaseMigrationProjectConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "service_name": "serviceName",
        "source_platform": "sourcePlatform",
        "target_platform": "targetPlatform",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DatabaseMigrationProjectConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        source_platform: builtins.str,
        target_platform: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DatabaseMigrationProjectTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param source_platform: -
        :param target_platform: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DatabaseMigrationProjectTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "service_name": service_name,
            "source_platform": source_platform,
            "target_platform": target_platform,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_name(self) -> builtins.str:
        result = self._values.get("service_name")
        assert result is not None, "Required property 'service_name' is missing"
        return result

    @builtins.property
    def source_platform(self) -> builtins.str:
        result = self._values.get("source_platform")
        assert result is not None, "Required property 'source_platform' is missing"
        return result

    @builtins.property
    def target_platform(self) -> builtins.str:
        result = self._values.get("target_platform")
        assert result is not None, "Required property 'target_platform' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DatabaseMigrationProjectTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DatabaseMigrationProjectConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DatabaseMigrationProjectTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DatabaseMigrationProjectTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DatabaseMigrationProjectTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DatabaseMigrationService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DatabaseMigrationService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        subnet_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DatabaseMigrationServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param subnet_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DatabaseMigrationServiceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            subnet_id=subnet_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DatabaseMigrationService, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DatabaseMigrationServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DatabaseMigrationServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DatabaseMigrationServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DatabaseMigrationServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "subnet_id": "subnetId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DatabaseMigrationServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        subnet_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DatabaseMigrationServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param subnet_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DatabaseMigrationServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DatabaseMigrationServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DatabaseMigrationServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DatabaseMigrationServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DatabaseMigrationServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DatabaseMigrationServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DatabricksWorkspace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DatabricksWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        custom_parameters: typing.Optional[typing.List["DatabricksWorkspaceCustomParameters"]] = None,
        managed_resource_group_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DatabricksWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param custom_parameters: custom_parameters block.
        :param managed_resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DatabricksWorkspaceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            custom_parameters=custom_parameters,
            managed_resource_group_name=managed_resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DatabricksWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="resetCustomParameters")
    def reset_custom_parameters(self) -> None:
        return jsii.invoke(self, "resetCustomParameters", [])

    @jsii.member(jsii_name="resetManagedResourceGroupName")
    def reset_managed_resource_group_name(self) -> None:
        return jsii.invoke(self, "resetManagedResourceGroupName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedResourceGroupId")
    def managed_resource_group_id(self) -> builtins.str:
        return jsii.get(self, "managedResourceGroupId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceUrl")
    def workspace_url(self) -> builtins.str:
        return jsii.get(self, "workspaceUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customParametersInput")
    def custom_parameters_input(
        self,
    ) -> typing.Optional[typing.List["DatabricksWorkspaceCustomParameters"]]:
        return jsii.get(self, "customParametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedResourceGroupNameInput")
    def managed_resource_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managedResourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DatabricksWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customParameters")
    def custom_parameters(self) -> typing.List["DatabricksWorkspaceCustomParameters"]:
        return jsii.get(self, "customParameters")

    @custom_parameters.setter # type: ignore
    def custom_parameters(
        self,
        value: typing.List["DatabricksWorkspaceCustomParameters"],
    ) -> None:
        jsii.set(self, "customParameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedResourceGroupName")
    def managed_resource_group_name(self) -> builtins.str:
        return jsii.get(self, "managedResourceGroupName")

    @managed_resource_group_name.setter # type: ignore
    def managed_resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "managedResourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DatabricksWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DatabricksWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DatabricksWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "custom_parameters": "customParameters",
        "managed_resource_group_name": "managedResourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DatabricksWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        custom_parameters: typing.Optional[typing.List["DatabricksWorkspaceCustomParameters"]] = None,
        managed_resource_group_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DatabricksWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param custom_parameters: custom_parameters block.
        :param managed_resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DatabricksWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if custom_parameters is not None:
            self._values["custom_parameters"] = custom_parameters
        if managed_resource_group_name is not None:
            self._values["managed_resource_group_name"] = managed_resource_group_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def custom_parameters(
        self,
    ) -> typing.Optional[typing.List["DatabricksWorkspaceCustomParameters"]]:
        """custom_parameters block."""
        result = self._values.get("custom_parameters")
        return result

    @builtins.property
    def managed_resource_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_resource_group_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DatabricksWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DatabricksWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DatabricksWorkspaceCustomParameters",
    jsii_struct_bases=[],
    name_mapping={
        "no_public_ip": "noPublicIp",
        "private_subnet_name": "privateSubnetName",
        "public_subnet_name": "publicSubnetName",
        "virtual_network_id": "virtualNetworkId",
    },
)
class DatabricksWorkspaceCustomParameters:
    def __init__(
        self,
        *,
        no_public_ip: typing.Optional[builtins.bool] = None,
        private_subnet_name: typing.Optional[builtins.str] = None,
        public_subnet_name: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param no_public_ip: -
        :param private_subnet_name: -
        :param public_subnet_name: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if no_public_ip is not None:
            self._values["no_public_ip"] = no_public_ip
        if private_subnet_name is not None:
            self._values["private_subnet_name"] = private_subnet_name
        if public_subnet_name is not None:
            self._values["public_subnet_name"] = public_subnet_name
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def no_public_ip(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("no_public_ip")
        return result

    @builtins.property
    def private_subnet_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_subnet_name")
        return result

    @builtins.property
    def public_subnet_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_subnet_name")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DatabricksWorkspaceCustomParameters(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DatabricksWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DatabricksWorkspaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DatabricksWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DedicatedHardwareSecurityModule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DedicatedHardwareSecurityModule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        network_profile: typing.List["DedicatedHardwareSecurityModuleNetworkProfile"],
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        stamp_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DedicatedHardwareSecurityModuleTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param network_profile: network_profile block.
        :param resource_group_name: -
        :param sku_name: -
        :param stamp_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DedicatedHardwareSecurityModuleConfig(
            location=location,
            name=name,
            network_profile=network_profile,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            stamp_id=stamp_id,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DedicatedHardwareSecurityModule, self, [scope, id, config])

    @jsii.member(jsii_name="resetStampId")
    def reset_stamp_id(self) -> None:
        return jsii.invoke(self, "resetStampId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfileInput")
    def network_profile_input(
        self,
    ) -> typing.List["DedicatedHardwareSecurityModuleNetworkProfile"]:
        return jsii.get(self, "networkProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="stampIdInput")
    def stamp_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "stampIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DedicatedHardwareSecurityModuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfile")
    def network_profile(
        self,
    ) -> typing.List["DedicatedHardwareSecurityModuleNetworkProfile"]:
        return jsii.get(self, "networkProfile")

    @network_profile.setter # type: ignore
    def network_profile(
        self,
        value: typing.List["DedicatedHardwareSecurityModuleNetworkProfile"],
    ) -> None:
        jsii.set(self, "networkProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="stampId")
    def stamp_id(self) -> builtins.str:
        return jsii.get(self, "stampId")

    @stamp_id.setter # type: ignore
    def stamp_id(self, value: builtins.str) -> None:
        jsii.set(self, "stampId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DedicatedHardwareSecurityModuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DedicatedHardwareSecurityModuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.DedicatedHardwareSecurityModuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "network_profile": "networkProfile",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "stamp_id": "stampId",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class DedicatedHardwareSecurityModuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        network_profile: typing.List["DedicatedHardwareSecurityModuleNetworkProfile"],
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        stamp_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DedicatedHardwareSecurityModuleTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param network_profile: network_profile block.
        :param resource_group_name: -
        :param sku_name: -
        :param stamp_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DedicatedHardwareSecurityModuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "network_profile": network_profile,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if stamp_id is not None:
            self._values["stamp_id"] = stamp_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_profile(
        self,
    ) -> typing.List["DedicatedHardwareSecurityModuleNetworkProfile"]:
        """network_profile block."""
        result = self._values.get("network_profile")
        assert result is not None, "Required property 'network_profile' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def stamp_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("stamp_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DedicatedHardwareSecurityModuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DedicatedHardwareSecurityModuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DedicatedHardwareSecurityModuleNetworkProfile",
    jsii_struct_bases=[],
    name_mapping={
        "network_interface_private_ip_addresses": "networkInterfacePrivateIpAddresses",
        "subnet_id": "subnetId",
    },
)
class DedicatedHardwareSecurityModuleNetworkProfile:
    def __init__(
        self,
        *,
        network_interface_private_ip_addresses: typing.List[builtins.str],
        subnet_id: builtins.str,
    ) -> None:
        """
        :param network_interface_private_ip_addresses: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "network_interface_private_ip_addresses": network_interface_private_ip_addresses,
            "subnet_id": subnet_id,
        }

    @builtins.property
    def network_interface_private_ip_addresses(self) -> typing.List[builtins.str]:
        result = self._values.get("network_interface_private_ip_addresses")
        assert result is not None, "Required property 'network_interface_private_ip_addresses' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DedicatedHardwareSecurityModuleNetworkProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DedicatedHardwareSecurityModuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DedicatedHardwareSecurityModuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DedicatedHardwareSecurityModuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DedicatedHost(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DedicatedHost",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        dedicated_host_group_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        platform_fault_domain: jsii.Number,
        sku_name: builtins.str,
        auto_replace_on_failure: typing.Optional[builtins.bool] = None,
        license_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DedicatedHostTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param dedicated_host_group_id: -
        :param location: -
        :param name: -
        :param platform_fault_domain: -
        :param sku_name: -
        :param auto_replace_on_failure: -
        :param license_type: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DedicatedHostConfig(
            dedicated_host_group_id=dedicated_host_group_id,
            location=location,
            name=name,
            platform_fault_domain=platform_fault_domain,
            sku_name=sku_name,
            auto_replace_on_failure=auto_replace_on_failure,
            license_type=license_type,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DedicatedHost, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoReplaceOnFailure")
    def reset_auto_replace_on_failure(self) -> None:
        return jsii.invoke(self, "resetAutoReplaceOnFailure", [])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostGroupIdInput")
    def dedicated_host_group_id_input(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainInput")
    def platform_fault_domain_input(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoReplaceOnFailureInput")
    def auto_replace_on_failure_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoReplaceOnFailureInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DedicatedHostTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoReplaceOnFailure")
    def auto_replace_on_failure(self) -> builtins.bool:
        return jsii.get(self, "autoReplaceOnFailure")

    @auto_replace_on_failure.setter # type: ignore
    def auto_replace_on_failure(self, value: builtins.bool) -> None:
        jsii.set(self, "autoReplaceOnFailure", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostGroupId")
    def dedicated_host_group_id(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostGroupId")

    @dedicated_host_group_id.setter # type: ignore
    def dedicated_host_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "dedicatedHostGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomain")
    def platform_fault_domain(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomain")

    @platform_fault_domain.setter # type: ignore
    def platform_fault_domain(self, value: jsii.Number) -> None:
        jsii.set(self, "platformFaultDomain", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DedicatedHostTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DedicatedHostTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DedicatedHostConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "dedicated_host_group_id": "dedicatedHostGroupId",
        "location": "location",
        "name": "name",
        "platform_fault_domain": "platformFaultDomain",
        "sku_name": "skuName",
        "auto_replace_on_failure": "autoReplaceOnFailure",
        "license_type": "licenseType",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DedicatedHostConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        dedicated_host_group_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        platform_fault_domain: jsii.Number,
        sku_name: builtins.str,
        auto_replace_on_failure: typing.Optional[builtins.bool] = None,
        license_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DedicatedHostTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dedicated_host_group_id: -
        :param location: -
        :param name: -
        :param platform_fault_domain: -
        :param sku_name: -
        :param auto_replace_on_failure: -
        :param license_type: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DedicatedHostTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "dedicated_host_group_id": dedicated_host_group_id,
            "location": location,
            "name": name,
            "platform_fault_domain": platform_fault_domain,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_replace_on_failure is not None:
            self._values["auto_replace_on_failure"] = auto_replace_on_failure
        if license_type is not None:
            self._values["license_type"] = license_type
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def dedicated_host_group_id(self) -> builtins.str:
        result = self._values.get("dedicated_host_group_id")
        assert result is not None, "Required property 'dedicated_host_group_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def platform_fault_domain(self) -> jsii.Number:
        result = self._values.get("platform_fault_domain")
        assert result is not None, "Required property 'platform_fault_domain' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def auto_replace_on_failure(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_replace_on_failure")
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DedicatedHostTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DedicatedHostConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DedicatedHostGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DedicatedHostGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        platform_fault_domain_count: jsii.Number,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DedicatedHostGroupTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param platform_fault_domain_count: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DedicatedHostGroupConfig(
            location=location,
            name=name,
            platform_fault_domain_count=platform_fault_domain_count,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DedicatedHostGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCountInput")
    def platform_fault_domain_count_input(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DedicatedHostGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCount")
    def platform_fault_domain_count(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCount")

    @platform_fault_domain_count.setter # type: ignore
    def platform_fault_domain_count(self, value: jsii.Number) -> None:
        jsii.set(self, "platformFaultDomainCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DedicatedHostGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DedicatedHostGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.DedicatedHostGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "platform_fault_domain_count": "platformFaultDomainCount",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class DedicatedHostGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        platform_fault_domain_count: jsii.Number,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DedicatedHostGroupTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param platform_fault_domain_count: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DedicatedHostGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "platform_fault_domain_count": platform_fault_domain_count,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def platform_fault_domain_count(self) -> jsii.Number:
        result = self._values.get("platform_fault_domain_count")
        assert result is not None, "Required property 'platform_fault_domain_count' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DedicatedHostGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DedicatedHostGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DedicatedHostGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DedicatedHostGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DedicatedHostGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DedicatedHostTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DedicatedHostTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DedicatedHostTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevTestGlobalVmShutdownSchedule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevTestGlobalVmShutdownSchedule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        daily_recurrence_time: builtins.str,
        location: builtins.str,
        notification_settings: typing.List["DevTestGlobalVmShutdownScheduleNotificationSettings"],
        timezone: builtins.str,
        virtual_machine_id: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestGlobalVmShutdownScheduleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param daily_recurrence_time: -
        :param location: -
        :param notification_settings: notification_settings block.
        :param timezone: -
        :param virtual_machine_id: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevTestGlobalVmShutdownScheduleConfig(
            daily_recurrence_time=daily_recurrence_time,
            location=location,
            notification_settings=notification_settings,
            timezone=timezone,
            virtual_machine_id=virtual_machine_id,
            enabled=enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevTestGlobalVmShutdownSchedule, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyRecurrenceTimeInput")
    def daily_recurrence_time_input(self) -> builtins.str:
        return jsii.get(self, "dailyRecurrenceTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationSettingsInput")
    def notification_settings_input(
        self,
    ) -> typing.List["DevTestGlobalVmShutdownScheduleNotificationSettings"]:
        return jsii.get(self, "notificationSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezoneInput")
    def timezone_input(self) -> builtins.str:
        return jsii.get(self, "timezoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineIdInput")
    def virtual_machine_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualMachineIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DevTestGlobalVmShutdownScheduleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyRecurrenceTime")
    def daily_recurrence_time(self) -> builtins.str:
        return jsii.get(self, "dailyRecurrenceTime")

    @daily_recurrence_time.setter # type: ignore
    def daily_recurrence_time(self, value: builtins.str) -> None:
        jsii.set(self, "dailyRecurrenceTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationSettings")
    def notification_settings(
        self,
    ) -> typing.List["DevTestGlobalVmShutdownScheduleNotificationSettings"]:
        return jsii.get(self, "notificationSettings")

    @notification_settings.setter # type: ignore
    def notification_settings(
        self,
        value: typing.List["DevTestGlobalVmShutdownScheduleNotificationSettings"],
    ) -> None:
        jsii.set(self, "notificationSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevTestGlobalVmShutdownScheduleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevTestGlobalVmShutdownScheduleTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezone")
    def timezone(self) -> builtins.str:
        return jsii.get(self, "timezone")

    @timezone.setter # type: ignore
    def timezone(self, value: builtins.str) -> None:
        jsii.set(self, "timezone", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @virtual_machine_id.setter # type: ignore
    def virtual_machine_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineId", value)


@jsii.data_type(
    jsii_type="azurerm.DevTestGlobalVmShutdownScheduleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "daily_recurrence_time": "dailyRecurrenceTime",
        "location": "location",
        "notification_settings": "notificationSettings",
        "timezone": "timezone",
        "virtual_machine_id": "virtualMachineId",
        "enabled": "enabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DevTestGlobalVmShutdownScheduleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        daily_recurrence_time: builtins.str,
        location: builtins.str,
        notification_settings: typing.List["DevTestGlobalVmShutdownScheduleNotificationSettings"],
        timezone: builtins.str,
        virtual_machine_id: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestGlobalVmShutdownScheduleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param daily_recurrence_time: -
        :param location: -
        :param notification_settings: notification_settings block.
        :param timezone: -
        :param virtual_machine_id: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevTestGlobalVmShutdownScheduleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "daily_recurrence_time": daily_recurrence_time,
            "location": location,
            "notification_settings": notification_settings,
            "timezone": timezone,
            "virtual_machine_id": virtual_machine_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enabled is not None:
            self._values["enabled"] = enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def daily_recurrence_time(self) -> builtins.str:
        result = self._values.get("daily_recurrence_time")
        assert result is not None, "Required property 'daily_recurrence_time' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def notification_settings(
        self,
    ) -> typing.List["DevTestGlobalVmShutdownScheduleNotificationSettings"]:
        """notification_settings block."""
        result = self._values.get("notification_settings")
        assert result is not None, "Required property 'notification_settings' is missing"
        return result

    @builtins.property
    def timezone(self) -> builtins.str:
        result = self._values.get("timezone")
        assert result is not None, "Required property 'timezone' is missing"
        return result

    @builtins.property
    def virtual_machine_id(self) -> builtins.str:
        result = self._values.get("virtual_machine_id")
        assert result is not None, "Required property 'virtual_machine_id' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevTestGlobalVmShutdownScheduleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestGlobalVmShutdownScheduleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestGlobalVmShutdownScheduleNotificationSettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "time_in_minutes": "timeInMinutes",
        "webhook_url": "webhookUrl",
    },
)
class DevTestGlobalVmShutdownScheduleNotificationSettings:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        time_in_minutes: typing.Optional[jsii.Number] = None,
        webhook_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param time_in_minutes: -
        :param webhook_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if time_in_minutes is not None:
            self._values["time_in_minutes"] = time_in_minutes
        if webhook_url is not None:
            self._values["webhook_url"] = webhook_url

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def time_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("time_in_minutes")
        return result

    @builtins.property
    def webhook_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("webhook_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestGlobalVmShutdownScheduleNotificationSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestGlobalVmShutdownScheduleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevTestGlobalVmShutdownScheduleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestGlobalVmShutdownScheduleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevTestLab(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevTestLab",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestLabTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_type: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevTestLabConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            storage_type=storage_type,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevTestLab, self, [scope, id, config])

    @jsii.member(jsii_name="resetStorageType")
    def reset_storage_type(self) -> None:
        return jsii.invoke(self, "resetStorageType", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="artifactsStorageAccountId")
    def artifacts_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "artifactsStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPremiumStorageAccountId")
    def default_premium_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "defaultPremiumStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultStorageAccountId")
    def default_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "defaultStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="premiumDataDiskStorageAccountId")
    def premium_data_disk_storage_account_id(self) -> builtins.str:
        return jsii.get(self, "premiumDataDiskStorageAccountId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueIdentifier")
    def unique_identifier(self) -> builtins.str:
        return jsii.get(self, "uniqueIdentifier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageTypeInput")
    def storage_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DevTestLabTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageType")
    def storage_type(self) -> builtins.str:
        return jsii.get(self, "storageType")

    @storage_type.setter # type: ignore
    def storage_type(self, value: builtins.str) -> None:
        jsii.set(self, "storageType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevTestLabTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevTestLabTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DevTestLabConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "storage_type": "storageType",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DevTestLabConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestLabTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_type: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevTestLabTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if storage_type is not None:
            self._values["storage_type"] = storage_type
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_type")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevTestLabTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestLabConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestLabTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevTestLabTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestLabTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevTestLinuxVirtualMachine(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevTestLinuxVirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        gallery_image_reference: typing.List["DevTestLinuxVirtualMachineGalleryImageReference"],
        lab_name: builtins.str,
        lab_subnet_name: builtins.str,
        lab_virtual_network_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        size: builtins.str,
        storage_type: builtins.str,
        username: builtins.str,
        allow_claim: typing.Optional[builtins.bool] = None,
        disallow_public_ip_address: typing.Optional[builtins.bool] = None,
        inbound_nat_rule: typing.Optional[typing.List["DevTestLinuxVirtualMachineInboundNatRule"]] = None,
        notes: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_key: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestLinuxVirtualMachineTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param gallery_image_reference: gallery_image_reference block.
        :param lab_name: -
        :param lab_subnet_name: -
        :param lab_virtual_network_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param size: -
        :param storage_type: -
        :param username: -
        :param allow_claim: -
        :param disallow_public_ip_address: -
        :param inbound_nat_rule: inbound_nat_rule block.
        :param notes: -
        :param password: -
        :param ssh_key: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevTestLinuxVirtualMachineConfig(
            gallery_image_reference=gallery_image_reference,
            lab_name=lab_name,
            lab_subnet_name=lab_subnet_name,
            lab_virtual_network_id=lab_virtual_network_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            size=size,
            storage_type=storage_type,
            username=username,
            allow_claim=allow_claim,
            disallow_public_ip_address=disallow_public_ip_address,
            inbound_nat_rule=inbound_nat_rule,
            notes=notes,
            password=password,
            ssh_key=ssh_key,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevTestLinuxVirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowClaim")
    def reset_allow_claim(self) -> None:
        return jsii.invoke(self, "resetAllowClaim", [])

    @jsii.member(jsii_name="resetDisallowPublicIpAddress")
    def reset_disallow_public_ip_address(self) -> None:
        return jsii.invoke(self, "resetDisallowPublicIpAddress", [])

    @jsii.member(jsii_name="resetInboundNatRule")
    def reset_inbound_nat_rule(self) -> None:
        return jsii.invoke(self, "resetInboundNatRule", [])

    @jsii.member(jsii_name="resetNotes")
    def reset_notes(self) -> None:
        return jsii.invoke(self, "resetNotes", [])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetSshKey")
    def reset_ssh_key(self) -> None:
        return jsii.invoke(self, "resetSshKey", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryImageReferenceInput")
    def gallery_image_reference_input(
        self,
    ) -> typing.List["DevTestLinuxVirtualMachineGalleryImageReference"]:
        return jsii.get(self, "galleryImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labNameInput")
    def lab_name_input(self) -> builtins.str:
        return jsii.get(self, "labNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labSubnetNameInput")
    def lab_subnet_name_input(self) -> builtins.str:
        return jsii.get(self, "labSubnetNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labVirtualNetworkIdInput")
    def lab_virtual_network_id_input(self) -> builtins.str:
        return jsii.get(self, "labVirtualNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInput")
    def size_input(self) -> builtins.str:
        return jsii.get(self, "sizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageTypeInput")
    def storage_type_input(self) -> builtins.str:
        return jsii.get(self, "storageTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueIdentifier")
    def unique_identifier(self) -> builtins.str:
        return jsii.get(self, "uniqueIdentifier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usernameInput")
    def username_input(self) -> builtins.str:
        return jsii.get(self, "usernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowClaimInput")
    def allow_claim_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowClaimInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disallowPublicIpAddressInput")
    def disallow_public_ip_address_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disallowPublicIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inboundNatRuleInput")
    def inbound_nat_rule_input(
        self,
    ) -> typing.Optional[typing.List["DevTestLinuxVirtualMachineInboundNatRule"]]:
        return jsii.get(self, "inboundNatRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notesInput")
    def notes_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "notesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshKeyInput")
    def ssh_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sshKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DevTestLinuxVirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowClaim")
    def allow_claim(self) -> builtins.bool:
        return jsii.get(self, "allowClaim")

    @allow_claim.setter # type: ignore
    def allow_claim(self, value: builtins.bool) -> None:
        jsii.set(self, "allowClaim", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disallowPublicIpAddress")
    def disallow_public_ip_address(self) -> builtins.bool:
        return jsii.get(self, "disallowPublicIpAddress")

    @disallow_public_ip_address.setter # type: ignore
    def disallow_public_ip_address(self, value: builtins.bool) -> None:
        jsii.set(self, "disallowPublicIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryImageReference")
    def gallery_image_reference(
        self,
    ) -> typing.List["DevTestLinuxVirtualMachineGalleryImageReference"]:
        return jsii.get(self, "galleryImageReference")

    @gallery_image_reference.setter # type: ignore
    def gallery_image_reference(
        self,
        value: typing.List["DevTestLinuxVirtualMachineGalleryImageReference"],
    ) -> None:
        jsii.set(self, "galleryImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inboundNatRule")
    def inbound_nat_rule(
        self,
    ) -> typing.List["DevTestLinuxVirtualMachineInboundNatRule"]:
        return jsii.get(self, "inboundNatRule")

    @inbound_nat_rule.setter # type: ignore
    def inbound_nat_rule(
        self,
        value: typing.List["DevTestLinuxVirtualMachineInboundNatRule"],
    ) -> None:
        jsii.set(self, "inboundNatRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labName")
    def lab_name(self) -> builtins.str:
        return jsii.get(self, "labName")

    @lab_name.setter # type: ignore
    def lab_name(self, value: builtins.str) -> None:
        jsii.set(self, "labName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labSubnetName")
    def lab_subnet_name(self) -> builtins.str:
        return jsii.get(self, "labSubnetName")

    @lab_subnet_name.setter # type: ignore
    def lab_subnet_name(self, value: builtins.str) -> None:
        jsii.set(self, "labSubnetName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labVirtualNetworkId")
    def lab_virtual_network_id(self) -> builtins.str:
        return jsii.get(self, "labVirtualNetworkId")

    @lab_virtual_network_id.setter # type: ignore
    def lab_virtual_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "labVirtualNetworkId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notes")
    def notes(self) -> builtins.str:
        return jsii.get(self, "notes")

    @notes.setter # type: ignore
    def notes(self, value: builtins.str) -> None:
        jsii.set(self, "notes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="size")
    def size(self) -> builtins.str:
        return jsii.get(self, "size")

    @size.setter # type: ignore
    def size(self, value: builtins.str) -> None:
        jsii.set(self, "size", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshKey")
    def ssh_key(self) -> builtins.str:
        return jsii.get(self, "sshKey")

    @ssh_key.setter # type: ignore
    def ssh_key(self, value: builtins.str) -> None:
        jsii.set(self, "sshKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageType")
    def storage_type(self) -> builtins.str:
        return jsii.get(self, "storageType")

    @storage_type.setter # type: ignore
    def storage_type(self, value: builtins.str) -> None:
        jsii.set(self, "storageType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevTestLinuxVirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevTestLinuxVirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")

    @username.setter # type: ignore
    def username(self, value: builtins.str) -> None:
        jsii.set(self, "username", value)


@jsii.data_type(
    jsii_type="azurerm.DevTestLinuxVirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "gallery_image_reference": "galleryImageReference",
        "lab_name": "labName",
        "lab_subnet_name": "labSubnetName",
        "lab_virtual_network_id": "labVirtualNetworkId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "size": "size",
        "storage_type": "storageType",
        "username": "username",
        "allow_claim": "allowClaim",
        "disallow_public_ip_address": "disallowPublicIpAddress",
        "inbound_nat_rule": "inboundNatRule",
        "notes": "notes",
        "password": "password",
        "ssh_key": "sshKey",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DevTestLinuxVirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        gallery_image_reference: typing.List["DevTestLinuxVirtualMachineGalleryImageReference"],
        lab_name: builtins.str,
        lab_subnet_name: builtins.str,
        lab_virtual_network_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        size: builtins.str,
        storage_type: builtins.str,
        username: builtins.str,
        allow_claim: typing.Optional[builtins.bool] = None,
        disallow_public_ip_address: typing.Optional[builtins.bool] = None,
        inbound_nat_rule: typing.Optional[typing.List["DevTestLinuxVirtualMachineInboundNatRule"]] = None,
        notes: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_key: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestLinuxVirtualMachineTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param gallery_image_reference: gallery_image_reference block.
        :param lab_name: -
        :param lab_subnet_name: -
        :param lab_virtual_network_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param size: -
        :param storage_type: -
        :param username: -
        :param allow_claim: -
        :param disallow_public_ip_address: -
        :param inbound_nat_rule: inbound_nat_rule block.
        :param notes: -
        :param password: -
        :param ssh_key: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevTestLinuxVirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "gallery_image_reference": gallery_image_reference,
            "lab_name": lab_name,
            "lab_subnet_name": lab_subnet_name,
            "lab_virtual_network_id": lab_virtual_network_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "size": size,
            "storage_type": storage_type,
            "username": username,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allow_claim is not None:
            self._values["allow_claim"] = allow_claim
        if disallow_public_ip_address is not None:
            self._values["disallow_public_ip_address"] = disallow_public_ip_address
        if inbound_nat_rule is not None:
            self._values["inbound_nat_rule"] = inbound_nat_rule
        if notes is not None:
            self._values["notes"] = notes
        if password is not None:
            self._values["password"] = password
        if ssh_key is not None:
            self._values["ssh_key"] = ssh_key
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def gallery_image_reference(
        self,
    ) -> typing.List["DevTestLinuxVirtualMachineGalleryImageReference"]:
        """gallery_image_reference block."""
        result = self._values.get("gallery_image_reference")
        assert result is not None, "Required property 'gallery_image_reference' is missing"
        return result

    @builtins.property
    def lab_name(self) -> builtins.str:
        result = self._values.get("lab_name")
        assert result is not None, "Required property 'lab_name' is missing"
        return result

    @builtins.property
    def lab_subnet_name(self) -> builtins.str:
        result = self._values.get("lab_subnet_name")
        assert result is not None, "Required property 'lab_subnet_name' is missing"
        return result

    @builtins.property
    def lab_virtual_network_id(self) -> builtins.str:
        result = self._values.get("lab_virtual_network_id")
        assert result is not None, "Required property 'lab_virtual_network_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def size(self) -> builtins.str:
        result = self._values.get("size")
        assert result is not None, "Required property 'size' is missing"
        return result

    @builtins.property
    def storage_type(self) -> builtins.str:
        result = self._values.get("storage_type")
        assert result is not None, "Required property 'storage_type' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def allow_claim(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_claim")
        return result

    @builtins.property
    def disallow_public_ip_address(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disallow_public_ip_address")
        return result

    @builtins.property
    def inbound_nat_rule(
        self,
    ) -> typing.Optional[typing.List["DevTestLinuxVirtualMachineInboundNatRule"]]:
        """inbound_nat_rule block."""
        result = self._values.get("inbound_nat_rule")
        return result

    @builtins.property
    def notes(self) -> typing.Optional[builtins.str]:
        result = self._values.get("notes")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssh_key")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevTestLinuxVirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestLinuxVirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestLinuxVirtualMachineGalleryImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class DevTestLinuxVirtualMachineGalleryImageReference:
    def __init__(
        self,
        *,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        version: builtins.str,
    ) -> None:
        """
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
            "version": version,
        }

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestLinuxVirtualMachineGalleryImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestLinuxVirtualMachineInboundNatRule",
    jsii_struct_bases=[],
    name_mapping={"backend_port": "backendPort", "protocol": "protocol"},
)
class DevTestLinuxVirtualMachineInboundNatRule:
    def __init__(self, *, backend_port: jsii.Number, protocol: builtins.str) -> None:
        """
        :param backend_port: -
        :param protocol: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "backend_port": backend_port,
            "protocol": protocol,
        }

    @builtins.property
    def backend_port(self) -> jsii.Number:
        result = self._values.get("backend_port")
        assert result is not None, "Required property 'backend_port' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestLinuxVirtualMachineInboundNatRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestLinuxVirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevTestLinuxVirtualMachineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestLinuxVirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevTestPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevTestPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        evaluator_type: builtins.str,
        lab_name: builtins.str,
        name: builtins.str,
        policy_set_name: builtins.str,
        resource_group_name: builtins.str,
        threshold: builtins.str,
        description: typing.Optional[builtins.str] = None,
        fact_data: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param evaluator_type: -
        :param lab_name: -
        :param name: -
        :param policy_set_name: -
        :param resource_group_name: -
        :param threshold: -
        :param description: -
        :param fact_data: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevTestPolicyConfig(
            evaluator_type=evaluator_type,
            lab_name=lab_name,
            name=name,
            policy_set_name=policy_set_name,
            resource_group_name=resource_group_name,
            threshold=threshold,
            description=description,
            fact_data=fact_data,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevTestPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFactData")
    def reset_fact_data(self) -> None:
        return jsii.invoke(self, "resetFactData", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evaluatorTypeInput")
    def evaluator_type_input(self) -> builtins.str:
        return jsii.get(self, "evaluatorTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labNameInput")
    def lab_name_input(self) -> builtins.str:
        return jsii.get(self, "labNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policySetNameInput")
    def policy_set_name_input(self) -> builtins.str:
        return jsii.get(self, "policySetNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thresholdInput")
    def threshold_input(self) -> builtins.str:
        return jsii.get(self, "thresholdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="factDataInput")
    def fact_data_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "factDataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DevTestPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evaluatorType")
    def evaluator_type(self) -> builtins.str:
        return jsii.get(self, "evaluatorType")

    @evaluator_type.setter # type: ignore
    def evaluator_type(self, value: builtins.str) -> None:
        jsii.set(self, "evaluatorType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="factData")
    def fact_data(self) -> builtins.str:
        return jsii.get(self, "factData")

    @fact_data.setter # type: ignore
    def fact_data(self, value: builtins.str) -> None:
        jsii.set(self, "factData", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labName")
    def lab_name(self) -> builtins.str:
        return jsii.get(self, "labName")

    @lab_name.setter # type: ignore
    def lab_name(self, value: builtins.str) -> None:
        jsii.set(self, "labName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policySetName")
    def policy_set_name(self) -> builtins.str:
        return jsii.get(self, "policySetName")

    @policy_set_name.setter # type: ignore
    def policy_set_name(self, value: builtins.str) -> None:
        jsii.set(self, "policySetName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threshold")
    def threshold(self) -> builtins.str:
        return jsii.get(self, "threshold")

    @threshold.setter # type: ignore
    def threshold(self, value: builtins.str) -> None:
        jsii.set(self, "threshold", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevTestPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevTestPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DevTestPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "evaluator_type": "evaluatorType",
        "lab_name": "labName",
        "name": "name",
        "policy_set_name": "policySetName",
        "resource_group_name": "resourceGroupName",
        "threshold": "threshold",
        "description": "description",
        "fact_data": "factData",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DevTestPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        evaluator_type: builtins.str,
        lab_name: builtins.str,
        name: builtins.str,
        policy_set_name: builtins.str,
        resource_group_name: builtins.str,
        threshold: builtins.str,
        description: typing.Optional[builtins.str] = None,
        fact_data: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param evaluator_type: -
        :param lab_name: -
        :param name: -
        :param policy_set_name: -
        :param resource_group_name: -
        :param threshold: -
        :param description: -
        :param fact_data: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevTestPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "evaluator_type": evaluator_type,
            "lab_name": lab_name,
            "name": name,
            "policy_set_name": policy_set_name,
            "resource_group_name": resource_group_name,
            "threshold": threshold,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if fact_data is not None:
            self._values["fact_data"] = fact_data
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def evaluator_type(self) -> builtins.str:
        result = self._values.get("evaluator_type")
        assert result is not None, "Required property 'evaluator_type' is missing"
        return result

    @builtins.property
    def lab_name(self) -> builtins.str:
        result = self._values.get("lab_name")
        assert result is not None, "Required property 'lab_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def policy_set_name(self) -> builtins.str:
        result = self._values.get("policy_set_name")
        assert result is not None, "Required property 'policy_set_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def threshold(self) -> builtins.str:
        result = self._values.get("threshold")
        assert result is not None, "Required property 'threshold' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def fact_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("fact_data")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevTestPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevTestPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevTestSchedule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevTestSchedule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        lab_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        notification_settings: typing.List["DevTestScheduleNotificationSettings"],
        resource_group_name: builtins.str,
        task_type: builtins.str,
        time_zone_id: builtins.str,
        daily_recurrence: typing.Optional[typing.List["DevTestScheduleDailyRecurrence"]] = None,
        hourly_recurrence: typing.Optional[typing.List["DevTestScheduleHourlyRecurrence"]] = None,
        status: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestScheduleTimeouts"] = None,
        weekly_recurrence: typing.Optional[typing.List["DevTestScheduleWeeklyRecurrence"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param lab_name: -
        :param location: -
        :param name: -
        :param notification_settings: notification_settings block.
        :param resource_group_name: -
        :param task_type: -
        :param time_zone_id: -
        :param daily_recurrence: daily_recurrence block.
        :param hourly_recurrence: hourly_recurrence block.
        :param status: -
        :param tags: -
        :param timeouts: timeouts block.
        :param weekly_recurrence: weekly_recurrence block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevTestScheduleConfig(
            lab_name=lab_name,
            location=location,
            name=name,
            notification_settings=notification_settings,
            resource_group_name=resource_group_name,
            task_type=task_type,
            time_zone_id=time_zone_id,
            daily_recurrence=daily_recurrence,
            hourly_recurrence=hourly_recurrence,
            status=status,
            tags=tags,
            timeouts=timeouts,
            weekly_recurrence=weekly_recurrence,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevTestSchedule, self, [scope, id, config])

    @jsii.member(jsii_name="resetDailyRecurrence")
    def reset_daily_recurrence(self) -> None:
        return jsii.invoke(self, "resetDailyRecurrence", [])

    @jsii.member(jsii_name="resetHourlyRecurrence")
    def reset_hourly_recurrence(self) -> None:
        return jsii.invoke(self, "resetHourlyRecurrence", [])

    @jsii.member(jsii_name="resetStatus")
    def reset_status(self) -> None:
        return jsii.invoke(self, "resetStatus", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWeeklyRecurrence")
    def reset_weekly_recurrence(self) -> None:
        return jsii.invoke(self, "resetWeeklyRecurrence", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labNameInput")
    def lab_name_input(self) -> builtins.str:
        return jsii.get(self, "labNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationSettingsInput")
    def notification_settings_input(
        self,
    ) -> typing.List["DevTestScheduleNotificationSettings"]:
        return jsii.get(self, "notificationSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="taskTypeInput")
    def task_type_input(self) -> builtins.str:
        return jsii.get(self, "taskTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeZoneIdInput")
    def time_zone_id_input(self) -> builtins.str:
        return jsii.get(self, "timeZoneIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyRecurrenceInput")
    def daily_recurrence_input(
        self,
    ) -> typing.Optional[typing.List["DevTestScheduleDailyRecurrence"]]:
        return jsii.get(self, "dailyRecurrenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hourlyRecurrenceInput")
    def hourly_recurrence_input(
        self,
    ) -> typing.Optional[typing.List["DevTestScheduleHourlyRecurrence"]]:
        return jsii.get(self, "hourlyRecurrenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="statusInput")
    def status_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "statusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DevTestScheduleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="weeklyRecurrenceInput")
    def weekly_recurrence_input(
        self,
    ) -> typing.Optional[typing.List["DevTestScheduleWeeklyRecurrence"]]:
        return jsii.get(self, "weeklyRecurrenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyRecurrence")
    def daily_recurrence(self) -> typing.List["DevTestScheduleDailyRecurrence"]:
        return jsii.get(self, "dailyRecurrence")

    @daily_recurrence.setter # type: ignore
    def daily_recurrence(
        self,
        value: typing.List["DevTestScheduleDailyRecurrence"],
    ) -> None:
        jsii.set(self, "dailyRecurrence", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hourlyRecurrence")
    def hourly_recurrence(self) -> typing.List["DevTestScheduleHourlyRecurrence"]:
        return jsii.get(self, "hourlyRecurrence")

    @hourly_recurrence.setter # type: ignore
    def hourly_recurrence(
        self,
        value: typing.List["DevTestScheduleHourlyRecurrence"],
    ) -> None:
        jsii.set(self, "hourlyRecurrence", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labName")
    def lab_name(self) -> builtins.str:
        return jsii.get(self, "labName")

    @lab_name.setter # type: ignore
    def lab_name(self, value: builtins.str) -> None:
        jsii.set(self, "labName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationSettings")
    def notification_settings(
        self,
    ) -> typing.List["DevTestScheduleNotificationSettings"]:
        return jsii.get(self, "notificationSettings")

    @notification_settings.setter # type: ignore
    def notification_settings(
        self,
        value: typing.List["DevTestScheduleNotificationSettings"],
    ) -> None:
        jsii.set(self, "notificationSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")

    @status.setter # type: ignore
    def status(self, value: builtins.str) -> None:
        jsii.set(self, "status", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="taskType")
    def task_type(self) -> builtins.str:
        return jsii.get(self, "taskType")

    @task_type.setter # type: ignore
    def task_type(self, value: builtins.str) -> None:
        jsii.set(self, "taskType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevTestScheduleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevTestScheduleTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeZoneId")
    def time_zone_id(self) -> builtins.str:
        return jsii.get(self, "timeZoneId")

    @time_zone_id.setter # type: ignore
    def time_zone_id(self, value: builtins.str) -> None:
        jsii.set(self, "timeZoneId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="weeklyRecurrence")
    def weekly_recurrence(self) -> typing.List["DevTestScheduleWeeklyRecurrence"]:
        return jsii.get(self, "weeklyRecurrence")

    @weekly_recurrence.setter # type: ignore
    def weekly_recurrence(
        self,
        value: typing.List["DevTestScheduleWeeklyRecurrence"],
    ) -> None:
        jsii.set(self, "weeklyRecurrence", value)


@jsii.data_type(
    jsii_type="azurerm.DevTestScheduleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "lab_name": "labName",
        "location": "location",
        "name": "name",
        "notification_settings": "notificationSettings",
        "resource_group_name": "resourceGroupName",
        "task_type": "taskType",
        "time_zone_id": "timeZoneId",
        "daily_recurrence": "dailyRecurrence",
        "hourly_recurrence": "hourlyRecurrence",
        "status": "status",
        "tags": "tags",
        "timeouts": "timeouts",
        "weekly_recurrence": "weeklyRecurrence",
    },
)
class DevTestScheduleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        lab_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        notification_settings: typing.List["DevTestScheduleNotificationSettings"],
        resource_group_name: builtins.str,
        task_type: builtins.str,
        time_zone_id: builtins.str,
        daily_recurrence: typing.Optional[typing.List["DevTestScheduleDailyRecurrence"]] = None,
        hourly_recurrence: typing.Optional[typing.List["DevTestScheduleHourlyRecurrence"]] = None,
        status: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestScheduleTimeouts"] = None,
        weekly_recurrence: typing.Optional[typing.List["DevTestScheduleWeeklyRecurrence"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param lab_name: -
        :param location: -
        :param name: -
        :param notification_settings: notification_settings block.
        :param resource_group_name: -
        :param task_type: -
        :param time_zone_id: -
        :param daily_recurrence: daily_recurrence block.
        :param hourly_recurrence: hourly_recurrence block.
        :param status: -
        :param tags: -
        :param timeouts: timeouts block.
        :param weekly_recurrence: weekly_recurrence block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevTestScheduleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "lab_name": lab_name,
            "location": location,
            "name": name,
            "notification_settings": notification_settings,
            "resource_group_name": resource_group_name,
            "task_type": task_type,
            "time_zone_id": time_zone_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if daily_recurrence is not None:
            self._values["daily_recurrence"] = daily_recurrence
        if hourly_recurrence is not None:
            self._values["hourly_recurrence"] = hourly_recurrence
        if status is not None:
            self._values["status"] = status
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if weekly_recurrence is not None:
            self._values["weekly_recurrence"] = weekly_recurrence

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def lab_name(self) -> builtins.str:
        result = self._values.get("lab_name")
        assert result is not None, "Required property 'lab_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def notification_settings(
        self,
    ) -> typing.List["DevTestScheduleNotificationSettings"]:
        """notification_settings block."""
        result = self._values.get("notification_settings")
        assert result is not None, "Required property 'notification_settings' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def task_type(self) -> builtins.str:
        result = self._values.get("task_type")
        assert result is not None, "Required property 'task_type' is missing"
        return result

    @builtins.property
    def time_zone_id(self) -> builtins.str:
        result = self._values.get("time_zone_id")
        assert result is not None, "Required property 'time_zone_id' is missing"
        return result

    @builtins.property
    def daily_recurrence(
        self,
    ) -> typing.Optional[typing.List["DevTestScheduleDailyRecurrence"]]:
        """daily_recurrence block."""
        result = self._values.get("daily_recurrence")
        return result

    @builtins.property
    def hourly_recurrence(
        self,
    ) -> typing.Optional[typing.List["DevTestScheduleHourlyRecurrence"]]:
        """hourly_recurrence block."""
        result = self._values.get("hourly_recurrence")
        return result

    @builtins.property
    def status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("status")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevTestScheduleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def weekly_recurrence(
        self,
    ) -> typing.Optional[typing.List["DevTestScheduleWeeklyRecurrence"]]:
        """weekly_recurrence block."""
        result = self._values.get("weekly_recurrence")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestScheduleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestScheduleDailyRecurrence",
    jsii_struct_bases=[],
    name_mapping={"time": "time"},
)
class DevTestScheduleDailyRecurrence:
    def __init__(self, *, time: builtins.str) -> None:
        """
        :param time: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "time": time,
        }

    @builtins.property
    def time(self) -> builtins.str:
        result = self._values.get("time")
        assert result is not None, "Required property 'time' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestScheduleDailyRecurrence(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestScheduleHourlyRecurrence",
    jsii_struct_bases=[],
    name_mapping={"minute": "minute"},
)
class DevTestScheduleHourlyRecurrence:
    def __init__(self, *, minute: jsii.Number) -> None:
        """
        :param minute: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "minute": minute,
        }

    @builtins.property
    def minute(self) -> jsii.Number:
        result = self._values.get("minute")
        assert result is not None, "Required property 'minute' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestScheduleHourlyRecurrence(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestScheduleNotificationSettings",
    jsii_struct_bases=[],
    name_mapping={
        "status": "status",
        "time_in_minutes": "timeInMinutes",
        "webhook_url": "webhookUrl",
    },
)
class DevTestScheduleNotificationSettings:
    def __init__(
        self,
        *,
        status: typing.Optional[builtins.str] = None,
        time_in_minutes: typing.Optional[jsii.Number] = None,
        webhook_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param status: -
        :param time_in_minutes: -
        :param webhook_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if status is not None:
            self._values["status"] = status
        if time_in_minutes is not None:
            self._values["time_in_minutes"] = time_in_minutes
        if webhook_url is not None:
            self._values["webhook_url"] = webhook_url

    @builtins.property
    def status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("status")
        return result

    @builtins.property
    def time_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("time_in_minutes")
        return result

    @builtins.property
    def webhook_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("webhook_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestScheduleNotificationSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestScheduleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevTestScheduleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestScheduleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestScheduleWeeklyRecurrence",
    jsii_struct_bases=[],
    name_mapping={"time": "time", "week_days": "weekDays"},
)
class DevTestScheduleWeeklyRecurrence:
    def __init__(
        self,
        *,
        time: builtins.str,
        week_days: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param time: -
        :param week_days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "time": time,
        }
        if week_days is not None:
            self._values["week_days"] = week_days

    @builtins.property
    def time(self) -> builtins.str:
        result = self._values.get("time")
        assert result is not None, "Required property 'time' is missing"
        return result

    @builtins.property
    def week_days(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("week_days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestScheduleWeeklyRecurrence(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevTestVirtualNetwork(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevTestVirtualNetwork",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        lab_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        subnet: typing.Optional[typing.List["DevTestVirtualNetworkSubnet"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestVirtualNetworkTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param lab_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param subnet: subnet block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevTestVirtualNetworkConfig(
            lab_name=lab_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            subnet=subnet,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevTestVirtualNetwork, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetSubnet")
    def reset_subnet(self) -> None:
        return jsii.invoke(self, "resetSubnet", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labNameInput")
    def lab_name_input(self) -> builtins.str:
        return jsii.get(self, "labNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueIdentifier")
    def unique_identifier(self) -> builtins.str:
        return jsii.get(self, "uniqueIdentifier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetInput")
    def subnet_input(
        self,
    ) -> typing.Optional[typing.List["DevTestVirtualNetworkSubnet"]]:
        return jsii.get(self, "subnetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DevTestVirtualNetworkTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labName")
    def lab_name(self) -> builtins.str:
        return jsii.get(self, "labName")

    @lab_name.setter # type: ignore
    def lab_name(self, value: builtins.str) -> None:
        jsii.set(self, "labName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnet")
    def subnet(self) -> typing.List["DevTestVirtualNetworkSubnet"]:
        return jsii.get(self, "subnet")

    @subnet.setter # type: ignore
    def subnet(self, value: typing.List["DevTestVirtualNetworkSubnet"]) -> None:
        jsii.set(self, "subnet", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevTestVirtualNetworkTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevTestVirtualNetworkTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DevTestVirtualNetworkConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "lab_name": "labName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "subnet": "subnet",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DevTestVirtualNetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        lab_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        subnet: typing.Optional[typing.List["DevTestVirtualNetworkSubnet"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestVirtualNetworkTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param lab_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param subnet: subnet block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevTestVirtualNetworkTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "lab_name": lab_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if subnet is not None:
            self._values["subnet"] = subnet
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def lab_name(self) -> builtins.str:
        result = self._values.get("lab_name")
        assert result is not None, "Required property 'lab_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def subnet(self) -> typing.Optional[typing.List["DevTestVirtualNetworkSubnet"]]:
        """subnet block."""
        result = self._values.get("subnet")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevTestVirtualNetworkTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestVirtualNetworkConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestVirtualNetworkSubnet",
    jsii_struct_bases=[],
    name_mapping={
        "use_in_virtual_machine_creation": "useInVirtualMachineCreation",
        "use_public_ip_address": "usePublicIpAddress",
    },
)
class DevTestVirtualNetworkSubnet:
    def __init__(
        self,
        *,
        use_in_virtual_machine_creation: typing.Optional[builtins.str] = None,
        use_public_ip_address: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param use_in_virtual_machine_creation: -
        :param use_public_ip_address: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if use_in_virtual_machine_creation is not None:
            self._values["use_in_virtual_machine_creation"] = use_in_virtual_machine_creation
        if use_public_ip_address is not None:
            self._values["use_public_ip_address"] = use_public_ip_address

    @builtins.property
    def use_in_virtual_machine_creation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("use_in_virtual_machine_creation")
        return result

    @builtins.property
    def use_public_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("use_public_ip_address")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestVirtualNetworkSubnet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestVirtualNetworkTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevTestVirtualNetworkTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestVirtualNetworkTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevTestWindowsVirtualMachine(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevTestWindowsVirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        gallery_image_reference: typing.List["DevTestWindowsVirtualMachineGalleryImageReference"],
        lab_name: builtins.str,
        lab_subnet_name: builtins.str,
        lab_virtual_network_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        password: builtins.str,
        resource_group_name: builtins.str,
        size: builtins.str,
        storage_type: builtins.str,
        username: builtins.str,
        allow_claim: typing.Optional[builtins.bool] = None,
        disallow_public_ip_address: typing.Optional[builtins.bool] = None,
        inbound_nat_rule: typing.Optional[typing.List["DevTestWindowsVirtualMachineInboundNatRule"]] = None,
        notes: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestWindowsVirtualMachineTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param gallery_image_reference: gallery_image_reference block.
        :param lab_name: -
        :param lab_subnet_name: -
        :param lab_virtual_network_id: -
        :param location: -
        :param name: -
        :param password: -
        :param resource_group_name: -
        :param size: -
        :param storage_type: -
        :param username: -
        :param allow_claim: -
        :param disallow_public_ip_address: -
        :param inbound_nat_rule: inbound_nat_rule block.
        :param notes: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevTestWindowsVirtualMachineConfig(
            gallery_image_reference=gallery_image_reference,
            lab_name=lab_name,
            lab_subnet_name=lab_subnet_name,
            lab_virtual_network_id=lab_virtual_network_id,
            location=location,
            name=name,
            password=password,
            resource_group_name=resource_group_name,
            size=size,
            storage_type=storage_type,
            username=username,
            allow_claim=allow_claim,
            disallow_public_ip_address=disallow_public_ip_address,
            inbound_nat_rule=inbound_nat_rule,
            notes=notes,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevTestWindowsVirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowClaim")
    def reset_allow_claim(self) -> None:
        return jsii.invoke(self, "resetAllowClaim", [])

    @jsii.member(jsii_name="resetDisallowPublicIpAddress")
    def reset_disallow_public_ip_address(self) -> None:
        return jsii.invoke(self, "resetDisallowPublicIpAddress", [])

    @jsii.member(jsii_name="resetInboundNatRule")
    def reset_inbound_nat_rule(self) -> None:
        return jsii.invoke(self, "resetInboundNatRule", [])

    @jsii.member(jsii_name="resetNotes")
    def reset_notes(self) -> None:
        return jsii.invoke(self, "resetNotes", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryImageReferenceInput")
    def gallery_image_reference_input(
        self,
    ) -> typing.List["DevTestWindowsVirtualMachineGalleryImageReference"]:
        return jsii.get(self, "galleryImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labNameInput")
    def lab_name_input(self) -> builtins.str:
        return jsii.get(self, "labNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labSubnetNameInput")
    def lab_subnet_name_input(self) -> builtins.str:
        return jsii.get(self, "labSubnetNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labVirtualNetworkIdInput")
    def lab_virtual_network_id_input(self) -> builtins.str:
        return jsii.get(self, "labVirtualNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> builtins.str:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInput")
    def size_input(self) -> builtins.str:
        return jsii.get(self, "sizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageTypeInput")
    def storage_type_input(self) -> builtins.str:
        return jsii.get(self, "storageTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueIdentifier")
    def unique_identifier(self) -> builtins.str:
        return jsii.get(self, "uniqueIdentifier")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usernameInput")
    def username_input(self) -> builtins.str:
        return jsii.get(self, "usernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowClaimInput")
    def allow_claim_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowClaimInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disallowPublicIpAddressInput")
    def disallow_public_ip_address_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disallowPublicIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inboundNatRuleInput")
    def inbound_nat_rule_input(
        self,
    ) -> typing.Optional[typing.List["DevTestWindowsVirtualMachineInboundNatRule"]]:
        return jsii.get(self, "inboundNatRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notesInput")
    def notes_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "notesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DevTestWindowsVirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowClaim")
    def allow_claim(self) -> builtins.bool:
        return jsii.get(self, "allowClaim")

    @allow_claim.setter # type: ignore
    def allow_claim(self, value: builtins.bool) -> None:
        jsii.set(self, "allowClaim", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disallowPublicIpAddress")
    def disallow_public_ip_address(self) -> builtins.bool:
        return jsii.get(self, "disallowPublicIpAddress")

    @disallow_public_ip_address.setter # type: ignore
    def disallow_public_ip_address(self, value: builtins.bool) -> None:
        jsii.set(self, "disallowPublicIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryImageReference")
    def gallery_image_reference(
        self,
    ) -> typing.List["DevTestWindowsVirtualMachineGalleryImageReference"]:
        return jsii.get(self, "galleryImageReference")

    @gallery_image_reference.setter # type: ignore
    def gallery_image_reference(
        self,
        value: typing.List["DevTestWindowsVirtualMachineGalleryImageReference"],
    ) -> None:
        jsii.set(self, "galleryImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inboundNatRule")
    def inbound_nat_rule(
        self,
    ) -> typing.List["DevTestWindowsVirtualMachineInboundNatRule"]:
        return jsii.get(self, "inboundNatRule")

    @inbound_nat_rule.setter # type: ignore
    def inbound_nat_rule(
        self,
        value: typing.List["DevTestWindowsVirtualMachineInboundNatRule"],
    ) -> None:
        jsii.set(self, "inboundNatRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labName")
    def lab_name(self) -> builtins.str:
        return jsii.get(self, "labName")

    @lab_name.setter # type: ignore
    def lab_name(self, value: builtins.str) -> None:
        jsii.set(self, "labName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labSubnetName")
    def lab_subnet_name(self) -> builtins.str:
        return jsii.get(self, "labSubnetName")

    @lab_subnet_name.setter # type: ignore
    def lab_subnet_name(self, value: builtins.str) -> None:
        jsii.set(self, "labSubnetName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labVirtualNetworkId")
    def lab_virtual_network_id(self) -> builtins.str:
        return jsii.get(self, "labVirtualNetworkId")

    @lab_virtual_network_id.setter # type: ignore
    def lab_virtual_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "labVirtualNetworkId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notes")
    def notes(self) -> builtins.str:
        return jsii.get(self, "notes")

    @notes.setter # type: ignore
    def notes(self, value: builtins.str) -> None:
        jsii.set(self, "notes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="size")
    def size(self) -> builtins.str:
        return jsii.get(self, "size")

    @size.setter # type: ignore
    def size(self, value: builtins.str) -> None:
        jsii.set(self, "size", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageType")
    def storage_type(self) -> builtins.str:
        return jsii.get(self, "storageType")

    @storage_type.setter # type: ignore
    def storage_type(self, value: builtins.str) -> None:
        jsii.set(self, "storageType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevTestWindowsVirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevTestWindowsVirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")

    @username.setter # type: ignore
    def username(self, value: builtins.str) -> None:
        jsii.set(self, "username", value)


@jsii.data_type(
    jsii_type="azurerm.DevTestWindowsVirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "gallery_image_reference": "galleryImageReference",
        "lab_name": "labName",
        "lab_subnet_name": "labSubnetName",
        "lab_virtual_network_id": "labVirtualNetworkId",
        "location": "location",
        "name": "name",
        "password": "password",
        "resource_group_name": "resourceGroupName",
        "size": "size",
        "storage_type": "storageType",
        "username": "username",
        "allow_claim": "allowClaim",
        "disallow_public_ip_address": "disallowPublicIpAddress",
        "inbound_nat_rule": "inboundNatRule",
        "notes": "notes",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DevTestWindowsVirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        gallery_image_reference: typing.List["DevTestWindowsVirtualMachineGalleryImageReference"],
        lab_name: builtins.str,
        lab_subnet_name: builtins.str,
        lab_virtual_network_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        password: builtins.str,
        resource_group_name: builtins.str,
        size: builtins.str,
        storage_type: builtins.str,
        username: builtins.str,
        allow_claim: typing.Optional[builtins.bool] = None,
        disallow_public_ip_address: typing.Optional[builtins.bool] = None,
        inbound_nat_rule: typing.Optional[typing.List["DevTestWindowsVirtualMachineInboundNatRule"]] = None,
        notes: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevTestWindowsVirtualMachineTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param gallery_image_reference: gallery_image_reference block.
        :param lab_name: -
        :param lab_subnet_name: -
        :param lab_virtual_network_id: -
        :param location: -
        :param name: -
        :param password: -
        :param resource_group_name: -
        :param size: -
        :param storage_type: -
        :param username: -
        :param allow_claim: -
        :param disallow_public_ip_address: -
        :param inbound_nat_rule: inbound_nat_rule block.
        :param notes: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevTestWindowsVirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "gallery_image_reference": gallery_image_reference,
            "lab_name": lab_name,
            "lab_subnet_name": lab_subnet_name,
            "lab_virtual_network_id": lab_virtual_network_id,
            "location": location,
            "name": name,
            "password": password,
            "resource_group_name": resource_group_name,
            "size": size,
            "storage_type": storage_type,
            "username": username,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allow_claim is not None:
            self._values["allow_claim"] = allow_claim
        if disallow_public_ip_address is not None:
            self._values["disallow_public_ip_address"] = disallow_public_ip_address
        if inbound_nat_rule is not None:
            self._values["inbound_nat_rule"] = inbound_nat_rule
        if notes is not None:
            self._values["notes"] = notes
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def gallery_image_reference(
        self,
    ) -> typing.List["DevTestWindowsVirtualMachineGalleryImageReference"]:
        """gallery_image_reference block."""
        result = self._values.get("gallery_image_reference")
        assert result is not None, "Required property 'gallery_image_reference' is missing"
        return result

    @builtins.property
    def lab_name(self) -> builtins.str:
        result = self._values.get("lab_name")
        assert result is not None, "Required property 'lab_name' is missing"
        return result

    @builtins.property
    def lab_subnet_name(self) -> builtins.str:
        result = self._values.get("lab_subnet_name")
        assert result is not None, "Required property 'lab_subnet_name' is missing"
        return result

    @builtins.property
    def lab_virtual_network_id(self) -> builtins.str:
        result = self._values.get("lab_virtual_network_id")
        assert result is not None, "Required property 'lab_virtual_network_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def size(self) -> builtins.str:
        result = self._values.get("size")
        assert result is not None, "Required property 'size' is missing"
        return result

    @builtins.property
    def storage_type(self) -> builtins.str:
        result = self._values.get("storage_type")
        assert result is not None, "Required property 'storage_type' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def allow_claim(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_claim")
        return result

    @builtins.property
    def disallow_public_ip_address(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disallow_public_ip_address")
        return result

    @builtins.property
    def inbound_nat_rule(
        self,
    ) -> typing.Optional[typing.List["DevTestWindowsVirtualMachineInboundNatRule"]]:
        """inbound_nat_rule block."""
        result = self._values.get("inbound_nat_rule")
        return result

    @builtins.property
    def notes(self) -> typing.Optional[builtins.str]:
        result = self._values.get("notes")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevTestWindowsVirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestWindowsVirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestWindowsVirtualMachineGalleryImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class DevTestWindowsVirtualMachineGalleryImageReference:
    def __init__(
        self,
        *,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        version: builtins.str,
    ) -> None:
        """
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
            "version": version,
        }

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestWindowsVirtualMachineGalleryImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestWindowsVirtualMachineInboundNatRule",
    jsii_struct_bases=[],
    name_mapping={"backend_port": "backendPort", "protocol": "protocol"},
)
class DevTestWindowsVirtualMachineInboundNatRule:
    def __init__(self, *, backend_port: jsii.Number, protocol: builtins.str) -> None:
        """
        :param backend_port: -
        :param protocol: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "backend_port": backend_port,
            "protocol": protocol,
        }

    @builtins.property
    def backend_port(self) -> jsii.Number:
        result = self._values.get("backend_port")
        assert result is not None, "Required property 'backend_port' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestWindowsVirtualMachineInboundNatRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevTestWindowsVirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevTestWindowsVirtualMachineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevTestWindowsVirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DevspaceController(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DevspaceController",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        target_container_host_credentials_base64: builtins.str,
        target_container_host_resource_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevspaceControllerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param target_container_host_credentials_base64: -
        :param target_container_host_resource_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DevspaceControllerConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            target_container_host_credentials_base64=target_container_host_credentials_base64,
            target_container_host_resource_id=target_container_host_resource_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DevspaceController, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataPlaneFqdn")
    def data_plane_fqdn(self) -> builtins.str:
        return jsii.get(self, "dataPlaneFqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostSuffix")
    def host_suffix(self) -> builtins.str:
        return jsii.get(self, "hostSuffix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetContainerHostCredentialsBase64Input")
    def target_container_host_credentials_base64_input(self) -> builtins.str:
        return jsii.get(self, "targetContainerHostCredentialsBase64Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetContainerHostResourceIdInput")
    def target_container_host_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "targetContainerHostResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DevspaceControllerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetContainerHostCredentialsBase64")
    def target_container_host_credentials_base64(self) -> builtins.str:
        return jsii.get(self, "targetContainerHostCredentialsBase64")

    @target_container_host_credentials_base64.setter # type: ignore
    def target_container_host_credentials_base64(self, value: builtins.str) -> None:
        jsii.set(self, "targetContainerHostCredentialsBase64", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetContainerHostResourceId")
    def target_container_host_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetContainerHostResourceId")

    @target_container_host_resource_id.setter # type: ignore
    def target_container_host_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetContainerHostResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DevspaceControllerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DevspaceControllerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DevspaceControllerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "target_container_host_credentials_base64": "targetContainerHostCredentialsBase64",
        "target_container_host_resource_id": "targetContainerHostResourceId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DevspaceControllerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        target_container_host_credentials_base64: builtins.str,
        target_container_host_resource_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DevspaceControllerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param target_container_host_credentials_base64: -
        :param target_container_host_resource_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DevspaceControllerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "target_container_host_credentials_base64": target_container_host_credentials_base64,
            "target_container_host_resource_id": target_container_host_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def target_container_host_credentials_base64(self) -> builtins.str:
        result = self._values.get("target_container_host_credentials_base64")
        assert result is not None, "Required property 'target_container_host_credentials_base64' is missing"
        return result

    @builtins.property
    def target_container_host_resource_id(self) -> builtins.str:
        result = self._values.get("target_container_host_resource_id")
        assert result is not None, "Required property 'target_container_host_resource_id' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DevspaceControllerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevspaceControllerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DevspaceControllerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DevspaceControllerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DevspaceControllerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DigitalTwinsEndpointEventgrid(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DigitalTwinsEndpointEventgrid",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        digital_twins_id: builtins.str,
        eventgrid_topic_endpoint: builtins.str,
        eventgrid_topic_primary_access_key: builtins.str,
        eventgrid_topic_secondary_access_key: builtins.str,
        name: builtins.str,
        dead_letter_storage_secret: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DigitalTwinsEndpointEventgridTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param digital_twins_id: -
        :param eventgrid_topic_endpoint: -
        :param eventgrid_topic_primary_access_key: -
        :param eventgrid_topic_secondary_access_key: -
        :param name: -
        :param dead_letter_storage_secret: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DigitalTwinsEndpointEventgridConfig(
            digital_twins_id=digital_twins_id,
            eventgrid_topic_endpoint=eventgrid_topic_endpoint,
            eventgrid_topic_primary_access_key=eventgrid_topic_primary_access_key,
            eventgrid_topic_secondary_access_key=eventgrid_topic_secondary_access_key,
            name=name,
            dead_letter_storage_secret=dead_letter_storage_secret,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DigitalTwinsEndpointEventgrid, self, [scope, id, config])

    @jsii.member(jsii_name="resetDeadLetterStorageSecret")
    def reset_dead_letter_storage_secret(self) -> None:
        return jsii.invoke(self, "resetDeadLetterStorageSecret", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="digitalTwinsIdInput")
    def digital_twins_id_input(self) -> builtins.str:
        return jsii.get(self, "digitalTwinsIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventgridTopicEndpointInput")
    def eventgrid_topic_endpoint_input(self) -> builtins.str:
        return jsii.get(self, "eventgridTopicEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventgridTopicPrimaryAccessKeyInput")
    def eventgrid_topic_primary_access_key_input(self) -> builtins.str:
        return jsii.get(self, "eventgridTopicPrimaryAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventgridTopicSecondaryAccessKeyInput")
    def eventgrid_topic_secondary_access_key_input(self) -> builtins.str:
        return jsii.get(self, "eventgridTopicSecondaryAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetterStorageSecretInput")
    def dead_letter_storage_secret_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "deadLetterStorageSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DigitalTwinsEndpointEventgridTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetterStorageSecret")
    def dead_letter_storage_secret(self) -> builtins.str:
        return jsii.get(self, "deadLetterStorageSecret")

    @dead_letter_storage_secret.setter # type: ignore
    def dead_letter_storage_secret(self, value: builtins.str) -> None:
        jsii.set(self, "deadLetterStorageSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="digitalTwinsId")
    def digital_twins_id(self) -> builtins.str:
        return jsii.get(self, "digitalTwinsId")

    @digital_twins_id.setter # type: ignore
    def digital_twins_id(self, value: builtins.str) -> None:
        jsii.set(self, "digitalTwinsId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventgridTopicEndpoint")
    def eventgrid_topic_endpoint(self) -> builtins.str:
        return jsii.get(self, "eventgridTopicEndpoint")

    @eventgrid_topic_endpoint.setter # type: ignore
    def eventgrid_topic_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "eventgridTopicEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventgridTopicPrimaryAccessKey")
    def eventgrid_topic_primary_access_key(self) -> builtins.str:
        return jsii.get(self, "eventgridTopicPrimaryAccessKey")

    @eventgrid_topic_primary_access_key.setter # type: ignore
    def eventgrid_topic_primary_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "eventgridTopicPrimaryAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventgridTopicSecondaryAccessKey")
    def eventgrid_topic_secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "eventgridTopicSecondaryAccessKey")

    @eventgrid_topic_secondary_access_key.setter # type: ignore
    def eventgrid_topic_secondary_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "eventgridTopicSecondaryAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DigitalTwinsEndpointEventgridTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DigitalTwinsEndpointEventgridTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsEndpointEventgridConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "digital_twins_id": "digitalTwinsId",
        "eventgrid_topic_endpoint": "eventgridTopicEndpoint",
        "eventgrid_topic_primary_access_key": "eventgridTopicPrimaryAccessKey",
        "eventgrid_topic_secondary_access_key": "eventgridTopicSecondaryAccessKey",
        "name": "name",
        "dead_letter_storage_secret": "deadLetterStorageSecret",
        "timeouts": "timeouts",
    },
)
class DigitalTwinsEndpointEventgridConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        digital_twins_id: builtins.str,
        eventgrid_topic_endpoint: builtins.str,
        eventgrid_topic_primary_access_key: builtins.str,
        eventgrid_topic_secondary_access_key: builtins.str,
        name: builtins.str,
        dead_letter_storage_secret: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DigitalTwinsEndpointEventgridTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param digital_twins_id: -
        :param eventgrid_topic_endpoint: -
        :param eventgrid_topic_primary_access_key: -
        :param eventgrid_topic_secondary_access_key: -
        :param name: -
        :param dead_letter_storage_secret: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DigitalTwinsEndpointEventgridTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "digital_twins_id": digital_twins_id,
            "eventgrid_topic_endpoint": eventgrid_topic_endpoint,
            "eventgrid_topic_primary_access_key": eventgrid_topic_primary_access_key,
            "eventgrid_topic_secondary_access_key": eventgrid_topic_secondary_access_key,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if dead_letter_storage_secret is not None:
            self._values["dead_letter_storage_secret"] = dead_letter_storage_secret
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def digital_twins_id(self) -> builtins.str:
        result = self._values.get("digital_twins_id")
        assert result is not None, "Required property 'digital_twins_id' is missing"
        return result

    @builtins.property
    def eventgrid_topic_endpoint(self) -> builtins.str:
        result = self._values.get("eventgrid_topic_endpoint")
        assert result is not None, "Required property 'eventgrid_topic_endpoint' is missing"
        return result

    @builtins.property
    def eventgrid_topic_primary_access_key(self) -> builtins.str:
        result = self._values.get("eventgrid_topic_primary_access_key")
        assert result is not None, "Required property 'eventgrid_topic_primary_access_key' is missing"
        return result

    @builtins.property
    def eventgrid_topic_secondary_access_key(self) -> builtins.str:
        result = self._values.get("eventgrid_topic_secondary_access_key")
        assert result is not None, "Required property 'eventgrid_topic_secondary_access_key' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def dead_letter_storage_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dead_letter_storage_secret")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DigitalTwinsEndpointEventgridTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsEndpointEventgridConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsEndpointEventgridTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DigitalTwinsEndpointEventgridTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsEndpointEventgridTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DigitalTwinsEndpointEventhub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DigitalTwinsEndpointEventhub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        digital_twins_id: builtins.str,
        eventhub_primary_connection_string: builtins.str,
        eventhub_secondary_connection_string: builtins.str,
        name: builtins.str,
        dead_letter_storage_secret: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DigitalTwinsEndpointEventhubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param digital_twins_id: -
        :param eventhub_primary_connection_string: -
        :param eventhub_secondary_connection_string: -
        :param name: -
        :param dead_letter_storage_secret: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DigitalTwinsEndpointEventhubConfig(
            digital_twins_id=digital_twins_id,
            eventhub_primary_connection_string=eventhub_primary_connection_string,
            eventhub_secondary_connection_string=eventhub_secondary_connection_string,
            name=name,
            dead_letter_storage_secret=dead_letter_storage_secret,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DigitalTwinsEndpointEventhub, self, [scope, id, config])

    @jsii.member(jsii_name="resetDeadLetterStorageSecret")
    def reset_dead_letter_storage_secret(self) -> None:
        return jsii.invoke(self, "resetDeadLetterStorageSecret", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="digitalTwinsIdInput")
    def digital_twins_id_input(self) -> builtins.str:
        return jsii.get(self, "digitalTwinsIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubPrimaryConnectionStringInput")
    def eventhub_primary_connection_string_input(self) -> builtins.str:
        return jsii.get(self, "eventhubPrimaryConnectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubSecondaryConnectionStringInput")
    def eventhub_secondary_connection_string_input(self) -> builtins.str:
        return jsii.get(self, "eventhubSecondaryConnectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetterStorageSecretInput")
    def dead_letter_storage_secret_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "deadLetterStorageSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DigitalTwinsEndpointEventhubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetterStorageSecret")
    def dead_letter_storage_secret(self) -> builtins.str:
        return jsii.get(self, "deadLetterStorageSecret")

    @dead_letter_storage_secret.setter # type: ignore
    def dead_letter_storage_secret(self, value: builtins.str) -> None:
        jsii.set(self, "deadLetterStorageSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="digitalTwinsId")
    def digital_twins_id(self) -> builtins.str:
        return jsii.get(self, "digitalTwinsId")

    @digital_twins_id.setter # type: ignore
    def digital_twins_id(self, value: builtins.str) -> None:
        jsii.set(self, "digitalTwinsId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubPrimaryConnectionString")
    def eventhub_primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "eventhubPrimaryConnectionString")

    @eventhub_primary_connection_string.setter # type: ignore
    def eventhub_primary_connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubPrimaryConnectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubSecondaryConnectionString")
    def eventhub_secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "eventhubSecondaryConnectionString")

    @eventhub_secondary_connection_string.setter # type: ignore
    def eventhub_secondary_connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubSecondaryConnectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DigitalTwinsEndpointEventhubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DigitalTwinsEndpointEventhubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsEndpointEventhubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "digital_twins_id": "digitalTwinsId",
        "eventhub_primary_connection_string": "eventhubPrimaryConnectionString",
        "eventhub_secondary_connection_string": "eventhubSecondaryConnectionString",
        "name": "name",
        "dead_letter_storage_secret": "deadLetterStorageSecret",
        "timeouts": "timeouts",
    },
)
class DigitalTwinsEndpointEventhubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        digital_twins_id: builtins.str,
        eventhub_primary_connection_string: builtins.str,
        eventhub_secondary_connection_string: builtins.str,
        name: builtins.str,
        dead_letter_storage_secret: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DigitalTwinsEndpointEventhubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param digital_twins_id: -
        :param eventhub_primary_connection_string: -
        :param eventhub_secondary_connection_string: -
        :param name: -
        :param dead_letter_storage_secret: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DigitalTwinsEndpointEventhubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "digital_twins_id": digital_twins_id,
            "eventhub_primary_connection_string": eventhub_primary_connection_string,
            "eventhub_secondary_connection_string": eventhub_secondary_connection_string,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if dead_letter_storage_secret is not None:
            self._values["dead_letter_storage_secret"] = dead_letter_storage_secret
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def digital_twins_id(self) -> builtins.str:
        result = self._values.get("digital_twins_id")
        assert result is not None, "Required property 'digital_twins_id' is missing"
        return result

    @builtins.property
    def eventhub_primary_connection_string(self) -> builtins.str:
        result = self._values.get("eventhub_primary_connection_string")
        assert result is not None, "Required property 'eventhub_primary_connection_string' is missing"
        return result

    @builtins.property
    def eventhub_secondary_connection_string(self) -> builtins.str:
        result = self._values.get("eventhub_secondary_connection_string")
        assert result is not None, "Required property 'eventhub_secondary_connection_string' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def dead_letter_storage_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dead_letter_storage_secret")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DigitalTwinsEndpointEventhubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsEndpointEventhubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsEndpointEventhubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DigitalTwinsEndpointEventhubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsEndpointEventhubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DigitalTwinsEndpointServicebus(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DigitalTwinsEndpointServicebus",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        digital_twins_id: builtins.str,
        name: builtins.str,
        servicebus_primary_connection_string: builtins.str,
        servicebus_secondary_connection_string: builtins.str,
        dead_letter_storage_secret: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DigitalTwinsEndpointServicebusTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param digital_twins_id: -
        :param name: -
        :param servicebus_primary_connection_string: -
        :param servicebus_secondary_connection_string: -
        :param dead_letter_storage_secret: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DigitalTwinsEndpointServicebusConfig(
            digital_twins_id=digital_twins_id,
            name=name,
            servicebus_primary_connection_string=servicebus_primary_connection_string,
            servicebus_secondary_connection_string=servicebus_secondary_connection_string,
            dead_letter_storage_secret=dead_letter_storage_secret,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DigitalTwinsEndpointServicebus, self, [scope, id, config])

    @jsii.member(jsii_name="resetDeadLetterStorageSecret")
    def reset_dead_letter_storage_secret(self) -> None:
        return jsii.invoke(self, "resetDeadLetterStorageSecret", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="digitalTwinsIdInput")
    def digital_twins_id_input(self) -> builtins.str:
        return jsii.get(self, "digitalTwinsIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusPrimaryConnectionStringInput")
    def servicebus_primary_connection_string_input(self) -> builtins.str:
        return jsii.get(self, "servicebusPrimaryConnectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusSecondaryConnectionStringInput")
    def servicebus_secondary_connection_string_input(self) -> builtins.str:
        return jsii.get(self, "servicebusSecondaryConnectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetterStorageSecretInput")
    def dead_letter_storage_secret_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "deadLetterStorageSecretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["DigitalTwinsEndpointServicebusTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetterStorageSecret")
    def dead_letter_storage_secret(self) -> builtins.str:
        return jsii.get(self, "deadLetterStorageSecret")

    @dead_letter_storage_secret.setter # type: ignore
    def dead_letter_storage_secret(self, value: builtins.str) -> None:
        jsii.set(self, "deadLetterStorageSecret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="digitalTwinsId")
    def digital_twins_id(self) -> builtins.str:
        return jsii.get(self, "digitalTwinsId")

    @digital_twins_id.setter # type: ignore
    def digital_twins_id(self, value: builtins.str) -> None:
        jsii.set(self, "digitalTwinsId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusPrimaryConnectionString")
    def servicebus_primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "servicebusPrimaryConnectionString")

    @servicebus_primary_connection_string.setter # type: ignore
    def servicebus_primary_connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "servicebusPrimaryConnectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusSecondaryConnectionString")
    def servicebus_secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "servicebusSecondaryConnectionString")

    @servicebus_secondary_connection_string.setter # type: ignore
    def servicebus_secondary_connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "servicebusSecondaryConnectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DigitalTwinsEndpointServicebusTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DigitalTwinsEndpointServicebusTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsEndpointServicebusConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "digital_twins_id": "digitalTwinsId",
        "name": "name",
        "servicebus_primary_connection_string": "servicebusPrimaryConnectionString",
        "servicebus_secondary_connection_string": "servicebusSecondaryConnectionString",
        "dead_letter_storage_secret": "deadLetterStorageSecret",
        "timeouts": "timeouts",
    },
)
class DigitalTwinsEndpointServicebusConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        digital_twins_id: builtins.str,
        name: builtins.str,
        servicebus_primary_connection_string: builtins.str,
        servicebus_secondary_connection_string: builtins.str,
        dead_letter_storage_secret: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DigitalTwinsEndpointServicebusTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param digital_twins_id: -
        :param name: -
        :param servicebus_primary_connection_string: -
        :param servicebus_secondary_connection_string: -
        :param dead_letter_storage_secret: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DigitalTwinsEndpointServicebusTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "digital_twins_id": digital_twins_id,
            "name": name,
            "servicebus_primary_connection_string": servicebus_primary_connection_string,
            "servicebus_secondary_connection_string": servicebus_secondary_connection_string,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if dead_letter_storage_secret is not None:
            self._values["dead_letter_storage_secret"] = dead_letter_storage_secret
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def digital_twins_id(self) -> builtins.str:
        result = self._values.get("digital_twins_id")
        assert result is not None, "Required property 'digital_twins_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def servicebus_primary_connection_string(self) -> builtins.str:
        result = self._values.get("servicebus_primary_connection_string")
        assert result is not None, "Required property 'servicebus_primary_connection_string' is missing"
        return result

    @builtins.property
    def servicebus_secondary_connection_string(self) -> builtins.str:
        result = self._values.get("servicebus_secondary_connection_string")
        assert result is not None, "Required property 'servicebus_secondary_connection_string' is missing"
        return result

    @builtins.property
    def dead_letter_storage_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dead_letter_storage_secret")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DigitalTwinsEndpointServicebusTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsEndpointServicebusConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsEndpointServicebusTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DigitalTwinsEndpointServicebusTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsEndpointServicebusTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DigitalTwinsInstance(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DigitalTwinsInstance",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DigitalTwinsInstanceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DigitalTwinsInstanceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DigitalTwinsInstance, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostName")
    def host_name(self) -> builtins.str:
        return jsii.get(self, "hostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DigitalTwinsInstanceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DigitalTwinsInstanceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DigitalTwinsInstanceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsInstanceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DigitalTwinsInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DigitalTwinsInstanceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DigitalTwinsInstanceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DigitalTwinsInstanceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsInstanceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DigitalTwinsInstanceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DigitalTwinsInstanceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DigitalTwinsInstanceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DiskEncryptionSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DiskEncryptionSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        identity: typing.List["DiskEncryptionSetIdentity"],
        key_vault_key_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DiskEncryptionSetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param identity: identity block.
        :param key_vault_key_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DiskEncryptionSetConfig(
            identity=identity,
            key_vault_key_id=key_vault_key_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DiskEncryptionSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.List["DiskEncryptionSetIdentity"]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyIdInput")
    def key_vault_key_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DiskEncryptionSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["DiskEncryptionSetIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["DiskEncryptionSetIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @key_vault_key_id.setter # type: ignore
    def key_vault_key_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultKeyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DiskEncryptionSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DiskEncryptionSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DiskEncryptionSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "identity": "identity",
        "key_vault_key_id": "keyVaultKeyId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DiskEncryptionSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        identity: typing.List["DiskEncryptionSetIdentity"],
        key_vault_key_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DiskEncryptionSetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param identity: identity block.
        :param key_vault_key_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DiskEncryptionSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "identity": identity,
            "key_vault_key_id": key_vault_key_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def identity(self) -> typing.List["DiskEncryptionSetIdentity"]:
        """identity block."""
        result = self._values.get("identity")
        assert result is not None, "Required property 'identity' is missing"
        return result

    @builtins.property
    def key_vault_key_id(self) -> builtins.str:
        result = self._values.get("key_vault_key_id")
        assert result is not None, "Required property 'key_vault_key_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DiskEncryptionSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DiskEncryptionSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DiskEncryptionSetIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class DiskEncryptionSetIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DiskEncryptionSetIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DiskEncryptionSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DiskEncryptionSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DiskEncryptionSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsARecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsARecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        records: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DnsARecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param records: -
        :param tags: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsARecordConfig(
            name=name,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            records=records,
            tags=tags,
            target_resource_id=target_resource_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsARecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetRecords")
    def reset_records(self) -> None:
        return jsii.invoke(self, "resetRecords", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTargetResourceId")
    def reset_target_resource_id(self) -> None:
        return jsii.invoke(self, "resetTargetResourceId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordsInput")
    def records_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "recordsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsARecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="records")
    def records(self) -> typing.List[builtins.str]:
        return jsii.get(self, "records")

    @records.setter # type: ignore
    def records(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "records", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsARecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsARecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsARecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "records": "records",
        "tags": "tags",
        "target_resource_id": "targetResourceId",
        "timeouts": "timeouts",
    },
)
class DnsARecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        records: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DnsARecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param records: -
        :param tags: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsARecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if records is not None:
            self._values["records"] = records
        if tags is not None:
            self._values["tags"] = tags
        if target_resource_id is not None:
            self._values["target_resource_id"] = target_resource_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def records(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("records")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def target_resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_resource_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsARecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsARecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsARecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsARecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsARecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsAaaaRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsAaaaRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        records: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DnsAaaaRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param records: -
        :param tags: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsAaaaRecordConfig(
            name=name,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            records=records,
            tags=tags,
            target_resource_id=target_resource_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsAaaaRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetRecords")
    def reset_records(self) -> None:
        return jsii.invoke(self, "resetRecords", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTargetResourceId")
    def reset_target_resource_id(self) -> None:
        return jsii.invoke(self, "resetTargetResourceId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordsInput")
    def records_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "recordsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsAaaaRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="records")
    def records(self) -> typing.List[builtins.str]:
        return jsii.get(self, "records")

    @records.setter # type: ignore
    def records(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "records", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsAaaaRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsAaaaRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsAaaaRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "records": "records",
        "tags": "tags",
        "target_resource_id": "targetResourceId",
        "timeouts": "timeouts",
    },
)
class DnsAaaaRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        records: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DnsAaaaRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param records: -
        :param tags: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsAaaaRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if records is not None:
            self._values["records"] = records
        if tags is not None:
            self._values["tags"] = tags
        if target_resource_id is not None:
            self._values["target_resource_id"] = target_resource_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def records(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("records")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def target_resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_resource_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsAaaaRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsAaaaRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsAaaaRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsAaaaRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsAaaaRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsCaaRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsCaaRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        record: typing.List["DnsCaaRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsCaaRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsCaaRecordConfig(
            name=name,
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsCaaRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.List["DnsCaaRecordRecord"]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsCaaRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> typing.List["DnsCaaRecordRecord"]:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: typing.List["DnsCaaRecordRecord"]) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsCaaRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsCaaRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsCaaRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DnsCaaRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        record: typing.List["DnsCaaRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsCaaRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsCaaRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def record(self) -> typing.List["DnsCaaRecordRecord"]:
        """record block."""
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsCaaRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsCaaRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsCaaRecordRecord",
    jsii_struct_bases=[],
    name_mapping={"flags": "flags", "tag": "tag", "value": "value"},
)
class DnsCaaRecordRecord:
    def __init__(
        self,
        *,
        flags: jsii.Number,
        tag: builtins.str,
        value: builtins.str,
    ) -> None:
        """
        :param flags: -
        :param tag: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "flags": flags,
            "tag": tag,
            "value": value,
        }

    @builtins.property
    def flags(self) -> jsii.Number:
        result = self._values.get("flags")
        assert result is not None, "Required property 'flags' is missing"
        return result

    @builtins.property
    def tag(self) -> builtins.str:
        result = self._values.get("tag")
        assert result is not None, "Required property 'tag' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsCaaRecordRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsCaaRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsCaaRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsCaaRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsCnameRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsCnameRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        record: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DnsCnameRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param record: -
        :param tags: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsCnameRecordConfig(
            name=name,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            record=record,
            tags=tags,
            target_resource_id=target_resource_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsCnameRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetRecord")
    def reset_record(self) -> None:
        return jsii.invoke(self, "resetRecord", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTargetResourceId")
    def reset_target_resource_id(self) -> None:
        return jsii.invoke(self, "resetTargetResourceId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsCnameRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> builtins.str:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: builtins.str) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsCnameRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsCnameRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsCnameRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "record": "record",
        "tags": "tags",
        "target_resource_id": "targetResourceId",
        "timeouts": "timeouts",
    },
)
class DnsCnameRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        record: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["DnsCnameRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param record: -
        :param tags: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsCnameRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if record is not None:
            self._values["record"] = record
        if tags is not None:
            self._values["tags"] = tags
        if target_resource_id is not None:
            self._values["target_resource_id"] = target_resource_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def record(self) -> typing.Optional[builtins.str]:
        result = self._values.get("record")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def target_resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_resource_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsCnameRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsCnameRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsCnameRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsCnameRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsCnameRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsMxRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsMxRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        record: typing.List["DnsMxRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsMxRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsMxRecordConfig(
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            name=name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsMxRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.List["DnsMxRecordRecord"]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsMxRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> typing.List["DnsMxRecordRecord"]:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: typing.List["DnsMxRecordRecord"]) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsMxRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsMxRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsMxRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "name": "name",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DnsMxRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        record: typing.List["DnsMxRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsMxRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsMxRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if name is not None:
            self._values["name"] = name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def record(self) -> typing.List["DnsMxRecordRecord"]:
        """record block."""
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsMxRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsMxRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsMxRecordRecord",
    jsii_struct_bases=[],
    name_mapping={"exchange": "exchange", "preference": "preference"},
)
class DnsMxRecordRecord:
    def __init__(self, *, exchange: builtins.str, preference: builtins.str) -> None:
        """
        :param exchange: -
        :param preference: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "exchange": exchange,
            "preference": preference,
        }

    @builtins.property
    def exchange(self) -> builtins.str:
        result = self._values.get("exchange")
        assert result is not None, "Required property 'exchange' is missing"
        return result

    @builtins.property
    def preference(self) -> builtins.str:
        result = self._values.get("preference")
        assert result is not None, "Required property 'preference' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsMxRecordRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsMxRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsMxRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsMxRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsNsRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsNsRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsNsRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsNsRecordConfig(
            name=name,
            records=records,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsNsRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordsInput")
    def records_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "recordsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsNsRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="records")
    def records(self) -> typing.List[builtins.str]:
        return jsii.get(self, "records")

    @records.setter # type: ignore
    def records(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "records", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsNsRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsNsRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsNsRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "records": "records",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DnsNsRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsNsRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsNsRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "records": records,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def records(self) -> typing.List[builtins.str]:
        result = self._values.get("records")
        assert result is not None, "Required property 'records' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsNsRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsNsRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsNsRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsNsRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsNsRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsPtrRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsPtrRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsPtrRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsPtrRecordConfig(
            name=name,
            records=records,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsPtrRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordsInput")
    def records_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "recordsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsPtrRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="records")
    def records(self) -> typing.List[builtins.str]:
        return jsii.get(self, "records")

    @records.setter # type: ignore
    def records(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "records", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsPtrRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsPtrRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsPtrRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "records": "records",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DnsPtrRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsPtrRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsPtrRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "records": records,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def records(self) -> typing.List[builtins.str]:
        result = self._values.get("records")
        assert result is not None, "Required property 'records' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsPtrRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsPtrRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsPtrRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsPtrRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsPtrRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsSrvRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsSrvRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        record: typing.List["DnsSrvRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsSrvRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsSrvRecordConfig(
            name=name,
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsSrvRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.List["DnsSrvRecordRecord"]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsSrvRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> typing.List["DnsSrvRecordRecord"]:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: typing.List["DnsSrvRecordRecord"]) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsSrvRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsSrvRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsSrvRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DnsSrvRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        record: typing.List["DnsSrvRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsSrvRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsSrvRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def record(self) -> typing.List["DnsSrvRecordRecord"]:
        """record block."""
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsSrvRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsSrvRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsSrvRecordRecord",
    jsii_struct_bases=[],
    name_mapping={
        "port": "port",
        "priority": "priority",
        "target": "target",
        "weight": "weight",
    },
)
class DnsSrvRecordRecord:
    def __init__(
        self,
        *,
        port: jsii.Number,
        priority: jsii.Number,
        target: builtins.str,
        weight: jsii.Number,
    ) -> None:
        """
        :param port: -
        :param priority: -
        :param target: -
        :param weight: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "port": port,
            "priority": priority,
            "target": target,
            "weight": weight,
        }

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def target(self) -> builtins.str:
        result = self._values.get("target")
        assert result is not None, "Required property 'target' is missing"
        return result

    @builtins.property
    def weight(self) -> jsii.Number:
        result = self._values.get("weight")
        assert result is not None, "Required property 'weight' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsSrvRecordRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsSrvRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsSrvRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsSrvRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsTxtRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsTxtRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        record: typing.List["DnsTxtRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsTxtRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsTxtRecordConfig(
            name=name,
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsTxtRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.List["DnsTxtRecordRecord"]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsTxtRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> typing.List["DnsTxtRecordRecord"]:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: typing.List["DnsTxtRecordRecord"]) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsTxtRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsTxtRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.DnsTxtRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DnsTxtRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        record: typing.List["DnsTxtRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsTxtRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsTxtRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def record(self) -> typing.List["DnsTxtRecordRecord"]:
        """record block."""
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsTxtRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsTxtRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsTxtRecordRecord",
    jsii_struct_bases=[],
    name_mapping={"value": "value"},
)
class DnsTxtRecordRecord:
    def __init__(self, *, value: builtins.str) -> None:
        """
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "value": value,
        }

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsTxtRecordRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsTxtRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsTxtRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsTxtRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class DnsZone(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.DnsZone",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        soa_record: typing.Optional[typing.List["DnsZoneSoaRecord"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsZoneTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param soa_record: soa_record block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsZoneConfig(
            name=name,
            resource_group_name=resource_group_name,
            soa_record=soa_record,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(DnsZone, self, [scope, id, config])

    @jsii.member(jsii_name="resetSoaRecord")
    def reset_soa_record(self) -> None:
        return jsii.invoke(self, "resetSoaRecord", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfRecordSets")
    def max_number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameServers")
    def name_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "nameServers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfRecordSets")
    def number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "numberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="soaRecordInput")
    def soa_record_input(self) -> typing.Optional[typing.List["DnsZoneSoaRecord"]]:
        return jsii.get(self, "soaRecordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["DnsZoneTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="soaRecord")
    def soa_record(self) -> typing.List["DnsZoneSoaRecord"]:
        return jsii.get(self, "soaRecord")

    @soa_record.setter # type: ignore
    def soa_record(self, value: typing.List["DnsZoneSoaRecord"]) -> None:
        jsii.set(self, "soaRecord", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "DnsZoneTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "DnsZoneTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.DnsZoneConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "soa_record": "soaRecord",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class DnsZoneConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        soa_record: typing.Optional[typing.List["DnsZoneSoaRecord"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["DnsZoneTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param soa_record: soa_record block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = DnsZoneTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if soa_record is not None:
            self._values["soa_record"] = soa_record
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def soa_record(self) -> typing.Optional[typing.List["DnsZoneSoaRecord"]]:
        """soa_record block."""
        result = self._values.get("soa_record")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsZoneTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsZoneConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsZoneSoaRecord",
    jsii_struct_bases=[],
    name_mapping={
        "email": "email",
        "host_name": "hostName",
        "expire_time": "expireTime",
        "minimum_ttl": "minimumTtl",
        "refresh_time": "refreshTime",
        "retry_time": "retryTime",
        "serial_number": "serialNumber",
        "tags": "tags",
        "ttl": "ttl",
    },
)
class DnsZoneSoaRecord:
    def __init__(
        self,
        *,
        email: builtins.str,
        host_name: builtins.str,
        expire_time: typing.Optional[jsii.Number] = None,
        minimum_ttl: typing.Optional[jsii.Number] = None,
        refresh_time: typing.Optional[jsii.Number] = None,
        retry_time: typing.Optional[jsii.Number] = None,
        serial_number: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        ttl: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param email: -
        :param host_name: -
        :param expire_time: -
        :param minimum_ttl: -
        :param refresh_time: -
        :param retry_time: -
        :param serial_number: -
        :param tags: -
        :param ttl: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "email": email,
            "host_name": host_name,
        }
        if expire_time is not None:
            self._values["expire_time"] = expire_time
        if minimum_ttl is not None:
            self._values["minimum_ttl"] = minimum_ttl
        if refresh_time is not None:
            self._values["refresh_time"] = refresh_time
        if retry_time is not None:
            self._values["retry_time"] = retry_time
        if serial_number is not None:
            self._values["serial_number"] = serial_number
        if tags is not None:
            self._values["tags"] = tags
        if ttl is not None:
            self._values["ttl"] = ttl

    @builtins.property
    def email(self) -> builtins.str:
        result = self._values.get("email")
        assert result is not None, "Required property 'email' is missing"
        return result

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def expire_time(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("expire_time")
        return result

    @builtins.property
    def minimum_ttl(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("minimum_ttl")
        return result

    @builtins.property
    def refresh_time(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("refresh_time")
        return result

    @builtins.property
    def retry_time(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retry_time")
        return result

    @builtins.property
    def serial_number(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("serial_number")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def ttl(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("ttl")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsZoneSoaRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.DnsZoneTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class DnsZoneTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "DnsZoneTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventgridDomain(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventgridDomain",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        input_mapping_default_values: typing.Optional[typing.List["EventgridDomainInputMappingDefaultValues"]] = None,
        input_mapping_fields: typing.Optional[typing.List["EventgridDomainInputMappingFields"]] = None,
        input_schema: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventgridDomainTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param input_mapping_default_values: input_mapping_default_values block.
        :param input_mapping_fields: input_mapping_fields block.
        :param input_schema: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventgridDomainConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            input_mapping_default_values=input_mapping_default_values,
            input_mapping_fields=input_mapping_fields,
            input_schema=input_schema,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventgridDomain, self, [scope, id, config])

    @jsii.member(jsii_name="resetInputMappingDefaultValues")
    def reset_input_mapping_default_values(self) -> None:
        return jsii.invoke(self, "resetInputMappingDefaultValues", [])

    @jsii.member(jsii_name="resetInputMappingFields")
    def reset_input_mapping_fields(self) -> None:
        return jsii.invoke(self, "resetInputMappingFields", [])

    @jsii.member(jsii_name="resetInputSchema")
    def reset_input_schema(self) -> None:
        return jsii.invoke(self, "resetInputSchema", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingDefaultValuesInput")
    def input_mapping_default_values_input(
        self,
    ) -> typing.Optional[typing.List["EventgridDomainInputMappingDefaultValues"]]:
        return jsii.get(self, "inputMappingDefaultValuesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingFieldsInput")
    def input_mapping_fields_input(
        self,
    ) -> typing.Optional[typing.List["EventgridDomainInputMappingFields"]]:
        return jsii.get(self, "inputMappingFieldsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputSchemaInput")
    def input_schema_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "inputSchemaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventgridDomainTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingDefaultValues")
    def input_mapping_default_values(
        self,
    ) -> typing.List["EventgridDomainInputMappingDefaultValues"]:
        return jsii.get(self, "inputMappingDefaultValues")

    @input_mapping_default_values.setter # type: ignore
    def input_mapping_default_values(
        self,
        value: typing.List["EventgridDomainInputMappingDefaultValues"],
    ) -> None:
        jsii.set(self, "inputMappingDefaultValues", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingFields")
    def input_mapping_fields(self) -> typing.List["EventgridDomainInputMappingFields"]:
        return jsii.get(self, "inputMappingFields")

    @input_mapping_fields.setter # type: ignore
    def input_mapping_fields(
        self,
        value: typing.List["EventgridDomainInputMappingFields"],
    ) -> None:
        jsii.set(self, "inputMappingFields", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputSchema")
    def input_schema(self) -> builtins.str:
        return jsii.get(self, "inputSchema")

    @input_schema.setter # type: ignore
    def input_schema(self, value: builtins.str) -> None:
        jsii.set(self, "inputSchema", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventgridDomainTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventgridDomainTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.EventgridDomainConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "input_mapping_default_values": "inputMappingDefaultValues",
        "input_mapping_fields": "inputMappingFields",
        "input_schema": "inputSchema",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class EventgridDomainConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        input_mapping_default_values: typing.Optional[typing.List["EventgridDomainInputMappingDefaultValues"]] = None,
        input_mapping_fields: typing.Optional[typing.List["EventgridDomainInputMappingFields"]] = None,
        input_schema: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventgridDomainTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param input_mapping_default_values: input_mapping_default_values block.
        :param input_mapping_fields: input_mapping_fields block.
        :param input_schema: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventgridDomainTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if input_mapping_default_values is not None:
            self._values["input_mapping_default_values"] = input_mapping_default_values
        if input_mapping_fields is not None:
            self._values["input_mapping_fields"] = input_mapping_fields
        if input_schema is not None:
            self._values["input_schema"] = input_schema
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def input_mapping_default_values(
        self,
    ) -> typing.Optional[typing.List["EventgridDomainInputMappingDefaultValues"]]:
        """input_mapping_default_values block."""
        result = self._values.get("input_mapping_default_values")
        return result

    @builtins.property
    def input_mapping_fields(
        self,
    ) -> typing.Optional[typing.List["EventgridDomainInputMappingFields"]]:
        """input_mapping_fields block."""
        result = self._values.get("input_mapping_fields")
        return result

    @builtins.property
    def input_schema(self) -> typing.Optional[builtins.str]:
        result = self._values.get("input_schema")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventgridDomainTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridDomainConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridDomainInputMappingDefaultValues",
    jsii_struct_bases=[],
    name_mapping={
        "data_version": "dataVersion",
        "event_type": "eventType",
        "subject": "subject",
    },
)
class EventgridDomainInputMappingDefaultValues:
    def __init__(
        self,
        *,
        data_version: typing.Optional[builtins.str] = None,
        event_type: typing.Optional[builtins.str] = None,
        subject: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param data_version: -
        :param event_type: -
        :param subject: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if data_version is not None:
            self._values["data_version"] = data_version
        if event_type is not None:
            self._values["event_type"] = event_type
        if subject is not None:
            self._values["subject"] = subject

    @builtins.property
    def data_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data_version")
        return result

    @builtins.property
    def event_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("event_type")
        return result

    @builtins.property
    def subject(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subject")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridDomainInputMappingDefaultValues(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridDomainInputMappingFields",
    jsii_struct_bases=[],
    name_mapping={
        "data_version": "dataVersion",
        "event_time": "eventTime",
        "event_type": "eventType",
        "id": "id",
        "subject": "subject",
        "topic": "topic",
    },
)
class EventgridDomainInputMappingFields:
    def __init__(
        self,
        *,
        data_version: typing.Optional[builtins.str] = None,
        event_time: typing.Optional[builtins.str] = None,
        event_type: typing.Optional[builtins.str] = None,
        id: typing.Optional[builtins.str] = None,
        subject: typing.Optional[builtins.str] = None,
        topic: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param data_version: -
        :param event_time: -
        :param event_type: -
        :param id: -
        :param subject: -
        :param topic: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if data_version is not None:
            self._values["data_version"] = data_version
        if event_time is not None:
            self._values["event_time"] = event_time
        if event_type is not None:
            self._values["event_type"] = event_type
        if id is not None:
            self._values["id"] = id
        if subject is not None:
            self._values["subject"] = subject
        if topic is not None:
            self._values["topic"] = topic

    @builtins.property
    def data_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data_version")
        return result

    @builtins.property
    def event_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("event_time")
        return result

    @builtins.property
    def event_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("event_type")
        return result

    @builtins.property
    def id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("id")
        return result

    @builtins.property
    def subject(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subject")
        return result

    @builtins.property
    def topic(self) -> typing.Optional[builtins.str]:
        result = self._values.get("topic")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridDomainInputMappingFields(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridDomainTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventgridDomainTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridDomainTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventgridDomainTopic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventgridDomainTopic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        domain_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["EventgridDomainTopicTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param domain_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventgridDomainTopicConfig(
            domain_name=domain_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventgridDomainTopic, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainNameInput")
    def domain_name_input(self) -> builtins.str:
        return jsii.get(self, "domainNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventgridDomainTopicTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainName")
    def domain_name(self) -> builtins.str:
        return jsii.get(self, "domainName")

    @domain_name.setter # type: ignore
    def domain_name(self, value: builtins.str) -> None:
        jsii.set(self, "domainName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventgridDomainTopicTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventgridDomainTopicTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.EventgridDomainTopicConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "domain_name": "domainName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class EventgridDomainTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        domain_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["EventgridDomainTopicTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param domain_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventgridDomainTopicTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "domain_name": domain_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def domain_name(self) -> builtins.str:
        result = self._values.get("domain_name")
        assert result is not None, "Required property 'domain_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventgridDomainTopicTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridDomainTopicConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridDomainTopicTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class EventgridDomainTopicTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridDomainTopicTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventgridEventSubscription(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventgridEventSubscription",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        scope: builtins.str,
        advanced_filter: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilter"]] = None,
        azure_function_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionAzureFunctionEndpoint"]] = None,
        event_delivery_schema: typing.Optional[builtins.str] = None,
        eventhub_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionEventhubEndpoint"]] = None,
        eventhub_endpoint_id: typing.Optional[builtins.str] = None,
        expiration_time_utc: typing.Optional[builtins.str] = None,
        hybrid_connection_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionHybridConnectionEndpoint"]] = None,
        hybrid_connection_endpoint_id: typing.Optional[builtins.str] = None,
        included_event_types: typing.Optional[typing.List[builtins.str]] = None,
        labels: typing.Optional[typing.List[builtins.str]] = None,
        retry_policy: typing.Optional[typing.List["EventgridEventSubscriptionRetryPolicy"]] = None,
        service_bus_queue_endpoint_id: typing.Optional[builtins.str] = None,
        service_bus_topic_endpoint_id: typing.Optional[builtins.str] = None,
        storage_blob_dead_letter_destination: typing.Optional[typing.List["EventgridEventSubscriptionStorageBlobDeadLetterDestination"]] = None,
        storage_queue_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionStorageQueueEndpoint"]] = None,
        subject_filter: typing.Optional[typing.List["EventgridEventSubscriptionSubjectFilter"]] = None,
        timeouts: typing.Optional["EventgridEventSubscriptionTimeouts"] = None,
        topic_name: typing.Optional[builtins.str] = None,
        webhook_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionWebhookEndpoint"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param name: -
        :param scope: -
        :param advanced_filter: advanced_filter block.
        :param azure_function_endpoint: azure_function_endpoint block.
        :param event_delivery_schema: -
        :param eventhub_endpoint: eventhub_endpoint block.
        :param eventhub_endpoint_id: -
        :param expiration_time_utc: -
        :param hybrid_connection_endpoint: hybrid_connection_endpoint block.
        :param hybrid_connection_endpoint_id: -
        :param included_event_types: -
        :param labels: -
        :param retry_policy: retry_policy block.
        :param service_bus_queue_endpoint_id: -
        :param service_bus_topic_endpoint_id: -
        :param storage_blob_dead_letter_destination: storage_blob_dead_letter_destination block.
        :param storage_queue_endpoint: storage_queue_endpoint block.
        :param subject_filter: subject_filter block.
        :param timeouts: timeouts block.
        :param topic_name: -
        :param webhook_endpoint: webhook_endpoint block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventgridEventSubscriptionConfig(
            name=name,
            scope=scope,
            advanced_filter=advanced_filter,
            azure_function_endpoint=azure_function_endpoint,
            event_delivery_schema=event_delivery_schema,
            eventhub_endpoint=eventhub_endpoint,
            eventhub_endpoint_id=eventhub_endpoint_id,
            expiration_time_utc=expiration_time_utc,
            hybrid_connection_endpoint=hybrid_connection_endpoint,
            hybrid_connection_endpoint_id=hybrid_connection_endpoint_id,
            included_event_types=included_event_types,
            labels=labels,
            retry_policy=retry_policy,
            service_bus_queue_endpoint_id=service_bus_queue_endpoint_id,
            service_bus_topic_endpoint_id=service_bus_topic_endpoint_id,
            storage_blob_dead_letter_destination=storage_blob_dead_letter_destination,
            storage_queue_endpoint=storage_queue_endpoint,
            subject_filter=subject_filter,
            timeouts=timeouts,
            topic_name=topic_name,
            webhook_endpoint=webhook_endpoint,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventgridEventSubscription, self, [scope_, id, config])

    @jsii.member(jsii_name="resetAdvancedFilter")
    def reset_advanced_filter(self) -> None:
        return jsii.invoke(self, "resetAdvancedFilter", [])

    @jsii.member(jsii_name="resetAzureFunctionEndpoint")
    def reset_azure_function_endpoint(self) -> None:
        return jsii.invoke(self, "resetAzureFunctionEndpoint", [])

    @jsii.member(jsii_name="resetEventDeliverySchema")
    def reset_event_delivery_schema(self) -> None:
        return jsii.invoke(self, "resetEventDeliverySchema", [])

    @jsii.member(jsii_name="resetEventhubEndpoint")
    def reset_eventhub_endpoint(self) -> None:
        return jsii.invoke(self, "resetEventhubEndpoint", [])

    @jsii.member(jsii_name="resetEventhubEndpointId")
    def reset_eventhub_endpoint_id(self) -> None:
        return jsii.invoke(self, "resetEventhubEndpointId", [])

    @jsii.member(jsii_name="resetExpirationTimeUtc")
    def reset_expiration_time_utc(self) -> None:
        return jsii.invoke(self, "resetExpirationTimeUtc", [])

    @jsii.member(jsii_name="resetHybridConnectionEndpoint")
    def reset_hybrid_connection_endpoint(self) -> None:
        return jsii.invoke(self, "resetHybridConnectionEndpoint", [])

    @jsii.member(jsii_name="resetHybridConnectionEndpointId")
    def reset_hybrid_connection_endpoint_id(self) -> None:
        return jsii.invoke(self, "resetHybridConnectionEndpointId", [])

    @jsii.member(jsii_name="resetIncludedEventTypes")
    def reset_included_event_types(self) -> None:
        return jsii.invoke(self, "resetIncludedEventTypes", [])

    @jsii.member(jsii_name="resetLabels")
    def reset_labels(self) -> None:
        return jsii.invoke(self, "resetLabels", [])

    @jsii.member(jsii_name="resetRetryPolicy")
    def reset_retry_policy(self) -> None:
        return jsii.invoke(self, "resetRetryPolicy", [])

    @jsii.member(jsii_name="resetServiceBusQueueEndpointId")
    def reset_service_bus_queue_endpoint_id(self) -> None:
        return jsii.invoke(self, "resetServiceBusQueueEndpointId", [])

    @jsii.member(jsii_name="resetServiceBusTopicEndpointId")
    def reset_service_bus_topic_endpoint_id(self) -> None:
        return jsii.invoke(self, "resetServiceBusTopicEndpointId", [])

    @jsii.member(jsii_name="resetStorageBlobDeadLetterDestination")
    def reset_storage_blob_dead_letter_destination(self) -> None:
        return jsii.invoke(self, "resetStorageBlobDeadLetterDestination", [])

    @jsii.member(jsii_name="resetStorageQueueEndpoint")
    def reset_storage_queue_endpoint(self) -> None:
        return jsii.invoke(self, "resetStorageQueueEndpoint", [])

    @jsii.member(jsii_name="resetSubjectFilter")
    def reset_subject_filter(self) -> None:
        return jsii.invoke(self, "resetSubjectFilter", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTopicName")
    def reset_topic_name(self) -> None:
        return jsii.invoke(self, "resetTopicName", [])

    @jsii.member(jsii_name="resetWebhookEndpoint")
    def reset_webhook_endpoint(self) -> None:
        return jsii.invoke(self, "resetWebhookEndpoint", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="advancedFilterInput")
    def advanced_filter_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilter"]]:
        return jsii.get(self, "advancedFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFunctionEndpointInput")
    def azure_function_endpoint_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAzureFunctionEndpoint"]]:
        return jsii.get(self, "azureFunctionEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventDeliverySchemaInput")
    def event_delivery_schema_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "eventDeliverySchemaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubEndpointIdInput")
    def eventhub_endpoint_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "eventhubEndpointIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubEndpointInput")
    def eventhub_endpoint_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionEventhubEndpoint"]]:
        return jsii.get(self, "eventhubEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationTimeUtcInput")
    def expiration_time_utc_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "expirationTimeUtcInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hybridConnectionEndpointIdInput")
    def hybrid_connection_endpoint_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "hybridConnectionEndpointIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hybridConnectionEndpointInput")
    def hybrid_connection_endpoint_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionHybridConnectionEndpoint"]]:
        return jsii.get(self, "hybridConnectionEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="includedEventTypesInput")
    def included_event_types_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "includedEventTypesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labelsInput")
    def labels_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "labelsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retryPolicyInput")
    def retry_policy_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionRetryPolicy"]]:
        return jsii.get(self, "retryPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceBusQueueEndpointIdInput")
    def service_bus_queue_endpoint_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "serviceBusQueueEndpointIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceBusTopicEndpointIdInput")
    def service_bus_topic_endpoint_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "serviceBusTopicEndpointIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageBlobDeadLetterDestinationInput")
    def storage_blob_dead_letter_destination_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionStorageBlobDeadLetterDestination"]]:
        return jsii.get(self, "storageBlobDeadLetterDestinationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageQueueEndpointInput")
    def storage_queue_endpoint_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionStorageQueueEndpoint"]]:
        return jsii.get(self, "storageQueueEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subjectFilterInput")
    def subject_filter_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionSubjectFilter"]]:
        return jsii.get(self, "subjectFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventgridEventSubscriptionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicNameInput")
    def topic_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "topicNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="webhookEndpointInput")
    def webhook_endpoint_input(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionWebhookEndpoint"]]:
        return jsii.get(self, "webhookEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="advancedFilter")
    def advanced_filter(
        self,
    ) -> typing.List["EventgridEventSubscriptionAdvancedFilter"]:
        return jsii.get(self, "advancedFilter")

    @advanced_filter.setter # type: ignore
    def advanced_filter(
        self,
        value: typing.List["EventgridEventSubscriptionAdvancedFilter"],
    ) -> None:
        jsii.set(self, "advancedFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFunctionEndpoint")
    def azure_function_endpoint(
        self,
    ) -> typing.List["EventgridEventSubscriptionAzureFunctionEndpoint"]:
        return jsii.get(self, "azureFunctionEndpoint")

    @azure_function_endpoint.setter # type: ignore
    def azure_function_endpoint(
        self,
        value: typing.List["EventgridEventSubscriptionAzureFunctionEndpoint"],
    ) -> None:
        jsii.set(self, "azureFunctionEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventDeliverySchema")
    def event_delivery_schema(self) -> builtins.str:
        return jsii.get(self, "eventDeliverySchema")

    @event_delivery_schema.setter # type: ignore
    def event_delivery_schema(self, value: builtins.str) -> None:
        jsii.set(self, "eventDeliverySchema", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubEndpoint")
    def eventhub_endpoint(
        self,
    ) -> typing.List["EventgridEventSubscriptionEventhubEndpoint"]:
        return jsii.get(self, "eventhubEndpoint")

    @eventhub_endpoint.setter # type: ignore
    def eventhub_endpoint(
        self,
        value: typing.List["EventgridEventSubscriptionEventhubEndpoint"],
    ) -> None:
        jsii.set(self, "eventhubEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubEndpointId")
    def eventhub_endpoint_id(self) -> builtins.str:
        return jsii.get(self, "eventhubEndpointId")

    @eventhub_endpoint_id.setter # type: ignore
    def eventhub_endpoint_id(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubEndpointId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationTimeUtc")
    def expiration_time_utc(self) -> builtins.str:
        return jsii.get(self, "expirationTimeUtc")

    @expiration_time_utc.setter # type: ignore
    def expiration_time_utc(self, value: builtins.str) -> None:
        jsii.set(self, "expirationTimeUtc", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hybridConnectionEndpoint")
    def hybrid_connection_endpoint(
        self,
    ) -> typing.List["EventgridEventSubscriptionHybridConnectionEndpoint"]:
        return jsii.get(self, "hybridConnectionEndpoint")

    @hybrid_connection_endpoint.setter # type: ignore
    def hybrid_connection_endpoint(
        self,
        value: typing.List["EventgridEventSubscriptionHybridConnectionEndpoint"],
    ) -> None:
        jsii.set(self, "hybridConnectionEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hybridConnectionEndpointId")
    def hybrid_connection_endpoint_id(self) -> builtins.str:
        return jsii.get(self, "hybridConnectionEndpointId")

    @hybrid_connection_endpoint_id.setter # type: ignore
    def hybrid_connection_endpoint_id(self, value: builtins.str) -> None:
        jsii.set(self, "hybridConnectionEndpointId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="includedEventTypes")
    def included_event_types(self) -> typing.List[builtins.str]:
        return jsii.get(self, "includedEventTypes")

    @included_event_types.setter # type: ignore
    def included_event_types(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "includedEventTypes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.List[builtins.str]:
        return jsii.get(self, "labels")

    @labels.setter # type: ignore
    def labels(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retryPolicy")
    def retry_policy(self) -> typing.List["EventgridEventSubscriptionRetryPolicy"]:
        return jsii.get(self, "retryPolicy")

    @retry_policy.setter # type: ignore
    def retry_policy(
        self,
        value: typing.List["EventgridEventSubscriptionRetryPolicy"],
    ) -> None:
        jsii.set(self, "retryPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceBusQueueEndpointId")
    def service_bus_queue_endpoint_id(self) -> builtins.str:
        return jsii.get(self, "serviceBusQueueEndpointId")

    @service_bus_queue_endpoint_id.setter # type: ignore
    def service_bus_queue_endpoint_id(self, value: builtins.str) -> None:
        jsii.set(self, "serviceBusQueueEndpointId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceBusTopicEndpointId")
    def service_bus_topic_endpoint_id(self) -> builtins.str:
        return jsii.get(self, "serviceBusTopicEndpointId")

    @service_bus_topic_endpoint_id.setter # type: ignore
    def service_bus_topic_endpoint_id(self, value: builtins.str) -> None:
        jsii.set(self, "serviceBusTopicEndpointId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageBlobDeadLetterDestination")
    def storage_blob_dead_letter_destination(
        self,
    ) -> typing.List["EventgridEventSubscriptionStorageBlobDeadLetterDestination"]:
        return jsii.get(self, "storageBlobDeadLetterDestination")

    @storage_blob_dead_letter_destination.setter # type: ignore
    def storage_blob_dead_letter_destination(
        self,
        value: typing.List["EventgridEventSubscriptionStorageBlobDeadLetterDestination"],
    ) -> None:
        jsii.set(self, "storageBlobDeadLetterDestination", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageQueueEndpoint")
    def storage_queue_endpoint(
        self,
    ) -> typing.List["EventgridEventSubscriptionStorageQueueEndpoint"]:
        return jsii.get(self, "storageQueueEndpoint")

    @storage_queue_endpoint.setter # type: ignore
    def storage_queue_endpoint(
        self,
        value: typing.List["EventgridEventSubscriptionStorageQueueEndpoint"],
    ) -> None:
        jsii.set(self, "storageQueueEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subjectFilter")
    def subject_filter(self) -> typing.List["EventgridEventSubscriptionSubjectFilter"]:
        return jsii.get(self, "subjectFilter")

    @subject_filter.setter # type: ignore
    def subject_filter(
        self,
        value: typing.List["EventgridEventSubscriptionSubjectFilter"],
    ) -> None:
        jsii.set(self, "subjectFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventgridEventSubscriptionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventgridEventSubscriptionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicName")
    def topic_name(self) -> builtins.str:
        return jsii.get(self, "topicName")

    @topic_name.setter # type: ignore
    def topic_name(self, value: builtins.str) -> None:
        jsii.set(self, "topicName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="webhookEndpoint")
    def webhook_endpoint(
        self,
    ) -> typing.List["EventgridEventSubscriptionWebhookEndpoint"]:
        return jsii.get(self, "webhookEndpoint")

    @webhook_endpoint.setter # type: ignore
    def webhook_endpoint(
        self,
        value: typing.List["EventgridEventSubscriptionWebhookEndpoint"],
    ) -> None:
        jsii.set(self, "webhookEndpoint", value)


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilter",
    jsii_struct_bases=[],
    name_mapping={
        "bool_equals": "boolEquals",
        "number_greater_than": "numberGreaterThan",
        "number_greater_than_or_equals": "numberGreaterThanOrEquals",
        "number_in": "numberIn",
        "number_less_than": "numberLessThan",
        "number_less_than_or_equals": "numberLessThanOrEquals",
        "number_not_in": "numberNotIn",
        "string_begins_with": "stringBeginsWith",
        "string_contains": "stringContains",
        "string_ends_with": "stringEndsWith",
        "string_in": "stringIn",
        "string_not_in": "stringNotIn",
    },
)
class EventgridEventSubscriptionAdvancedFilter:
    def __init__(
        self,
        *,
        bool_equals: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterBoolEquals"]] = None,
        number_greater_than: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberGreaterThan"]] = None,
        number_greater_than_or_equals: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberGreaterThanOrEquals"]] = None,
        number_in: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberIn"]] = None,
        number_less_than: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberLessThan"]] = None,
        number_less_than_or_equals: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberLessThanOrEquals"]] = None,
        number_not_in: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberNotIn"]] = None,
        string_begins_with: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringBeginsWith"]] = None,
        string_contains: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringContains"]] = None,
        string_ends_with: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringEndsWith"]] = None,
        string_in: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringIn"]] = None,
        string_not_in: typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringNotIn"]] = None,
    ) -> None:
        """
        :param bool_equals: bool_equals block.
        :param number_greater_than: number_greater_than block.
        :param number_greater_than_or_equals: number_greater_than_or_equals block.
        :param number_in: number_in block.
        :param number_less_than: number_less_than block.
        :param number_less_than_or_equals: number_less_than_or_equals block.
        :param number_not_in: number_not_in block.
        :param string_begins_with: string_begins_with block.
        :param string_contains: string_contains block.
        :param string_ends_with: string_ends_with block.
        :param string_in: string_in block.
        :param string_not_in: string_not_in block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if bool_equals is not None:
            self._values["bool_equals"] = bool_equals
        if number_greater_than is not None:
            self._values["number_greater_than"] = number_greater_than
        if number_greater_than_or_equals is not None:
            self._values["number_greater_than_or_equals"] = number_greater_than_or_equals
        if number_in is not None:
            self._values["number_in"] = number_in
        if number_less_than is not None:
            self._values["number_less_than"] = number_less_than
        if number_less_than_or_equals is not None:
            self._values["number_less_than_or_equals"] = number_less_than_or_equals
        if number_not_in is not None:
            self._values["number_not_in"] = number_not_in
        if string_begins_with is not None:
            self._values["string_begins_with"] = string_begins_with
        if string_contains is not None:
            self._values["string_contains"] = string_contains
        if string_ends_with is not None:
            self._values["string_ends_with"] = string_ends_with
        if string_in is not None:
            self._values["string_in"] = string_in
        if string_not_in is not None:
            self._values["string_not_in"] = string_not_in

    @builtins.property
    def bool_equals(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterBoolEquals"]]:
        """bool_equals block."""
        result = self._values.get("bool_equals")
        return result

    @builtins.property
    def number_greater_than(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberGreaterThan"]]:
        """number_greater_than block."""
        result = self._values.get("number_greater_than")
        return result

    @builtins.property
    def number_greater_than_or_equals(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberGreaterThanOrEquals"]]:
        """number_greater_than_or_equals block."""
        result = self._values.get("number_greater_than_or_equals")
        return result

    @builtins.property
    def number_in(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberIn"]]:
        """number_in block."""
        result = self._values.get("number_in")
        return result

    @builtins.property
    def number_less_than(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberLessThan"]]:
        """number_less_than block."""
        result = self._values.get("number_less_than")
        return result

    @builtins.property
    def number_less_than_or_equals(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberLessThanOrEquals"]]:
        """number_less_than_or_equals block."""
        result = self._values.get("number_less_than_or_equals")
        return result

    @builtins.property
    def number_not_in(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterNumberNotIn"]]:
        """number_not_in block."""
        result = self._values.get("number_not_in")
        return result

    @builtins.property
    def string_begins_with(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringBeginsWith"]]:
        """string_begins_with block."""
        result = self._values.get("string_begins_with")
        return result

    @builtins.property
    def string_contains(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringContains"]]:
        """string_contains block."""
        result = self._values.get("string_contains")
        return result

    @builtins.property
    def string_ends_with(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringEndsWith"]]:
        """string_ends_with block."""
        result = self._values.get("string_ends_with")
        return result

    @builtins.property
    def string_in(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringIn"]]:
        """string_in block."""
        result = self._values.get("string_in")
        return result

    @builtins.property
    def string_not_in(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionAdvancedFilterStringNotIn"]]:
        """string_not_in block."""
        result = self._values.get("string_not_in")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterBoolEquals",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "value": "value"},
)
class EventgridEventSubscriptionAdvancedFilterBoolEquals:
    def __init__(self, *, key: builtins.str, value: builtins.bool) -> None:
        """
        :param key: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "value": value,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.bool:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterBoolEquals(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterNumberGreaterThan",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "value": "value"},
)
class EventgridEventSubscriptionAdvancedFilterNumberGreaterThan:
    def __init__(self, *, key: builtins.str, value: jsii.Number) -> None:
        """
        :param key: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "value": value,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def value(self) -> jsii.Number:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterNumberGreaterThan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterNumberGreaterThanOrEquals",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "value": "value"},
)
class EventgridEventSubscriptionAdvancedFilterNumberGreaterThanOrEquals:
    def __init__(self, *, key: builtins.str, value: jsii.Number) -> None:
        """
        :param key: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "value": value,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def value(self) -> jsii.Number:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterNumberGreaterThanOrEquals(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterNumberIn",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "values": "values"},
)
class EventgridEventSubscriptionAdvancedFilterNumberIn:
    def __init__(self, *, key: builtins.str, values: typing.List[jsii.Number]) -> None:
        """
        :param key: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "values": values,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[jsii.Number]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterNumberIn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterNumberLessThan",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "value": "value"},
)
class EventgridEventSubscriptionAdvancedFilterNumberLessThan:
    def __init__(self, *, key: builtins.str, value: jsii.Number) -> None:
        """
        :param key: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "value": value,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def value(self) -> jsii.Number:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterNumberLessThan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterNumberLessThanOrEquals",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "value": "value"},
)
class EventgridEventSubscriptionAdvancedFilterNumberLessThanOrEquals:
    def __init__(self, *, key: builtins.str, value: jsii.Number) -> None:
        """
        :param key: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "value": value,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def value(self) -> jsii.Number:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterNumberLessThanOrEquals(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterNumberNotIn",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "values": "values"},
)
class EventgridEventSubscriptionAdvancedFilterNumberNotIn:
    def __init__(self, *, key: builtins.str, values: typing.List[jsii.Number]) -> None:
        """
        :param key: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "values": values,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[jsii.Number]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterNumberNotIn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterStringBeginsWith",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "values": "values"},
)
class EventgridEventSubscriptionAdvancedFilterStringBeginsWith:
    def __init__(self, *, key: builtins.str, values: typing.List[builtins.str]) -> None:
        """
        :param key: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "values": values,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterStringBeginsWith(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterStringContains",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "values": "values"},
)
class EventgridEventSubscriptionAdvancedFilterStringContains:
    def __init__(self, *, key: builtins.str, values: typing.List[builtins.str]) -> None:
        """
        :param key: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "values": values,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterStringContains(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterStringEndsWith",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "values": "values"},
)
class EventgridEventSubscriptionAdvancedFilterStringEndsWith:
    def __init__(self, *, key: builtins.str, values: typing.List[builtins.str]) -> None:
        """
        :param key: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "values": values,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterStringEndsWith(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterStringIn",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "values": "values"},
)
class EventgridEventSubscriptionAdvancedFilterStringIn:
    def __init__(self, *, key: builtins.str, values: typing.List[builtins.str]) -> None:
        """
        :param key: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "values": values,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterStringIn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAdvancedFilterStringNotIn",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "values": "values"},
)
class EventgridEventSubscriptionAdvancedFilterStringNotIn:
    def __init__(self, *, key: builtins.str, values: typing.List[builtins.str]) -> None:
        """
        :param key: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "values": values,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAdvancedFilterStringNotIn(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionAzureFunctionEndpoint",
    jsii_struct_bases=[],
    name_mapping={
        "function_id": "functionId",
        "max_events_per_batch": "maxEventsPerBatch",
        "preferred_batch_size_in_kilobytes": "preferredBatchSizeInKilobytes",
    },
)
class EventgridEventSubscriptionAzureFunctionEndpoint:
    def __init__(
        self,
        *,
        function_id: builtins.str,
        max_events_per_batch: typing.Optional[jsii.Number] = None,
        preferred_batch_size_in_kilobytes: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param function_id: -
        :param max_events_per_batch: -
        :param preferred_batch_size_in_kilobytes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "function_id": function_id,
        }
        if max_events_per_batch is not None:
            self._values["max_events_per_batch"] = max_events_per_batch
        if preferred_batch_size_in_kilobytes is not None:
            self._values["preferred_batch_size_in_kilobytes"] = preferred_batch_size_in_kilobytes

    @builtins.property
    def function_id(self) -> builtins.str:
        result = self._values.get("function_id")
        assert result is not None, "Required property 'function_id' is missing"
        return result

    @builtins.property
    def max_events_per_batch(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_events_per_batch")
        return result

    @builtins.property
    def preferred_batch_size_in_kilobytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("preferred_batch_size_in_kilobytes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionAzureFunctionEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "scope": "scope",
        "advanced_filter": "advancedFilter",
        "azure_function_endpoint": "azureFunctionEndpoint",
        "event_delivery_schema": "eventDeliverySchema",
        "eventhub_endpoint": "eventhubEndpoint",
        "eventhub_endpoint_id": "eventhubEndpointId",
        "expiration_time_utc": "expirationTimeUtc",
        "hybrid_connection_endpoint": "hybridConnectionEndpoint",
        "hybrid_connection_endpoint_id": "hybridConnectionEndpointId",
        "included_event_types": "includedEventTypes",
        "labels": "labels",
        "retry_policy": "retryPolicy",
        "service_bus_queue_endpoint_id": "serviceBusQueueEndpointId",
        "service_bus_topic_endpoint_id": "serviceBusTopicEndpointId",
        "storage_blob_dead_letter_destination": "storageBlobDeadLetterDestination",
        "storage_queue_endpoint": "storageQueueEndpoint",
        "subject_filter": "subjectFilter",
        "timeouts": "timeouts",
        "topic_name": "topicName",
        "webhook_endpoint": "webhookEndpoint",
    },
)
class EventgridEventSubscriptionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        scope: builtins.str,
        advanced_filter: typing.Optional[typing.List[EventgridEventSubscriptionAdvancedFilter]] = None,
        azure_function_endpoint: typing.Optional[typing.List[EventgridEventSubscriptionAzureFunctionEndpoint]] = None,
        event_delivery_schema: typing.Optional[builtins.str] = None,
        eventhub_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionEventhubEndpoint"]] = None,
        eventhub_endpoint_id: typing.Optional[builtins.str] = None,
        expiration_time_utc: typing.Optional[builtins.str] = None,
        hybrid_connection_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionHybridConnectionEndpoint"]] = None,
        hybrid_connection_endpoint_id: typing.Optional[builtins.str] = None,
        included_event_types: typing.Optional[typing.List[builtins.str]] = None,
        labels: typing.Optional[typing.List[builtins.str]] = None,
        retry_policy: typing.Optional[typing.List["EventgridEventSubscriptionRetryPolicy"]] = None,
        service_bus_queue_endpoint_id: typing.Optional[builtins.str] = None,
        service_bus_topic_endpoint_id: typing.Optional[builtins.str] = None,
        storage_blob_dead_letter_destination: typing.Optional[typing.List["EventgridEventSubscriptionStorageBlobDeadLetterDestination"]] = None,
        storage_queue_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionStorageQueueEndpoint"]] = None,
        subject_filter: typing.Optional[typing.List["EventgridEventSubscriptionSubjectFilter"]] = None,
        timeouts: typing.Optional["EventgridEventSubscriptionTimeouts"] = None,
        topic_name: typing.Optional[builtins.str] = None,
        webhook_endpoint: typing.Optional[typing.List["EventgridEventSubscriptionWebhookEndpoint"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param scope: -
        :param advanced_filter: advanced_filter block.
        :param azure_function_endpoint: azure_function_endpoint block.
        :param event_delivery_schema: -
        :param eventhub_endpoint: eventhub_endpoint block.
        :param eventhub_endpoint_id: -
        :param expiration_time_utc: -
        :param hybrid_connection_endpoint: hybrid_connection_endpoint block.
        :param hybrid_connection_endpoint_id: -
        :param included_event_types: -
        :param labels: -
        :param retry_policy: retry_policy block.
        :param service_bus_queue_endpoint_id: -
        :param service_bus_topic_endpoint_id: -
        :param storage_blob_dead_letter_destination: storage_blob_dead_letter_destination block.
        :param storage_queue_endpoint: storage_queue_endpoint block.
        :param subject_filter: subject_filter block.
        :param timeouts: timeouts block.
        :param topic_name: -
        :param webhook_endpoint: webhook_endpoint block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventgridEventSubscriptionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if advanced_filter is not None:
            self._values["advanced_filter"] = advanced_filter
        if azure_function_endpoint is not None:
            self._values["azure_function_endpoint"] = azure_function_endpoint
        if event_delivery_schema is not None:
            self._values["event_delivery_schema"] = event_delivery_schema
        if eventhub_endpoint is not None:
            self._values["eventhub_endpoint"] = eventhub_endpoint
        if eventhub_endpoint_id is not None:
            self._values["eventhub_endpoint_id"] = eventhub_endpoint_id
        if expiration_time_utc is not None:
            self._values["expiration_time_utc"] = expiration_time_utc
        if hybrid_connection_endpoint is not None:
            self._values["hybrid_connection_endpoint"] = hybrid_connection_endpoint
        if hybrid_connection_endpoint_id is not None:
            self._values["hybrid_connection_endpoint_id"] = hybrid_connection_endpoint_id
        if included_event_types is not None:
            self._values["included_event_types"] = included_event_types
        if labels is not None:
            self._values["labels"] = labels
        if retry_policy is not None:
            self._values["retry_policy"] = retry_policy
        if service_bus_queue_endpoint_id is not None:
            self._values["service_bus_queue_endpoint_id"] = service_bus_queue_endpoint_id
        if service_bus_topic_endpoint_id is not None:
            self._values["service_bus_topic_endpoint_id"] = service_bus_topic_endpoint_id
        if storage_blob_dead_letter_destination is not None:
            self._values["storage_blob_dead_letter_destination"] = storage_blob_dead_letter_destination
        if storage_queue_endpoint is not None:
            self._values["storage_queue_endpoint"] = storage_queue_endpoint
        if subject_filter is not None:
            self._values["subject_filter"] = subject_filter
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if topic_name is not None:
            self._values["topic_name"] = topic_name
        if webhook_endpoint is not None:
            self._values["webhook_endpoint"] = webhook_endpoint

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def advanced_filter(
        self,
    ) -> typing.Optional[typing.List[EventgridEventSubscriptionAdvancedFilter]]:
        """advanced_filter block."""
        result = self._values.get("advanced_filter")
        return result

    @builtins.property
    def azure_function_endpoint(
        self,
    ) -> typing.Optional[typing.List[EventgridEventSubscriptionAzureFunctionEndpoint]]:
        """azure_function_endpoint block."""
        result = self._values.get("azure_function_endpoint")
        return result

    @builtins.property
    def event_delivery_schema(self) -> typing.Optional[builtins.str]:
        result = self._values.get("event_delivery_schema")
        return result

    @builtins.property
    def eventhub_endpoint(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionEventhubEndpoint"]]:
        """eventhub_endpoint block."""
        result = self._values.get("eventhub_endpoint")
        return result

    @builtins.property
    def eventhub_endpoint_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eventhub_endpoint_id")
        return result

    @builtins.property
    def expiration_time_utc(self) -> typing.Optional[builtins.str]:
        result = self._values.get("expiration_time_utc")
        return result

    @builtins.property
    def hybrid_connection_endpoint(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionHybridConnectionEndpoint"]]:
        """hybrid_connection_endpoint block."""
        result = self._values.get("hybrid_connection_endpoint")
        return result

    @builtins.property
    def hybrid_connection_endpoint_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hybrid_connection_endpoint_id")
        return result

    @builtins.property
    def included_event_types(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("included_event_types")
        return result

    @builtins.property
    def labels(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("labels")
        return result

    @builtins.property
    def retry_policy(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionRetryPolicy"]]:
        """retry_policy block."""
        result = self._values.get("retry_policy")
        return result

    @builtins.property
    def service_bus_queue_endpoint_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("service_bus_queue_endpoint_id")
        return result

    @builtins.property
    def service_bus_topic_endpoint_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("service_bus_topic_endpoint_id")
        return result

    @builtins.property
    def storage_blob_dead_letter_destination(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionStorageBlobDeadLetterDestination"]]:
        """storage_blob_dead_letter_destination block."""
        result = self._values.get("storage_blob_dead_letter_destination")
        return result

    @builtins.property
    def storage_queue_endpoint(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionStorageQueueEndpoint"]]:
        """storage_queue_endpoint block."""
        result = self._values.get("storage_queue_endpoint")
        return result

    @builtins.property
    def subject_filter(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionSubjectFilter"]]:
        """subject_filter block."""
        result = self._values.get("subject_filter")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventgridEventSubscriptionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def topic_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("topic_name")
        return result

    @builtins.property
    def webhook_endpoint(
        self,
    ) -> typing.Optional[typing.List["EventgridEventSubscriptionWebhookEndpoint"]]:
        """webhook_endpoint block."""
        result = self._values.get("webhook_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionEventhubEndpoint",
    jsii_struct_bases=[],
    name_mapping={"eventhub_id": "eventhubId"},
)
class EventgridEventSubscriptionEventhubEndpoint:
    def __init__(self, *, eventhub_id: typing.Optional[builtins.str] = None) -> None:
        """
        :param eventhub_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if eventhub_id is not None:
            self._values["eventhub_id"] = eventhub_id

    @builtins.property
    def eventhub_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eventhub_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionEventhubEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionHybridConnectionEndpoint",
    jsii_struct_bases=[],
    name_mapping={"hybrid_connection_id": "hybridConnectionId"},
)
class EventgridEventSubscriptionHybridConnectionEndpoint:
    def __init__(
        self,
        *,
        hybrid_connection_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param hybrid_connection_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if hybrid_connection_id is not None:
            self._values["hybrid_connection_id"] = hybrid_connection_id

    @builtins.property
    def hybrid_connection_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hybrid_connection_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionHybridConnectionEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionRetryPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "event_time_to_live": "eventTimeToLive",
        "max_delivery_attempts": "maxDeliveryAttempts",
    },
)
class EventgridEventSubscriptionRetryPolicy:
    def __init__(
        self,
        *,
        event_time_to_live: jsii.Number,
        max_delivery_attempts: jsii.Number,
    ) -> None:
        """
        :param event_time_to_live: -
        :param max_delivery_attempts: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "event_time_to_live": event_time_to_live,
            "max_delivery_attempts": max_delivery_attempts,
        }

    @builtins.property
    def event_time_to_live(self) -> jsii.Number:
        result = self._values.get("event_time_to_live")
        assert result is not None, "Required property 'event_time_to_live' is missing"
        return result

    @builtins.property
    def max_delivery_attempts(self) -> jsii.Number:
        result = self._values.get("max_delivery_attempts")
        assert result is not None, "Required property 'max_delivery_attempts' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionRetryPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionStorageBlobDeadLetterDestination",
    jsii_struct_bases=[],
    name_mapping={
        "storage_account_id": "storageAccountId",
        "storage_blob_container_name": "storageBlobContainerName",
    },
)
class EventgridEventSubscriptionStorageBlobDeadLetterDestination:
    def __init__(
        self,
        *,
        storage_account_id: builtins.str,
        storage_blob_container_name: builtins.str,
    ) -> None:
        """
        :param storage_account_id: -
        :param storage_blob_container_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "storage_account_id": storage_account_id,
            "storage_blob_container_name": storage_blob_container_name,
        }

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def storage_blob_container_name(self) -> builtins.str:
        result = self._values.get("storage_blob_container_name")
        assert result is not None, "Required property 'storage_blob_container_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionStorageBlobDeadLetterDestination(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionStorageQueueEndpoint",
    jsii_struct_bases=[],
    name_mapping={"queue_name": "queueName", "storage_account_id": "storageAccountId"},
)
class EventgridEventSubscriptionStorageQueueEndpoint:
    def __init__(
        self,
        *,
        queue_name: builtins.str,
        storage_account_id: builtins.str,
    ) -> None:
        """
        :param queue_name: -
        :param storage_account_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "queue_name": queue_name,
            "storage_account_id": storage_account_id,
        }

    @builtins.property
    def queue_name(self) -> builtins.str:
        result = self._values.get("queue_name")
        assert result is not None, "Required property 'queue_name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionStorageQueueEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionSubjectFilter",
    jsii_struct_bases=[],
    name_mapping={
        "case_sensitive": "caseSensitive",
        "subject_begins_with": "subjectBeginsWith",
        "subject_ends_with": "subjectEndsWith",
    },
)
class EventgridEventSubscriptionSubjectFilter:
    def __init__(
        self,
        *,
        case_sensitive: typing.Optional[builtins.bool] = None,
        subject_begins_with: typing.Optional[builtins.str] = None,
        subject_ends_with: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param case_sensitive: -
        :param subject_begins_with: -
        :param subject_ends_with: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if case_sensitive is not None:
            self._values["case_sensitive"] = case_sensitive
        if subject_begins_with is not None:
            self._values["subject_begins_with"] = subject_begins_with
        if subject_ends_with is not None:
            self._values["subject_ends_with"] = subject_ends_with

    @builtins.property
    def case_sensitive(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("case_sensitive")
        return result

    @builtins.property
    def subject_begins_with(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subject_begins_with")
        return result

    @builtins.property
    def subject_ends_with(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subject_ends_with")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionSubjectFilter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventgridEventSubscriptionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridEventSubscriptionWebhookEndpoint",
    jsii_struct_bases=[],
    name_mapping={
        "url": "url",
        "active_directory_app_id_or_uri": "activeDirectoryAppIdOrUri",
        "active_directory_tenant_id": "activeDirectoryTenantId",
        "max_events_per_batch": "maxEventsPerBatch",
        "preferred_batch_size_in_kilobytes": "preferredBatchSizeInKilobytes",
    },
)
class EventgridEventSubscriptionWebhookEndpoint:
    def __init__(
        self,
        *,
        url: builtins.str,
        active_directory_app_id_or_uri: typing.Optional[builtins.str] = None,
        active_directory_tenant_id: typing.Optional[builtins.str] = None,
        max_events_per_batch: typing.Optional[jsii.Number] = None,
        preferred_batch_size_in_kilobytes: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param url: -
        :param active_directory_app_id_or_uri: -
        :param active_directory_tenant_id: -
        :param max_events_per_batch: -
        :param preferred_batch_size_in_kilobytes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "url": url,
        }
        if active_directory_app_id_or_uri is not None:
            self._values["active_directory_app_id_or_uri"] = active_directory_app_id_or_uri
        if active_directory_tenant_id is not None:
            self._values["active_directory_tenant_id"] = active_directory_tenant_id
        if max_events_per_batch is not None:
            self._values["max_events_per_batch"] = max_events_per_batch
        if preferred_batch_size_in_kilobytes is not None:
            self._values["preferred_batch_size_in_kilobytes"] = preferred_batch_size_in_kilobytes

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    @builtins.property
    def active_directory_app_id_or_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("active_directory_app_id_or_uri")
        return result

    @builtins.property
    def active_directory_tenant_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("active_directory_tenant_id")
        return result

    @builtins.property
    def max_events_per_batch(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_events_per_batch")
        return result

    @builtins.property
    def preferred_batch_size_in_kilobytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("preferred_batch_size_in_kilobytes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridEventSubscriptionWebhookEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventgridSystemTopic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventgridSystemTopic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        source_arm_resource_id: builtins.str,
        topic_type: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventgridSystemTopicTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param source_arm_resource_id: -
        :param topic_type: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventgridSystemTopicConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            source_arm_resource_id=source_arm_resource_id,
            topic_type=topic_type,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventgridSystemTopic, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metricArmResourceId")
    def metric_arm_resource_id(self) -> builtins.str:
        return jsii.get(self, "metricArmResourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceArmResourceIdInput")
    def source_arm_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "sourceArmResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicTypeInput")
    def topic_type_input(self) -> builtins.str:
        return jsii.get(self, "topicTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventgridSystemTopicTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceArmResourceId")
    def source_arm_resource_id(self) -> builtins.str:
        return jsii.get(self, "sourceArmResourceId")

    @source_arm_resource_id.setter # type: ignore
    def source_arm_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceArmResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventgridSystemTopicTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventgridSystemTopicTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicType")
    def topic_type(self) -> builtins.str:
        return jsii.get(self, "topicType")

    @topic_type.setter # type: ignore
    def topic_type(self, value: builtins.str) -> None:
        jsii.set(self, "topicType", value)


@jsii.data_type(
    jsii_type="azurerm.EventgridSystemTopicConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "source_arm_resource_id": "sourceArmResourceId",
        "topic_type": "topicType",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class EventgridSystemTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        source_arm_resource_id: builtins.str,
        topic_type: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventgridSystemTopicTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param source_arm_resource_id: -
        :param topic_type: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventgridSystemTopicTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "source_arm_resource_id": source_arm_resource_id,
            "topic_type": topic_type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def source_arm_resource_id(self) -> builtins.str:
        result = self._values.get("source_arm_resource_id")
        assert result is not None, "Required property 'source_arm_resource_id' is missing"
        return result

    @builtins.property
    def topic_type(self) -> builtins.str:
        result = self._values.get("topic_type")
        assert result is not None, "Required property 'topic_type' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventgridSystemTopicTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridSystemTopicConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridSystemTopicTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventgridSystemTopicTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridSystemTopicTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventgridTopic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventgridTopic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        input_mapping_default_values: typing.Optional[typing.List["EventgridTopicInputMappingDefaultValues"]] = None,
        input_mapping_fields: typing.Optional[typing.List["EventgridTopicInputMappingFields"]] = None,
        input_schema: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventgridTopicTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param input_mapping_default_values: input_mapping_default_values block.
        :param input_mapping_fields: input_mapping_fields block.
        :param input_schema: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventgridTopicConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            input_mapping_default_values=input_mapping_default_values,
            input_mapping_fields=input_mapping_fields,
            input_schema=input_schema,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventgridTopic, self, [scope, id, config])

    @jsii.member(jsii_name="resetInputMappingDefaultValues")
    def reset_input_mapping_default_values(self) -> None:
        return jsii.invoke(self, "resetInputMappingDefaultValues", [])

    @jsii.member(jsii_name="resetInputMappingFields")
    def reset_input_mapping_fields(self) -> None:
        return jsii.invoke(self, "resetInputMappingFields", [])

    @jsii.member(jsii_name="resetInputSchema")
    def reset_input_schema(self) -> None:
        return jsii.invoke(self, "resetInputSchema", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingDefaultValuesInput")
    def input_mapping_default_values_input(
        self,
    ) -> typing.Optional[typing.List["EventgridTopicInputMappingDefaultValues"]]:
        return jsii.get(self, "inputMappingDefaultValuesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingFieldsInput")
    def input_mapping_fields_input(
        self,
    ) -> typing.Optional[typing.List["EventgridTopicInputMappingFields"]]:
        return jsii.get(self, "inputMappingFieldsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputSchemaInput")
    def input_schema_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "inputSchemaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventgridTopicTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingDefaultValues")
    def input_mapping_default_values(
        self,
    ) -> typing.List["EventgridTopicInputMappingDefaultValues"]:
        return jsii.get(self, "inputMappingDefaultValues")

    @input_mapping_default_values.setter # type: ignore
    def input_mapping_default_values(
        self,
        value: typing.List["EventgridTopicInputMappingDefaultValues"],
    ) -> None:
        jsii.set(self, "inputMappingDefaultValues", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputMappingFields")
    def input_mapping_fields(self) -> typing.List["EventgridTopicInputMappingFields"]:
        return jsii.get(self, "inputMappingFields")

    @input_mapping_fields.setter # type: ignore
    def input_mapping_fields(
        self,
        value: typing.List["EventgridTopicInputMappingFields"],
    ) -> None:
        jsii.set(self, "inputMappingFields", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputSchema")
    def input_schema(self) -> builtins.str:
        return jsii.get(self, "inputSchema")

    @input_schema.setter # type: ignore
    def input_schema(self, value: builtins.str) -> None:
        jsii.set(self, "inputSchema", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventgridTopicTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventgridTopicTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.EventgridTopicConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "input_mapping_default_values": "inputMappingDefaultValues",
        "input_mapping_fields": "inputMappingFields",
        "input_schema": "inputSchema",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class EventgridTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        input_mapping_default_values: typing.Optional[typing.List["EventgridTopicInputMappingDefaultValues"]] = None,
        input_mapping_fields: typing.Optional[typing.List["EventgridTopicInputMappingFields"]] = None,
        input_schema: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventgridTopicTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param input_mapping_default_values: input_mapping_default_values block.
        :param input_mapping_fields: input_mapping_fields block.
        :param input_schema: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventgridTopicTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if input_mapping_default_values is not None:
            self._values["input_mapping_default_values"] = input_mapping_default_values
        if input_mapping_fields is not None:
            self._values["input_mapping_fields"] = input_mapping_fields
        if input_schema is not None:
            self._values["input_schema"] = input_schema
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def input_mapping_default_values(
        self,
    ) -> typing.Optional[typing.List["EventgridTopicInputMappingDefaultValues"]]:
        """input_mapping_default_values block."""
        result = self._values.get("input_mapping_default_values")
        return result

    @builtins.property
    def input_mapping_fields(
        self,
    ) -> typing.Optional[typing.List["EventgridTopicInputMappingFields"]]:
        """input_mapping_fields block."""
        result = self._values.get("input_mapping_fields")
        return result

    @builtins.property
    def input_schema(self) -> typing.Optional[builtins.str]:
        result = self._values.get("input_schema")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventgridTopicTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridTopicConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridTopicInputMappingDefaultValues",
    jsii_struct_bases=[],
    name_mapping={
        "data_version": "dataVersion",
        "event_type": "eventType",
        "subject": "subject",
    },
)
class EventgridTopicInputMappingDefaultValues:
    def __init__(
        self,
        *,
        data_version: typing.Optional[builtins.str] = None,
        event_type: typing.Optional[builtins.str] = None,
        subject: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param data_version: -
        :param event_type: -
        :param subject: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if data_version is not None:
            self._values["data_version"] = data_version
        if event_type is not None:
            self._values["event_type"] = event_type
        if subject is not None:
            self._values["subject"] = subject

    @builtins.property
    def data_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data_version")
        return result

    @builtins.property
    def event_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("event_type")
        return result

    @builtins.property
    def subject(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subject")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridTopicInputMappingDefaultValues(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridTopicInputMappingFields",
    jsii_struct_bases=[],
    name_mapping={
        "data_version": "dataVersion",
        "event_time": "eventTime",
        "event_type": "eventType",
        "id": "id",
        "subject": "subject",
        "topic": "topic",
    },
)
class EventgridTopicInputMappingFields:
    def __init__(
        self,
        *,
        data_version: typing.Optional[builtins.str] = None,
        event_time: typing.Optional[builtins.str] = None,
        event_type: typing.Optional[builtins.str] = None,
        id: typing.Optional[builtins.str] = None,
        subject: typing.Optional[builtins.str] = None,
        topic: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param data_version: -
        :param event_time: -
        :param event_type: -
        :param id: -
        :param subject: -
        :param topic: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if data_version is not None:
            self._values["data_version"] = data_version
        if event_time is not None:
            self._values["event_time"] = event_time
        if event_type is not None:
            self._values["event_type"] = event_type
        if id is not None:
            self._values["id"] = id
        if subject is not None:
            self._values["subject"] = subject
        if topic is not None:
            self._values["topic"] = topic

    @builtins.property
    def data_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data_version")
        return result

    @builtins.property
    def event_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("event_time")
        return result

    @builtins.property
    def event_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("event_type")
        return result

    @builtins.property
    def id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("id")
        return result

    @builtins.property
    def subject(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subject")
        return result

    @builtins.property
    def topic(self) -> typing.Optional[builtins.str]:
        result = self._values.get("topic")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridTopicInputMappingFields(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventgridTopicTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventgridTopicTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventgridTopicTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Eventhub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Eventhub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        message_retention: jsii.Number,
        name: builtins.str,
        namespace_name: builtins.str,
        partition_count: jsii.Number,
        resource_group_name: builtins.str,
        capture_description: typing.Optional[typing.List["EventhubCaptureDescription"]] = None,
        timeouts: typing.Optional["EventhubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param message_retention: -
        :param name: -
        :param namespace_name: -
        :param partition_count: -
        :param resource_group_name: -
        :param capture_description: capture_description block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventhubConfig(
            message_retention=message_retention,
            name=name,
            namespace_name=namespace_name,
            partition_count=partition_count,
            resource_group_name=resource_group_name,
            capture_description=capture_description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Eventhub, self, [scope, id, config])

    @jsii.member(jsii_name="resetCaptureDescription")
    def reset_capture_description(self) -> None:
        return jsii.invoke(self, "resetCaptureDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="messageRetentionInput")
    def message_retention_input(self) -> jsii.Number:
        return jsii.get(self, "messageRetentionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionCountInput")
    def partition_count_input(self) -> jsii.Number:
        return jsii.get(self, "partitionCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionIds")
    def partition_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "partitionIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="captureDescriptionInput")
    def capture_description_input(
        self,
    ) -> typing.Optional[typing.List["EventhubCaptureDescription"]]:
        return jsii.get(self, "captureDescriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventhubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="captureDescription")
    def capture_description(self) -> typing.List["EventhubCaptureDescription"]:
        return jsii.get(self, "captureDescription")

    @capture_description.setter # type: ignore
    def capture_description(
        self,
        value: typing.List["EventhubCaptureDescription"],
    ) -> None:
        jsii.set(self, "captureDescription", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="messageRetention")
    def message_retention(self) -> jsii.Number:
        return jsii.get(self, "messageRetention")

    @message_retention.setter # type: ignore
    def message_retention(self, value: jsii.Number) -> None:
        jsii.set(self, "messageRetention", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionCount")
    def partition_count(self) -> jsii.Number:
        return jsii.get(self, "partitionCount")

    @partition_count.setter # type: ignore
    def partition_count(self, value: jsii.Number) -> None:
        jsii.set(self, "partitionCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventhubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventhubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class EventhubAuthorizationRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventhubAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["EventhubAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventhubAuthorizationRuleConfig(
            eventhub_name=eventhub_name,
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            listen=listen,
            manage=manage,
            send=send,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventhubAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetListen")
    def reset_listen(self) -> None:
        return jsii.invoke(self, "resetListen", [])

    @jsii.member(jsii_name="resetManage")
    def reset_manage(self) -> None:
        return jsii.invoke(self, "resetManage", [])

    @jsii.member(jsii_name="resetSend")
    def reset_send(self) -> None:
        return jsii.invoke(self, "resetSend", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubNameInput")
    def eventhub_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionStringAlias")
    def primary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionStringAlias")
    def secondary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listenInput")
    def listen_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "listenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manageInput")
    def manage_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "manageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendInput")
    def send_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sendInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventhubAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubName")
    def eventhub_name(self) -> builtins.str:
        return jsii.get(self, "eventhubName")

    @eventhub_name.setter # type: ignore
    def eventhub_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @listen.setter # type: ignore
    def listen(self, value: builtins.bool) -> None:
        jsii.set(self, "listen", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @manage.setter # type: ignore
    def manage(self, value: builtins.bool) -> None:
        jsii.set(self, "manage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @send.setter # type: ignore
    def send(self, value: builtins.bool) -> None:
        jsii.set(self, "send", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventhubAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventhubAuthorizationRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.EventhubAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "eventhub_name": "eventhubName",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "listen": "listen",
        "manage": "manage",
        "send": "send",
        "timeouts": "timeouts",
    },
)
class EventhubAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["EventhubAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventhubAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "eventhub_name": eventhub_name,
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if listen is not None:
            self._values["listen"] = listen
        if manage is not None:
            self._values["manage"] = manage
        if send is not None:
            self._values["send"] = send
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def eventhub_name(self) -> builtins.str:
        result = self._values.get("eventhub_name")
        assert result is not None, "Required property 'eventhub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def listen(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("listen")
        return result

    @builtins.property
    def manage(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manage")
        return result

    @builtins.property
    def send(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventhubAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventhubAuthorizationRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubCaptureDescription",
    jsii_struct_bases=[],
    name_mapping={
        "destination": "destination",
        "enabled": "enabled",
        "encoding": "encoding",
        "interval_in_seconds": "intervalInSeconds",
        "size_limit_in_bytes": "sizeLimitInBytes",
        "skip_empty_archives": "skipEmptyArchives",
    },
)
class EventhubCaptureDescription:
    def __init__(
        self,
        *,
        destination: typing.List["EventhubCaptureDescriptionDestination"],
        enabled: builtins.bool,
        encoding: builtins.str,
        interval_in_seconds: typing.Optional[jsii.Number] = None,
        size_limit_in_bytes: typing.Optional[jsii.Number] = None,
        skip_empty_archives: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param destination: destination block.
        :param enabled: -
        :param encoding: -
        :param interval_in_seconds: -
        :param size_limit_in_bytes: -
        :param skip_empty_archives: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destination": destination,
            "enabled": enabled,
            "encoding": encoding,
        }
        if interval_in_seconds is not None:
            self._values["interval_in_seconds"] = interval_in_seconds
        if size_limit_in_bytes is not None:
            self._values["size_limit_in_bytes"] = size_limit_in_bytes
        if skip_empty_archives is not None:
            self._values["skip_empty_archives"] = skip_empty_archives

    @builtins.property
    def destination(self) -> typing.List["EventhubCaptureDescriptionDestination"]:
        """destination block."""
        result = self._values.get("destination")
        assert result is not None, "Required property 'destination' is missing"
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def encoding(self) -> builtins.str:
        result = self._values.get("encoding")
        assert result is not None, "Required property 'encoding' is missing"
        return result

    @builtins.property
    def interval_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval_in_seconds")
        return result

    @builtins.property
    def size_limit_in_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("size_limit_in_bytes")
        return result

    @builtins.property
    def skip_empty_archives(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("skip_empty_archives")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubCaptureDescription(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubCaptureDescriptionDestination",
    jsii_struct_bases=[],
    name_mapping={
        "archive_name_format": "archiveNameFormat",
        "blob_container_name": "blobContainerName",
        "name": "name",
        "storage_account_id": "storageAccountId",
    },
)
class EventhubCaptureDescriptionDestination:
    def __init__(
        self,
        *,
        archive_name_format: builtins.str,
        blob_container_name: builtins.str,
        name: builtins.str,
        storage_account_id: builtins.str,
    ) -> None:
        """
        :param archive_name_format: -
        :param blob_container_name: -
        :param name: -
        :param storage_account_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "archive_name_format": archive_name_format,
            "blob_container_name": blob_container_name,
            "name": name,
            "storage_account_id": storage_account_id,
        }

    @builtins.property
    def archive_name_format(self) -> builtins.str:
        result = self._values.get("archive_name_format")
        assert result is not None, "Required property 'archive_name_format' is missing"
        return result

    @builtins.property
    def blob_container_name(self) -> builtins.str:
        result = self._values.get("blob_container_name")
        assert result is not None, "Required property 'blob_container_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubCaptureDescriptionDestination(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventhubCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventhubCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventhubClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventhubClusterConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventhubCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventhubClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventhubClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventhubClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.EventhubClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class EventhubClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventhubClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventhubClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventhubClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventhubClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "message_retention": "messageRetention",
        "name": "name",
        "namespace_name": "namespaceName",
        "partition_count": "partitionCount",
        "resource_group_name": "resourceGroupName",
        "capture_description": "captureDescription",
        "timeouts": "timeouts",
    },
)
class EventhubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        message_retention: jsii.Number,
        name: builtins.str,
        namespace_name: builtins.str,
        partition_count: jsii.Number,
        resource_group_name: builtins.str,
        capture_description: typing.Optional[typing.List[EventhubCaptureDescription]] = None,
        timeouts: typing.Optional["EventhubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param message_retention: -
        :param name: -
        :param namespace_name: -
        :param partition_count: -
        :param resource_group_name: -
        :param capture_description: capture_description block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventhubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "message_retention": message_retention,
            "name": name,
            "namespace_name": namespace_name,
            "partition_count": partition_count,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if capture_description is not None:
            self._values["capture_description"] = capture_description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def message_retention(self) -> jsii.Number:
        result = self._values.get("message_retention")
        assert result is not None, "Required property 'message_retention' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def partition_count(self) -> jsii.Number:
        result = self._values.get("partition_count")
        assert result is not None, "Required property 'partition_count' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def capture_description(
        self,
    ) -> typing.Optional[typing.List[EventhubCaptureDescription]]:
        """capture_description block."""
        result = self._values.get("capture_description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventhubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventhubConsumerGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventhubConsumerGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["EventhubConsumerGroupTimeouts"] = None,
        user_metadata: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param user_metadata: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventhubConsumerGroupConfig(
            eventhub_name=eventhub_name,
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            user_metadata=user_metadata,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventhubConsumerGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUserMetadata")
    def reset_user_metadata(self) -> None:
        return jsii.invoke(self, "resetUserMetadata", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubNameInput")
    def eventhub_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventhubConsumerGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userMetadataInput")
    def user_metadata_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "userMetadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubName")
    def eventhub_name(self) -> builtins.str:
        return jsii.get(self, "eventhubName")

    @eventhub_name.setter # type: ignore
    def eventhub_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventhubConsumerGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventhubConsumerGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userMetadata")
    def user_metadata(self) -> builtins.str:
        return jsii.get(self, "userMetadata")

    @user_metadata.setter # type: ignore
    def user_metadata(self, value: builtins.str) -> None:
        jsii.set(self, "userMetadata", value)


@jsii.data_type(
    jsii_type="azurerm.EventhubConsumerGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "eventhub_name": "eventhubName",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
        "user_metadata": "userMetadata",
    },
)
class EventhubConsumerGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        eventhub_name: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["EventhubConsumerGroupTimeouts"] = None,
        user_metadata: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param eventhub_name: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param user_metadata: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventhubConsumerGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "eventhub_name": eventhub_name,
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if user_metadata is not None:
            self._values["user_metadata"] = user_metadata

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def eventhub_name(self) -> builtins.str:
        result = self._values.get("eventhub_name")
        assert result is not None, "Required property 'eventhub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventhubConsumerGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def user_metadata(self) -> typing.Optional[builtins.str]:
        result = self._values.get("user_metadata")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubConsumerGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubConsumerGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventhubConsumerGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubConsumerGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventhubNamespace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventhubNamespace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        auto_inflate_enabled: typing.Optional[builtins.bool] = None,
        capacity: typing.Optional[jsii.Number] = None,
        dedicated_cluster_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["EventhubNamespaceIdentity"]] = None,
        maximum_throughput_units: typing.Optional[jsii.Number] = None,
        network_rulesets: typing.Optional[typing.List["EventhubNamespaceNetworkRulesets"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventhubNamespaceTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param auto_inflate_enabled: -
        :param capacity: -
        :param dedicated_cluster_id: -
        :param identity: identity block.
        :param maximum_throughput_units: -
        :param network_rulesets: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_redundant: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventhubNamespaceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            auto_inflate_enabled=auto_inflate_enabled,
            capacity=capacity,
            dedicated_cluster_id=dedicated_cluster_id,
            identity=identity,
            maximum_throughput_units=maximum_throughput_units,
            network_rulesets=network_rulesets,
            tags=tags,
            timeouts=timeouts,
            zone_redundant=zone_redundant,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventhubNamespace, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoInflateEnabled")
    def reset_auto_inflate_enabled(self) -> None:
        return jsii.invoke(self, "resetAutoInflateEnabled", [])

    @jsii.member(jsii_name="resetCapacity")
    def reset_capacity(self) -> None:
        return jsii.invoke(self, "resetCapacity", [])

    @jsii.member(jsii_name="resetDedicatedClusterId")
    def reset_dedicated_cluster_id(self) -> None:
        return jsii.invoke(self, "resetDedicatedClusterId", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetMaximumThroughputUnits")
    def reset_maximum_throughput_units(self) -> None:
        return jsii.invoke(self, "resetMaximumThroughputUnits", [])

    @jsii.member(jsii_name="resetNetworkRulesets")
    def reset_network_rulesets(self) -> None:
        return jsii.invoke(self, "resetNetworkRulesets", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZoneRedundant")
    def reset_zone_redundant(self) -> None:
        return jsii.invoke(self, "resetZoneRedundant", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryConnectionString")
    def default_primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryConnectionStringAlias")
    def default_primary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryKey")
    def default_primary_key(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryConnectionString")
    def default_secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryConnectionStringAlias")
    def default_secondary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryKey")
    def default_secondary_key(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoInflateEnabledInput")
    def auto_inflate_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoInflateEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacityInput")
    def capacity_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "capacityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedClusterIdInput")
    def dedicated_cluster_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dedicatedClusterIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["EventhubNamespaceIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumThroughputUnitsInput")
    def maximum_throughput_units_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumThroughputUnitsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRulesetsInput")
    def network_rulesets_input(
        self,
    ) -> typing.Optional[typing.List["EventhubNamespaceNetworkRulesets"]]:
        return jsii.get(self, "networkRulesetsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["EventhubNamespaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundantInput")
    def zone_redundant_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneRedundantInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoInflateEnabled")
    def auto_inflate_enabled(self) -> builtins.bool:
        return jsii.get(self, "autoInflateEnabled")

    @auto_inflate_enabled.setter # type: ignore
    def auto_inflate_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "autoInflateEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacity")
    def capacity(self) -> jsii.Number:
        return jsii.get(self, "capacity")

    @capacity.setter # type: ignore
    def capacity(self, value: jsii.Number) -> None:
        jsii.set(self, "capacity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedClusterId")
    def dedicated_cluster_id(self) -> builtins.str:
        return jsii.get(self, "dedicatedClusterId")

    @dedicated_cluster_id.setter # type: ignore
    def dedicated_cluster_id(self, value: builtins.str) -> None:
        jsii.set(self, "dedicatedClusterId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["EventhubNamespaceIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["EventhubNamespaceIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumThroughputUnits")
    def maximum_throughput_units(self) -> jsii.Number:
        return jsii.get(self, "maximumThroughputUnits")

    @maximum_throughput_units.setter # type: ignore
    def maximum_throughput_units(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumThroughputUnits", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRulesets")
    def network_rulesets(self) -> typing.List["EventhubNamespaceNetworkRulesets"]:
        return jsii.get(self, "networkRulesets")

    @network_rulesets.setter # type: ignore
    def network_rulesets(
        self,
        value: typing.List["EventhubNamespaceNetworkRulesets"],
    ) -> None:
        jsii.set(self, "networkRulesets", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventhubNamespaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventhubNamespaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @zone_redundant.setter # type: ignore
    def zone_redundant(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneRedundant", value)


class EventhubNamespaceAuthorizationRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventhubNamespaceAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["EventhubNamespaceAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventhubNamespaceAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            listen=listen,
            manage=manage,
            send=send,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventhubNamespaceAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetListen")
    def reset_listen(self) -> None:
        return jsii.invoke(self, "resetListen", [])

    @jsii.member(jsii_name="resetManage")
    def reset_manage(self) -> None:
        return jsii.invoke(self, "resetManage", [])

    @jsii.member(jsii_name="resetSend")
    def reset_send(self) -> None:
        return jsii.invoke(self, "resetSend", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionStringAlias")
    def primary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionStringAlias")
    def secondary_connection_string_alias(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionStringAlias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listenInput")
    def listen_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "listenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manageInput")
    def manage_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "manageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendInput")
    def send_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sendInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["EventhubNamespaceAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @listen.setter # type: ignore
    def listen(self, value: builtins.bool) -> None:
        jsii.set(self, "listen", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @manage.setter # type: ignore
    def manage(self, value: builtins.bool) -> None:
        jsii.set(self, "manage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @send.setter # type: ignore
    def send(self, value: builtins.bool) -> None:
        jsii.set(self, "send", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventhubNamespaceAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "EventhubNamespaceAuthorizationRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "listen": "listen",
        "manage": "manage",
        "send": "send",
        "timeouts": "timeouts",
    },
)
class EventhubNamespaceAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["EventhubNamespaceAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventhubNamespaceAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if listen is not None:
            self._values["listen"] = listen
        if manage is not None:
            self._values["manage"] = manage
        if send is not None:
            self._values["send"] = send
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def listen(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("listen")
        return result

    @builtins.property
    def manage(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manage")
        return result

    @builtins.property
    def send(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventhubNamespaceAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventhubNamespaceAuthorizationRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "auto_inflate_enabled": "autoInflateEnabled",
        "capacity": "capacity",
        "dedicated_cluster_id": "dedicatedClusterId",
        "identity": "identity",
        "maximum_throughput_units": "maximumThroughputUnits",
        "network_rulesets": "networkRulesets",
        "tags": "tags",
        "timeouts": "timeouts",
        "zone_redundant": "zoneRedundant",
    },
)
class EventhubNamespaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        auto_inflate_enabled: typing.Optional[builtins.bool] = None,
        capacity: typing.Optional[jsii.Number] = None,
        dedicated_cluster_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["EventhubNamespaceIdentity"]] = None,
        maximum_throughput_units: typing.Optional[jsii.Number] = None,
        network_rulesets: typing.Optional[typing.List["EventhubNamespaceNetworkRulesets"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["EventhubNamespaceTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param auto_inflate_enabled: -
        :param capacity: -
        :param dedicated_cluster_id: -
        :param identity: identity block.
        :param maximum_throughput_units: -
        :param network_rulesets: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_redundant: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventhubNamespaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_inflate_enabled is not None:
            self._values["auto_inflate_enabled"] = auto_inflate_enabled
        if capacity is not None:
            self._values["capacity"] = capacity
        if dedicated_cluster_id is not None:
            self._values["dedicated_cluster_id"] = dedicated_cluster_id
        if identity is not None:
            self._values["identity"] = identity
        if maximum_throughput_units is not None:
            self._values["maximum_throughput_units"] = maximum_throughput_units
        if network_rulesets is not None:
            self._values["network_rulesets"] = network_rulesets
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zone_redundant is not None:
            self._values["zone_redundant"] = zone_redundant

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def auto_inflate_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_inflate_enabled")
        return result

    @builtins.property
    def capacity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("capacity")
        return result

    @builtins.property
    def dedicated_cluster_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dedicated_cluster_id")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["EventhubNamespaceIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def maximum_throughput_units(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_throughput_units")
        return result

    @builtins.property
    def network_rulesets(
        self,
    ) -> typing.Optional[typing.List["EventhubNamespaceNetworkRulesets"]]:
        result = self._values.get("network_rulesets")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["EventhubNamespaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zone_redundant(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_redundant")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class EventhubNamespaceDisasterRecoveryConfig(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.EventhubNamespaceDisasterRecoveryConfig",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        partner_namespace_id: builtins.str,
        resource_group_name: builtins.str,
        alternate_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["EventhubNamespaceDisasterRecoveryConfigTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param partner_namespace_id: -
        :param resource_group_name: -
        :param alternate_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EventhubNamespaceDisasterRecoveryConfigConfig(
            name=name,
            namespace_name=namespace_name,
            partner_namespace_id=partner_namespace_id,
            resource_group_name=resource_group_name,
            alternate_name=alternate_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(EventhubNamespaceDisasterRecoveryConfig, self, [scope, id, config])

    @jsii.member(jsii_name="resetAlternateName")
    def reset_alternate_name(self) -> None:
        return jsii.invoke(self, "resetAlternateName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partnerNamespaceIdInput")
    def partner_namespace_id_input(self) -> builtins.str:
        return jsii.get(self, "partnerNamespaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alternateNameInput")
    def alternate_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "alternateNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["EventhubNamespaceDisasterRecoveryConfigTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alternateName")
    def alternate_name(self) -> builtins.str:
        return jsii.get(self, "alternateName")

    @alternate_name.setter # type: ignore
    def alternate_name(self, value: builtins.str) -> None:
        jsii.set(self, "alternateName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partnerNamespaceId")
    def partner_namespace_id(self) -> builtins.str:
        return jsii.get(self, "partnerNamespaceId")

    @partner_namespace_id.setter # type: ignore
    def partner_namespace_id(self, value: builtins.str) -> None:
        jsii.set(self, "partnerNamespaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "EventhubNamespaceDisasterRecoveryConfigTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "EventhubNamespaceDisasterRecoveryConfigTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceDisasterRecoveryConfigConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "partner_namespace_id": "partnerNamespaceId",
        "resource_group_name": "resourceGroupName",
        "alternate_name": "alternateName",
        "timeouts": "timeouts",
    },
)
class EventhubNamespaceDisasterRecoveryConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        partner_namespace_id: builtins.str,
        resource_group_name: builtins.str,
        alternate_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["EventhubNamespaceDisasterRecoveryConfigTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param partner_namespace_id: -
        :param resource_group_name: -
        :param alternate_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = EventhubNamespaceDisasterRecoveryConfigTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "partner_namespace_id": partner_namespace_id,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if alternate_name is not None:
            self._values["alternate_name"] = alternate_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def partner_namespace_id(self) -> builtins.str:
        result = self._values.get("partner_namespace_id")
        assert result is not None, "Required property 'partner_namespace_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def alternate_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("alternate_name")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["EventhubNamespaceDisasterRecoveryConfigTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceDisasterRecoveryConfigConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceDisasterRecoveryConfigTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventhubNamespaceDisasterRecoveryConfigTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceDisasterRecoveryConfigTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class EventhubNamespaceIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceNetworkRulesets",
    jsii_struct_bases=[],
    name_mapping={
        "default_action": "defaultAction",
        "ip_rule": "ipRule",
        "virtual_network_rule": "virtualNetworkRule",
    },
)
class EventhubNamespaceNetworkRulesets:
    def __init__(
        self,
        *,
        default_action: typing.Optional[builtins.str] = None,
        ip_rule: typing.Optional[typing.List["EventhubNamespaceNetworkRulesetsIpRule"]] = None,
        virtual_network_rule: typing.Optional[typing.List["EventhubNamespaceNetworkRulesetsVirtualNetworkRule"]] = None,
    ) -> None:
        """
        :param default_action: -
        :param ip_rule: -
        :param virtual_network_rule: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if default_action is not None:
            self._values["default_action"] = default_action
        if ip_rule is not None:
            self._values["ip_rule"] = ip_rule
        if virtual_network_rule is not None:
            self._values["virtual_network_rule"] = virtual_network_rule

    @builtins.property
    def default_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_action")
        return result

    @builtins.property
    def ip_rule(
        self,
    ) -> typing.Optional[typing.List["EventhubNamespaceNetworkRulesetsIpRule"]]:
        result = self._values.get("ip_rule")
        return result

    @builtins.property
    def virtual_network_rule(
        self,
    ) -> typing.Optional[typing.List["EventhubNamespaceNetworkRulesetsVirtualNetworkRule"]]:
        result = self._values.get("virtual_network_rule")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceNetworkRulesets(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceNetworkRulesetsIpRule",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "ip_mask": "ipMask"},
)
class EventhubNamespaceNetworkRulesetsIpRule:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_mask: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_mask: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_mask is not None:
            self._values["ip_mask"] = ip_mask

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_mask(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_mask")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceNetworkRulesetsIpRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceNetworkRulesetsVirtualNetworkRule",
    jsii_struct_bases=[],
    name_mapping={
        "ignore_missing_virtual_network_service_endpoint": "ignoreMissingVirtualNetworkServiceEndpoint",
        "subnet_id": "subnetId",
    },
)
class EventhubNamespaceNetworkRulesetsVirtualNetworkRule:
    def __init__(
        self,
        *,
        ignore_missing_virtual_network_service_endpoint: typing.Optional[builtins.bool] = None,
        subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param ignore_missing_virtual_network_service_endpoint: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ignore_missing_virtual_network_service_endpoint is not None:
            self._values["ignore_missing_virtual_network_service_endpoint"] = ignore_missing_virtual_network_service_endpoint
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id

    @builtins.property
    def ignore_missing_virtual_network_service_endpoint(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("ignore_missing_virtual_network_service_endpoint")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceNetworkRulesetsVirtualNetworkRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubNamespaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventhubNamespaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubNamespaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.EventhubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class EventhubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "EventhubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ExpressRouteCircuit(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ExpressRouteCircuit",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        bandwidth_in_mbps: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        peering_location: builtins.str,
        resource_group_name: builtins.str,
        service_provider_name: builtins.str,
        sku: typing.List["ExpressRouteCircuitSku"],
        allow_classic_operations: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ExpressRouteCircuitTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param bandwidth_in_mbps: -
        :param location: -
        :param name: -
        :param peering_location: -
        :param resource_group_name: -
        :param service_provider_name: -
        :param sku: sku block.
        :param allow_classic_operations: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ExpressRouteCircuitConfig(
            bandwidth_in_mbps=bandwidth_in_mbps,
            location=location,
            name=name,
            peering_location=peering_location,
            resource_group_name=resource_group_name,
            service_provider_name=service_provider_name,
            sku=sku,
            allow_classic_operations=allow_classic_operations,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ExpressRouteCircuit, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowClassicOperations")
    def reset_allow_classic_operations(self) -> None:
        return jsii.invoke(self, "resetAllowClassicOperations", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bandwidthInMbpsInput")
    def bandwidth_in_mbps_input(self) -> jsii.Number:
        return jsii.get(self, "bandwidthInMbpsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peeringLocationInput")
    def peering_location_input(self) -> builtins.str:
        return jsii.get(self, "peeringLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceKey")
    def service_key(self) -> builtins.str:
        return jsii.get(self, "serviceKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceProviderNameInput")
    def service_provider_name_input(self) -> builtins.str:
        return jsii.get(self, "serviceProviderNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceProviderProvisioningState")
    def service_provider_provisioning_state(self) -> builtins.str:
        return jsii.get(self, "serviceProviderProvisioningState")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["ExpressRouteCircuitSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowClassicOperationsInput")
    def allow_classic_operations_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowClassicOperationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ExpressRouteCircuitTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowClassicOperations")
    def allow_classic_operations(self) -> builtins.bool:
        return jsii.get(self, "allowClassicOperations")

    @allow_classic_operations.setter # type: ignore
    def allow_classic_operations(self, value: builtins.bool) -> None:
        jsii.set(self, "allowClassicOperations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bandwidthInMbps")
    def bandwidth_in_mbps(self) -> jsii.Number:
        return jsii.get(self, "bandwidthInMbps")

    @bandwidth_in_mbps.setter # type: ignore
    def bandwidth_in_mbps(self, value: jsii.Number) -> None:
        jsii.set(self, "bandwidthInMbps", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peeringLocation")
    def peering_location(self) -> builtins.str:
        return jsii.get(self, "peeringLocation")

    @peering_location.setter # type: ignore
    def peering_location(self, value: builtins.str) -> None:
        jsii.set(self, "peeringLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceProviderName")
    def service_provider_name(self) -> builtins.str:
        return jsii.get(self, "serviceProviderName")

    @service_provider_name.setter # type: ignore
    def service_provider_name(self, value: builtins.str) -> None:
        jsii.set(self, "serviceProviderName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["ExpressRouteCircuitSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["ExpressRouteCircuitSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ExpressRouteCircuitTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ExpressRouteCircuitTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class ExpressRouteCircuitAuthorization(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ExpressRouteCircuitAuthorization",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        express_route_circuit_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ExpressRouteCircuitAuthorizationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param express_route_circuit_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ExpressRouteCircuitAuthorizationConfig(
            express_route_circuit_name=express_route_circuit_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ExpressRouteCircuitAuthorization, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationKey")
    def authorization_key(self) -> builtins.str:
        return jsii.get(self, "authorizationKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationUseStatus")
    def authorization_use_status(self) -> builtins.str:
        return jsii.get(self, "authorizationUseStatus")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteCircuitNameInput")
    def express_route_circuit_name_input(self) -> builtins.str:
        return jsii.get(self, "expressRouteCircuitNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ExpressRouteCircuitAuthorizationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteCircuitName")
    def express_route_circuit_name(self) -> builtins.str:
        return jsii.get(self, "expressRouteCircuitName")

    @express_route_circuit_name.setter # type: ignore
    def express_route_circuit_name(self, value: builtins.str) -> None:
        jsii.set(self, "expressRouteCircuitName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ExpressRouteCircuitAuthorizationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ExpressRouteCircuitAuthorizationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitAuthorizationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "express_route_circuit_name": "expressRouteCircuitName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class ExpressRouteCircuitAuthorizationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        express_route_circuit_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["ExpressRouteCircuitAuthorizationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param express_route_circuit_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ExpressRouteCircuitAuthorizationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "express_route_circuit_name": express_route_circuit_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def express_route_circuit_name(self) -> builtins.str:
        result = self._values.get("express_route_circuit_name")
        assert result is not None, "Required property 'express_route_circuit_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ExpressRouteCircuitAuthorizationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitAuthorizationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitAuthorizationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ExpressRouteCircuitAuthorizationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitAuthorizationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "bandwidth_in_mbps": "bandwidthInMbps",
        "location": "location",
        "name": "name",
        "peering_location": "peeringLocation",
        "resource_group_name": "resourceGroupName",
        "service_provider_name": "serviceProviderName",
        "sku": "sku",
        "allow_classic_operations": "allowClassicOperations",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ExpressRouteCircuitConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        bandwidth_in_mbps: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        peering_location: builtins.str,
        resource_group_name: builtins.str,
        service_provider_name: builtins.str,
        sku: typing.List["ExpressRouteCircuitSku"],
        allow_classic_operations: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ExpressRouteCircuitTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bandwidth_in_mbps: -
        :param location: -
        :param name: -
        :param peering_location: -
        :param resource_group_name: -
        :param service_provider_name: -
        :param sku: sku block.
        :param allow_classic_operations: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ExpressRouteCircuitTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "bandwidth_in_mbps": bandwidth_in_mbps,
            "location": location,
            "name": name,
            "peering_location": peering_location,
            "resource_group_name": resource_group_name,
            "service_provider_name": service_provider_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allow_classic_operations is not None:
            self._values["allow_classic_operations"] = allow_classic_operations
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def bandwidth_in_mbps(self) -> jsii.Number:
        result = self._values.get("bandwidth_in_mbps")
        assert result is not None, "Required property 'bandwidth_in_mbps' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def peering_location(self) -> builtins.str:
        result = self._values.get("peering_location")
        assert result is not None, "Required property 'peering_location' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_provider_name(self) -> builtins.str:
        result = self._values.get("service_provider_name")
        assert result is not None, "Required property 'service_provider_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["ExpressRouteCircuitSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def allow_classic_operations(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_classic_operations")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ExpressRouteCircuitTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ExpressRouteCircuitPeering(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ExpressRouteCircuitPeering",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        express_route_circuit_name: builtins.str,
        peering_type: builtins.str,
        primary_peer_address_prefix: builtins.str,
        resource_group_name: builtins.str,
        secondary_peer_address_prefix: builtins.str,
        vlan_id: jsii.Number,
        ipv6: typing.Optional[typing.List["ExpressRouteCircuitPeeringIpv6"]] = None,
        microsoft_peering_config: typing.Optional[typing.List["ExpressRouteCircuitPeeringMicrosoftPeeringConfig"]] = None,
        peer_asn: typing.Optional[jsii.Number] = None,
        route_filter_id: typing.Optional[builtins.str] = None,
        shared_key: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ExpressRouteCircuitPeeringTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param express_route_circuit_name: -
        :param peering_type: -
        :param primary_peer_address_prefix: -
        :param resource_group_name: -
        :param secondary_peer_address_prefix: -
        :param vlan_id: -
        :param ipv6: ipv6 block.
        :param microsoft_peering_config: microsoft_peering_config block.
        :param peer_asn: -
        :param route_filter_id: -
        :param shared_key: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ExpressRouteCircuitPeeringConfig(
            express_route_circuit_name=express_route_circuit_name,
            peering_type=peering_type,
            primary_peer_address_prefix=primary_peer_address_prefix,
            resource_group_name=resource_group_name,
            secondary_peer_address_prefix=secondary_peer_address_prefix,
            vlan_id=vlan_id,
            ipv6=ipv6,
            microsoft_peering_config=microsoft_peering_config,
            peer_asn=peer_asn,
            route_filter_id=route_filter_id,
            shared_key=shared_key,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ExpressRouteCircuitPeering, self, [scope, id, config])

    @jsii.member(jsii_name="resetIpv6")
    def reset_ipv6(self) -> None:
        return jsii.invoke(self, "resetIpv6", [])

    @jsii.member(jsii_name="resetMicrosoftPeeringConfig")
    def reset_microsoft_peering_config(self) -> None:
        return jsii.invoke(self, "resetMicrosoftPeeringConfig", [])

    @jsii.member(jsii_name="resetPeerAsn")
    def reset_peer_asn(self) -> None:
        return jsii.invoke(self, "resetPeerAsn", [])

    @jsii.member(jsii_name="resetRouteFilterId")
    def reset_route_filter_id(self) -> None:
        return jsii.invoke(self, "resetRouteFilterId", [])

    @jsii.member(jsii_name="resetSharedKey")
    def reset_shared_key(self) -> None:
        return jsii.invoke(self, "resetSharedKey", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureAsn")
    def azure_asn(self) -> jsii.Number:
        return jsii.get(self, "azureAsn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteCircuitNameInput")
    def express_route_circuit_name_input(self) -> builtins.str:
        return jsii.get(self, "expressRouteCircuitNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peeringTypeInput")
    def peering_type_input(self) -> builtins.str:
        return jsii.get(self, "peeringTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAzurePort")
    def primary_azure_port(self) -> builtins.str:
        return jsii.get(self, "primaryAzurePort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryPeerAddressPrefixInput")
    def primary_peer_address_prefix_input(self) -> builtins.str:
        return jsii.get(self, "primaryPeerAddressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAzurePort")
    def secondary_azure_port(self) -> builtins.str:
        return jsii.get(self, "secondaryAzurePort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryPeerAddressPrefixInput")
    def secondary_peer_address_prefix_input(self) -> builtins.str:
        return jsii.get(self, "secondaryPeerAddressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vlanIdInput")
    def vlan_id_input(self) -> jsii.Number:
        return jsii.get(self, "vlanIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipv6Input")
    def ipv6_input(
        self,
    ) -> typing.Optional[typing.List["ExpressRouteCircuitPeeringIpv6"]]:
        return jsii.get(self, "ipv6Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="microsoftPeeringConfigInput")
    def microsoft_peering_config_input(
        self,
    ) -> typing.Optional[typing.List["ExpressRouteCircuitPeeringMicrosoftPeeringConfig"]]:
        return jsii.get(self, "microsoftPeeringConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerAsnInput")
    def peer_asn_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "peerAsnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeFilterIdInput")
    def route_filter_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "routeFilterIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedKeyInput")
    def shared_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sharedKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ExpressRouteCircuitPeeringTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteCircuitName")
    def express_route_circuit_name(self) -> builtins.str:
        return jsii.get(self, "expressRouteCircuitName")

    @express_route_circuit_name.setter # type: ignore
    def express_route_circuit_name(self, value: builtins.str) -> None:
        jsii.set(self, "expressRouteCircuitName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipv6")
    def ipv6(self) -> typing.List["ExpressRouteCircuitPeeringIpv6"]:
        return jsii.get(self, "ipv6")

    @ipv6.setter # type: ignore
    def ipv6(self, value: typing.List["ExpressRouteCircuitPeeringIpv6"]) -> None:
        jsii.set(self, "ipv6", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="microsoftPeeringConfig")
    def microsoft_peering_config(
        self,
    ) -> typing.List["ExpressRouteCircuitPeeringMicrosoftPeeringConfig"]:
        return jsii.get(self, "microsoftPeeringConfig")

    @microsoft_peering_config.setter # type: ignore
    def microsoft_peering_config(
        self,
        value: typing.List["ExpressRouteCircuitPeeringMicrosoftPeeringConfig"],
    ) -> None:
        jsii.set(self, "microsoftPeeringConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerAsn")
    def peer_asn(self) -> jsii.Number:
        return jsii.get(self, "peerAsn")

    @peer_asn.setter # type: ignore
    def peer_asn(self, value: jsii.Number) -> None:
        jsii.set(self, "peerAsn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peeringType")
    def peering_type(self) -> builtins.str:
        return jsii.get(self, "peeringType")

    @peering_type.setter # type: ignore
    def peering_type(self, value: builtins.str) -> None:
        jsii.set(self, "peeringType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryPeerAddressPrefix")
    def primary_peer_address_prefix(self) -> builtins.str:
        return jsii.get(self, "primaryPeerAddressPrefix")

    @primary_peer_address_prefix.setter # type: ignore
    def primary_peer_address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "primaryPeerAddressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeFilterId")
    def route_filter_id(self) -> builtins.str:
        return jsii.get(self, "routeFilterId")

    @route_filter_id.setter # type: ignore
    def route_filter_id(self, value: builtins.str) -> None:
        jsii.set(self, "routeFilterId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryPeerAddressPrefix")
    def secondary_peer_address_prefix(self) -> builtins.str:
        return jsii.get(self, "secondaryPeerAddressPrefix")

    @secondary_peer_address_prefix.setter # type: ignore
    def secondary_peer_address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "secondaryPeerAddressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedKey")
    def shared_key(self) -> builtins.str:
        return jsii.get(self, "sharedKey")

    @shared_key.setter # type: ignore
    def shared_key(self, value: builtins.str) -> None:
        jsii.set(self, "sharedKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ExpressRouteCircuitPeeringTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ExpressRouteCircuitPeeringTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vlanId")
    def vlan_id(self) -> jsii.Number:
        return jsii.get(self, "vlanId")

    @vlan_id.setter # type: ignore
    def vlan_id(self, value: jsii.Number) -> None:
        jsii.set(self, "vlanId", value)


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitPeeringConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "express_route_circuit_name": "expressRouteCircuitName",
        "peering_type": "peeringType",
        "primary_peer_address_prefix": "primaryPeerAddressPrefix",
        "resource_group_name": "resourceGroupName",
        "secondary_peer_address_prefix": "secondaryPeerAddressPrefix",
        "vlan_id": "vlanId",
        "ipv6": "ipv6",
        "microsoft_peering_config": "microsoftPeeringConfig",
        "peer_asn": "peerAsn",
        "route_filter_id": "routeFilterId",
        "shared_key": "sharedKey",
        "timeouts": "timeouts",
    },
)
class ExpressRouteCircuitPeeringConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        express_route_circuit_name: builtins.str,
        peering_type: builtins.str,
        primary_peer_address_prefix: builtins.str,
        resource_group_name: builtins.str,
        secondary_peer_address_prefix: builtins.str,
        vlan_id: jsii.Number,
        ipv6: typing.Optional[typing.List["ExpressRouteCircuitPeeringIpv6"]] = None,
        microsoft_peering_config: typing.Optional[typing.List["ExpressRouteCircuitPeeringMicrosoftPeeringConfig"]] = None,
        peer_asn: typing.Optional[jsii.Number] = None,
        route_filter_id: typing.Optional[builtins.str] = None,
        shared_key: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ExpressRouteCircuitPeeringTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param express_route_circuit_name: -
        :param peering_type: -
        :param primary_peer_address_prefix: -
        :param resource_group_name: -
        :param secondary_peer_address_prefix: -
        :param vlan_id: -
        :param ipv6: ipv6 block.
        :param microsoft_peering_config: microsoft_peering_config block.
        :param peer_asn: -
        :param route_filter_id: -
        :param shared_key: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ExpressRouteCircuitPeeringTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "express_route_circuit_name": express_route_circuit_name,
            "peering_type": peering_type,
            "primary_peer_address_prefix": primary_peer_address_prefix,
            "resource_group_name": resource_group_name,
            "secondary_peer_address_prefix": secondary_peer_address_prefix,
            "vlan_id": vlan_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if ipv6 is not None:
            self._values["ipv6"] = ipv6
        if microsoft_peering_config is not None:
            self._values["microsoft_peering_config"] = microsoft_peering_config
        if peer_asn is not None:
            self._values["peer_asn"] = peer_asn
        if route_filter_id is not None:
            self._values["route_filter_id"] = route_filter_id
        if shared_key is not None:
            self._values["shared_key"] = shared_key
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def express_route_circuit_name(self) -> builtins.str:
        result = self._values.get("express_route_circuit_name")
        assert result is not None, "Required property 'express_route_circuit_name' is missing"
        return result

    @builtins.property
    def peering_type(self) -> builtins.str:
        result = self._values.get("peering_type")
        assert result is not None, "Required property 'peering_type' is missing"
        return result

    @builtins.property
    def primary_peer_address_prefix(self) -> builtins.str:
        result = self._values.get("primary_peer_address_prefix")
        assert result is not None, "Required property 'primary_peer_address_prefix' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def secondary_peer_address_prefix(self) -> builtins.str:
        result = self._values.get("secondary_peer_address_prefix")
        assert result is not None, "Required property 'secondary_peer_address_prefix' is missing"
        return result

    @builtins.property
    def vlan_id(self) -> jsii.Number:
        result = self._values.get("vlan_id")
        assert result is not None, "Required property 'vlan_id' is missing"
        return result

    @builtins.property
    def ipv6(self) -> typing.Optional[typing.List["ExpressRouteCircuitPeeringIpv6"]]:
        """ipv6 block."""
        result = self._values.get("ipv6")
        return result

    @builtins.property
    def microsoft_peering_config(
        self,
    ) -> typing.Optional[typing.List["ExpressRouteCircuitPeeringMicrosoftPeeringConfig"]]:
        """microsoft_peering_config block."""
        result = self._values.get("microsoft_peering_config")
        return result

    @builtins.property
    def peer_asn(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("peer_asn")
        return result

    @builtins.property
    def route_filter_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("route_filter_id")
        return result

    @builtins.property
    def shared_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("shared_key")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ExpressRouteCircuitPeeringTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitPeeringConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitPeeringIpv6",
    jsii_struct_bases=[],
    name_mapping={
        "microsoft_peering": "microsoftPeering",
        "primary_peer_address_prefix": "primaryPeerAddressPrefix",
        "secondary_peer_address_prefix": "secondaryPeerAddressPrefix",
        "route_filter_id": "routeFilterId",
    },
)
class ExpressRouteCircuitPeeringIpv6:
    def __init__(
        self,
        *,
        microsoft_peering: typing.List["ExpressRouteCircuitPeeringIpv6MicrosoftPeering"],
        primary_peer_address_prefix: builtins.str,
        secondary_peer_address_prefix: builtins.str,
        route_filter_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param microsoft_peering: microsoft_peering block.
        :param primary_peer_address_prefix: -
        :param secondary_peer_address_prefix: -
        :param route_filter_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "microsoft_peering": microsoft_peering,
            "primary_peer_address_prefix": primary_peer_address_prefix,
            "secondary_peer_address_prefix": secondary_peer_address_prefix,
        }
        if route_filter_id is not None:
            self._values["route_filter_id"] = route_filter_id

    @builtins.property
    def microsoft_peering(
        self,
    ) -> typing.List["ExpressRouteCircuitPeeringIpv6MicrosoftPeering"]:
        """microsoft_peering block."""
        result = self._values.get("microsoft_peering")
        assert result is not None, "Required property 'microsoft_peering' is missing"
        return result

    @builtins.property
    def primary_peer_address_prefix(self) -> builtins.str:
        result = self._values.get("primary_peer_address_prefix")
        assert result is not None, "Required property 'primary_peer_address_prefix' is missing"
        return result

    @builtins.property
    def secondary_peer_address_prefix(self) -> builtins.str:
        result = self._values.get("secondary_peer_address_prefix")
        assert result is not None, "Required property 'secondary_peer_address_prefix' is missing"
        return result

    @builtins.property
    def route_filter_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("route_filter_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitPeeringIpv6(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitPeeringIpv6MicrosoftPeering",
    jsii_struct_bases=[],
    name_mapping={
        "advertised_public_prefixes": "advertisedPublicPrefixes",
        "customer_asn": "customerAsn",
        "routing_registry_name": "routingRegistryName",
    },
)
class ExpressRouteCircuitPeeringIpv6MicrosoftPeering:
    def __init__(
        self,
        *,
        advertised_public_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        customer_asn: typing.Optional[jsii.Number] = None,
        routing_registry_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param advertised_public_prefixes: -
        :param customer_asn: -
        :param routing_registry_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if advertised_public_prefixes is not None:
            self._values["advertised_public_prefixes"] = advertised_public_prefixes
        if customer_asn is not None:
            self._values["customer_asn"] = customer_asn
        if routing_registry_name is not None:
            self._values["routing_registry_name"] = routing_registry_name

    @builtins.property
    def advertised_public_prefixes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("advertised_public_prefixes")
        return result

    @builtins.property
    def customer_asn(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("customer_asn")
        return result

    @builtins.property
    def routing_registry_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("routing_registry_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitPeeringIpv6MicrosoftPeering(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitPeeringMicrosoftPeeringConfig",
    jsii_struct_bases=[],
    name_mapping={
        "advertised_public_prefixes": "advertisedPublicPrefixes",
        "customer_asn": "customerAsn",
        "routing_registry_name": "routingRegistryName",
    },
)
class ExpressRouteCircuitPeeringMicrosoftPeeringConfig:
    def __init__(
        self,
        *,
        advertised_public_prefixes: typing.List[builtins.str],
        customer_asn: typing.Optional[jsii.Number] = None,
        routing_registry_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param advertised_public_prefixes: -
        :param customer_asn: -
        :param routing_registry_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "advertised_public_prefixes": advertised_public_prefixes,
        }
        if customer_asn is not None:
            self._values["customer_asn"] = customer_asn
        if routing_registry_name is not None:
            self._values["routing_registry_name"] = routing_registry_name

    @builtins.property
    def advertised_public_prefixes(self) -> typing.List[builtins.str]:
        result = self._values.get("advertised_public_prefixes")
        assert result is not None, "Required property 'advertised_public_prefixes' is missing"
        return result

    @builtins.property
    def customer_asn(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("customer_asn")
        return result

    @builtins.property
    def routing_registry_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("routing_registry_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitPeeringMicrosoftPeeringConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitPeeringTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ExpressRouteCircuitPeeringTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitPeeringTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitSku",
    jsii_struct_bases=[],
    name_mapping={"family": "family", "tier": "tier"},
)
class ExpressRouteCircuitSku:
    def __init__(self, *, family: builtins.str, tier: builtins.str) -> None:
        """
        :param family: -
        :param tier: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "family": family,
            "tier": tier,
        }

    @builtins.property
    def family(self) -> builtins.str:
        result = self._values.get("family")
        assert result is not None, "Required property 'family' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteCircuitTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ExpressRouteCircuitTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteCircuitTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ExpressRouteGateway(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ExpressRouteGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scale_units: jsii.Number,
        virtual_hub_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ExpressRouteGatewayTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scale_units: -
        :param virtual_hub_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ExpressRouteGatewayConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            scale_units=scale_units,
            virtual_hub_id=virtual_hub_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ExpressRouteGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleUnitsInput")
    def scale_units_input(self) -> jsii.Number:
        return jsii.get(self, "scaleUnitsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ExpressRouteGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleUnits")
    def scale_units(self) -> jsii.Number:
        return jsii.get(self, "scaleUnits")

    @scale_units.setter # type: ignore
    def scale_units(self, value: jsii.Number) -> None:
        jsii.set(self, "scaleUnits", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ExpressRouteGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ExpressRouteGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "scale_units": "scaleUnits",
        "virtual_hub_id": "virtualHubId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ExpressRouteGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scale_units: jsii.Number,
        virtual_hub_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ExpressRouteGatewayTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scale_units: -
        :param virtual_hub_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ExpressRouteGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "scale_units": scale_units,
            "virtual_hub_id": virtual_hub_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def scale_units(self) -> jsii.Number:
        result = self._values.get("scale_units")
        assert result is not None, "Required property 'scale_units' is missing"
        return result

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ExpressRouteGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ExpressRouteGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ExpressRouteGatewayTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ExpressRouteGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Firewall(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Firewall",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        firewall_policy_id: typing.Optional[builtins.str] = None,
        ip_configuration: typing.Optional[typing.List["FirewallIpConfiguration"]] = None,
        management_ip_configuration: typing.Optional[typing.List["FirewallManagementIpConfiguration"]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        sku_tier: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_intel_mode: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["FirewallTimeouts"] = None,
        virtual_hub: typing.Optional[typing.List["FirewallVirtualHub"]] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param dns_servers: -
        :param firewall_policy_id: -
        :param ip_configuration: ip_configuration block.
        :param management_ip_configuration: management_ip_configuration block.
        :param sku_name: -
        :param sku_tier: -
        :param tags: -
        :param threat_intel_mode: -
        :param timeouts: timeouts block.
        :param virtual_hub: virtual_hub block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FirewallConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            dns_servers=dns_servers,
            firewall_policy_id=firewall_policy_id,
            ip_configuration=ip_configuration,
            management_ip_configuration=management_ip_configuration,
            sku_name=sku_name,
            sku_tier=sku_tier,
            tags=tags,
            threat_intel_mode=threat_intel_mode,
            timeouts=timeouts,
            virtual_hub=virtual_hub,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Firewall, self, [scope, id, config])

    @jsii.member(jsii_name="resetDnsServers")
    def reset_dns_servers(self) -> None:
        return jsii.invoke(self, "resetDnsServers", [])

    @jsii.member(jsii_name="resetFirewallPolicyId")
    def reset_firewall_policy_id(self) -> None:
        return jsii.invoke(self, "resetFirewallPolicyId", [])

    @jsii.member(jsii_name="resetIpConfiguration")
    def reset_ip_configuration(self) -> None:
        return jsii.invoke(self, "resetIpConfiguration", [])

    @jsii.member(jsii_name="resetManagementIpConfiguration")
    def reset_management_ip_configuration(self) -> None:
        return jsii.invoke(self, "resetManagementIpConfiguration", [])

    @jsii.member(jsii_name="resetSkuName")
    def reset_sku_name(self) -> None:
        return jsii.invoke(self, "resetSkuName", [])

    @jsii.member(jsii_name="resetSkuTier")
    def reset_sku_tier(self) -> None:
        return jsii.invoke(self, "resetSkuTier", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetThreatIntelMode")
    def reset_threat_intel_mode(self) -> None:
        return jsii.invoke(self, "resetThreatIntelMode", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVirtualHub")
    def reset_virtual_hub(self) -> None:
        return jsii.invoke(self, "resetVirtualHub", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServersInput")
    def dns_servers_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "dnsServersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallPolicyIdInput")
    def firewall_policy_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "firewallPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationInput")
    def ip_configuration_input(
        self,
    ) -> typing.Optional[typing.List["FirewallIpConfiguration"]]:
        return jsii.get(self, "ipConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementIpConfigurationInput")
    def management_ip_configuration_input(
        self,
    ) -> typing.Optional[typing.List["FirewallManagementIpConfiguration"]]:
        return jsii.get(self, "managementIpConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuTierInput")
    def sku_tier_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuTierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelModeInput")
    def threat_intel_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "threatIntelModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["FirewallTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubInput")
    def virtual_hub_input(self) -> typing.Optional[typing.List["FirewallVirtualHub"]]:
        return jsii.get(self, "virtualHubInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServers")
    def dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsServers")

    @dns_servers.setter # type: ignore
    def dns_servers(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "dnsServers", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallPolicyId")
    def firewall_policy_id(self) -> builtins.str:
        return jsii.get(self, "firewallPolicyId")

    @firewall_policy_id.setter # type: ignore
    def firewall_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "firewallPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(self) -> typing.List["FirewallIpConfiguration"]:
        return jsii.get(self, "ipConfiguration")

    @ip_configuration.setter # type: ignore
    def ip_configuration(self, value: typing.List["FirewallIpConfiguration"]) -> None:
        jsii.set(self, "ipConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementIpConfiguration")
    def management_ip_configuration(
        self,
    ) -> typing.List["FirewallManagementIpConfiguration"]:
        return jsii.get(self, "managementIpConfiguration")

    @management_ip_configuration.setter # type: ignore
    def management_ip_configuration(
        self,
        value: typing.List["FirewallManagementIpConfiguration"],
    ) -> None:
        jsii.set(self, "managementIpConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuTier")
    def sku_tier(self) -> builtins.str:
        return jsii.get(self, "skuTier")

    @sku_tier.setter # type: ignore
    def sku_tier(self, value: builtins.str) -> None:
        jsii.set(self, "skuTier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelMode")
    def threat_intel_mode(self) -> builtins.str:
        return jsii.get(self, "threatIntelMode")

    @threat_intel_mode.setter # type: ignore
    def threat_intel_mode(self, value: builtins.str) -> None:
        jsii.set(self, "threatIntelMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FirewallTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FirewallTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHub")
    def virtual_hub(self) -> typing.List["FirewallVirtualHub"]:
        return jsii.get(self, "virtualHub")

    @virtual_hub.setter # type: ignore
    def virtual_hub(self, value: typing.List["FirewallVirtualHub"]) -> None:
        jsii.set(self, "virtualHub", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


class FirewallApplicationRuleCollection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FirewallApplicationRuleCollection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        action: builtins.str,
        azure_firewall_name: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        resource_group_name: builtins.str,
        rule: typing.List["FirewallApplicationRuleCollectionRule"],
        timeouts: typing.Optional["FirewallApplicationRuleCollectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param action: -
        :param azure_firewall_name: -
        :param name: -
        :param priority: -
        :param resource_group_name: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FirewallApplicationRuleCollectionConfig(
            action=action,
            azure_firewall_name=azure_firewall_name,
            name=name,
            priority=priority,
            resource_group_name=resource_group_name,
            rule=rule,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FirewallApplicationRuleCollection, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> builtins.str:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFirewallNameInput")
    def azure_firewall_name_input(self) -> builtins.str:
        return jsii.get(self, "azureFirewallNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> jsii.Number:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleInput")
    def rule_input(self) -> typing.List["FirewallApplicationRuleCollectionRule"]:
        return jsii.get(self, "ruleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["FirewallApplicationRuleCollectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: builtins.str) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFirewallName")
    def azure_firewall_name(self) -> builtins.str:
        return jsii.get(self, "azureFirewallName")

    @azure_firewall_name.setter # type: ignore
    def azure_firewall_name(self, value: builtins.str) -> None:
        jsii.set(self, "azureFirewallName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: jsii.Number) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rule")
    def rule(self) -> typing.List["FirewallApplicationRuleCollectionRule"]:
        return jsii.get(self, "rule")

    @rule.setter # type: ignore
    def rule(self, value: typing.List["FirewallApplicationRuleCollectionRule"]) -> None:
        jsii.set(self, "rule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FirewallApplicationRuleCollectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FirewallApplicationRuleCollectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FirewallApplicationRuleCollectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "action": "action",
        "azure_firewall_name": "azureFirewallName",
        "name": "name",
        "priority": "priority",
        "resource_group_name": "resourceGroupName",
        "rule": "rule",
        "timeouts": "timeouts",
    },
)
class FirewallApplicationRuleCollectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        action: builtins.str,
        azure_firewall_name: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        resource_group_name: builtins.str,
        rule: typing.List["FirewallApplicationRuleCollectionRule"],
        timeouts: typing.Optional["FirewallApplicationRuleCollectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action: -
        :param azure_firewall_name: -
        :param name: -
        :param priority: -
        :param resource_group_name: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FirewallApplicationRuleCollectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "azure_firewall_name": azure_firewall_name,
            "name": name,
            "priority": priority,
            "resource_group_name": resource_group_name,
            "rule": rule,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def azure_firewall_name(self) -> builtins.str:
        result = self._values.get("azure_firewall_name")
        assert result is not None, "Required property 'azure_firewall_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def rule(self) -> typing.List["FirewallApplicationRuleCollectionRule"]:
        """rule block."""
        result = self._values.get("rule")
        assert result is not None, "Required property 'rule' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FirewallApplicationRuleCollectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallApplicationRuleCollectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallApplicationRuleCollectionRule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "description": "description",
        "fqdn_tags": "fqdnTags",
        "protocol": "protocol",
        "source_addresses": "sourceAddresses",
        "source_ip_groups": "sourceIpGroups",
        "target_fqdns": "targetFqdns",
    },
)
class FirewallApplicationRuleCollectionRule:
    def __init__(
        self,
        *,
        name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        fqdn_tags: typing.Optional[typing.List[builtins.str]] = None,
        protocol: typing.Optional[typing.List["FirewallApplicationRuleCollectionRuleProtocol"]] = None,
        source_addresses: typing.Optional[typing.List[builtins.str]] = None,
        source_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
        target_fqdns: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param description: -
        :param fqdn_tags: -
        :param protocol: protocol block.
        :param source_addresses: -
        :param source_ip_groups: -
        :param target_fqdns: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if description is not None:
            self._values["description"] = description
        if fqdn_tags is not None:
            self._values["fqdn_tags"] = fqdn_tags
        if protocol is not None:
            self._values["protocol"] = protocol
        if source_addresses is not None:
            self._values["source_addresses"] = source_addresses
        if source_ip_groups is not None:
            self._values["source_ip_groups"] = source_ip_groups
        if target_fqdns is not None:
            self._values["target_fqdns"] = target_fqdns

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def fqdn_tags(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("fqdn_tags")
        return result

    @builtins.property
    def protocol(
        self,
    ) -> typing.Optional[typing.List["FirewallApplicationRuleCollectionRuleProtocol"]]:
        """protocol block."""
        result = self._values.get("protocol")
        return result

    @builtins.property
    def source_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_addresses")
        return result

    @builtins.property
    def source_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_ip_groups")
        return result

    @builtins.property
    def target_fqdns(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("target_fqdns")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallApplicationRuleCollectionRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallApplicationRuleCollectionRuleProtocol",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "port": "port"},
)
class FirewallApplicationRuleCollectionRuleProtocol:
    def __init__(
        self,
        *,
        type: builtins.str,
        port: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param type: -
        :param port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if port is not None:
            self._values["port"] = port

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallApplicationRuleCollectionRuleProtocol(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallApplicationRuleCollectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FirewallApplicationRuleCollectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallApplicationRuleCollectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "dns_servers": "dnsServers",
        "firewall_policy_id": "firewallPolicyId",
        "ip_configuration": "ipConfiguration",
        "management_ip_configuration": "managementIpConfiguration",
        "sku_name": "skuName",
        "sku_tier": "skuTier",
        "tags": "tags",
        "threat_intel_mode": "threatIntelMode",
        "timeouts": "timeouts",
        "virtual_hub": "virtualHub",
        "zones": "zones",
    },
)
class FirewallConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        firewall_policy_id: typing.Optional[builtins.str] = None,
        ip_configuration: typing.Optional[typing.List["FirewallIpConfiguration"]] = None,
        management_ip_configuration: typing.Optional[typing.List["FirewallManagementIpConfiguration"]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        sku_tier: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_intel_mode: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["FirewallTimeouts"] = None,
        virtual_hub: typing.Optional[typing.List["FirewallVirtualHub"]] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param dns_servers: -
        :param firewall_policy_id: -
        :param ip_configuration: ip_configuration block.
        :param management_ip_configuration: management_ip_configuration block.
        :param sku_name: -
        :param sku_tier: -
        :param tags: -
        :param threat_intel_mode: -
        :param timeouts: timeouts block.
        :param virtual_hub: virtual_hub block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FirewallTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if dns_servers is not None:
            self._values["dns_servers"] = dns_servers
        if firewall_policy_id is not None:
            self._values["firewall_policy_id"] = firewall_policy_id
        if ip_configuration is not None:
            self._values["ip_configuration"] = ip_configuration
        if management_ip_configuration is not None:
            self._values["management_ip_configuration"] = management_ip_configuration
        if sku_name is not None:
            self._values["sku_name"] = sku_name
        if sku_tier is not None:
            self._values["sku_tier"] = sku_tier
        if tags is not None:
            self._values["tags"] = tags
        if threat_intel_mode is not None:
            self._values["threat_intel_mode"] = threat_intel_mode
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if virtual_hub is not None:
            self._values["virtual_hub"] = virtual_hub
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def dns_servers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("dns_servers")
        return result

    @builtins.property
    def firewall_policy_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("firewall_policy_id")
        return result

    @builtins.property
    def ip_configuration(
        self,
    ) -> typing.Optional[typing.List["FirewallIpConfiguration"]]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        return result

    @builtins.property
    def management_ip_configuration(
        self,
    ) -> typing.Optional[typing.List["FirewallManagementIpConfiguration"]]:
        """management_ip_configuration block."""
        result = self._values.get("management_ip_configuration")
        return result

    @builtins.property
    def sku_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_name")
        return result

    @builtins.property
    def sku_tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_tier")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def threat_intel_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("threat_intel_mode")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FirewallTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def virtual_hub(self) -> typing.Optional[typing.List["FirewallVirtualHub"]]:
        """virtual_hub block."""
        result = self._values.get("virtual_hub")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "public_ip_address_id": "publicIpAddressId",
        "subnet_id": "subnetId",
    },
)
class FirewallIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        public_ip_address_id: builtins.str,
        subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param public_ip_address_id: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "public_ip_address_id": public_ip_address_id,
        }
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def public_ip_address_id(self) -> builtins.str:
        result = self._values.get("public_ip_address_id")
        assert result is not None, "Required property 'public_ip_address_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallManagementIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "public_ip_address_id": "publicIpAddressId",
        "subnet_id": "subnetId",
    },
)
class FirewallManagementIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        public_ip_address_id: builtins.str,
        subnet_id: builtins.str,
    ) -> None:
        """
        :param name: -
        :param public_ip_address_id: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "public_ip_address_id": public_ip_address_id,
            "subnet_id": subnet_id,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def public_ip_address_id(self) -> builtins.str:
        result = self._values.get("public_ip_address_id")
        assert result is not None, "Required property 'public_ip_address_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallManagementIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FirewallNatRuleCollection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FirewallNatRuleCollection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        action: builtins.str,
        azure_firewall_name: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        resource_group_name: builtins.str,
        rule: typing.List["FirewallNatRuleCollectionRule"],
        timeouts: typing.Optional["FirewallNatRuleCollectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param action: -
        :param azure_firewall_name: -
        :param name: -
        :param priority: -
        :param resource_group_name: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FirewallNatRuleCollectionConfig(
            action=action,
            azure_firewall_name=azure_firewall_name,
            name=name,
            priority=priority,
            resource_group_name=resource_group_name,
            rule=rule,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FirewallNatRuleCollection, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> builtins.str:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFirewallNameInput")
    def azure_firewall_name_input(self) -> builtins.str:
        return jsii.get(self, "azureFirewallNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> jsii.Number:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleInput")
    def rule_input(self) -> typing.List["FirewallNatRuleCollectionRule"]:
        return jsii.get(self, "ruleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["FirewallNatRuleCollectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: builtins.str) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFirewallName")
    def azure_firewall_name(self) -> builtins.str:
        return jsii.get(self, "azureFirewallName")

    @azure_firewall_name.setter # type: ignore
    def azure_firewall_name(self, value: builtins.str) -> None:
        jsii.set(self, "azureFirewallName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: jsii.Number) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rule")
    def rule(self) -> typing.List["FirewallNatRuleCollectionRule"]:
        return jsii.get(self, "rule")

    @rule.setter # type: ignore
    def rule(self, value: typing.List["FirewallNatRuleCollectionRule"]) -> None:
        jsii.set(self, "rule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FirewallNatRuleCollectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FirewallNatRuleCollectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FirewallNatRuleCollectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "action": "action",
        "azure_firewall_name": "azureFirewallName",
        "name": "name",
        "priority": "priority",
        "resource_group_name": "resourceGroupName",
        "rule": "rule",
        "timeouts": "timeouts",
    },
)
class FirewallNatRuleCollectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        action: builtins.str,
        azure_firewall_name: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        resource_group_name: builtins.str,
        rule: typing.List["FirewallNatRuleCollectionRule"],
        timeouts: typing.Optional["FirewallNatRuleCollectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action: -
        :param azure_firewall_name: -
        :param name: -
        :param priority: -
        :param resource_group_name: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FirewallNatRuleCollectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "azure_firewall_name": azure_firewall_name,
            "name": name,
            "priority": priority,
            "resource_group_name": resource_group_name,
            "rule": rule,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def azure_firewall_name(self) -> builtins.str:
        result = self._values.get("azure_firewall_name")
        assert result is not None, "Required property 'azure_firewall_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def rule(self) -> typing.List["FirewallNatRuleCollectionRule"]:
        """rule block."""
        result = self._values.get("rule")
        assert result is not None, "Required property 'rule' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FirewallNatRuleCollectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallNatRuleCollectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallNatRuleCollectionRule",
    jsii_struct_bases=[],
    name_mapping={
        "destination_addresses": "destinationAddresses",
        "destination_ports": "destinationPorts",
        "name": "name",
        "protocols": "protocols",
        "translated_address": "translatedAddress",
        "translated_port": "translatedPort",
        "description": "description",
        "source_addresses": "sourceAddresses",
        "source_ip_groups": "sourceIpGroups",
    },
)
class FirewallNatRuleCollectionRule:
    def __init__(
        self,
        *,
        destination_addresses: typing.List[builtins.str],
        destination_ports: typing.List[builtins.str],
        name: builtins.str,
        protocols: typing.List[builtins.str],
        translated_address: builtins.str,
        translated_port: builtins.str,
        description: typing.Optional[builtins.str] = None,
        source_addresses: typing.Optional[typing.List[builtins.str]] = None,
        source_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param destination_addresses: -
        :param destination_ports: -
        :param name: -
        :param protocols: -
        :param translated_address: -
        :param translated_port: -
        :param description: -
        :param source_addresses: -
        :param source_ip_groups: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destination_addresses": destination_addresses,
            "destination_ports": destination_ports,
            "name": name,
            "protocols": protocols,
            "translated_address": translated_address,
            "translated_port": translated_port,
        }
        if description is not None:
            self._values["description"] = description
        if source_addresses is not None:
            self._values["source_addresses"] = source_addresses
        if source_ip_groups is not None:
            self._values["source_ip_groups"] = source_ip_groups

    @builtins.property
    def destination_addresses(self) -> typing.List[builtins.str]:
        result = self._values.get("destination_addresses")
        assert result is not None, "Required property 'destination_addresses' is missing"
        return result

    @builtins.property
    def destination_ports(self) -> typing.List[builtins.str]:
        result = self._values.get("destination_ports")
        assert result is not None, "Required property 'destination_ports' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocols(self) -> typing.List[builtins.str]:
        result = self._values.get("protocols")
        assert result is not None, "Required property 'protocols' is missing"
        return result

    @builtins.property
    def translated_address(self) -> builtins.str:
        result = self._values.get("translated_address")
        assert result is not None, "Required property 'translated_address' is missing"
        return result

    @builtins.property
    def translated_port(self) -> builtins.str:
        result = self._values.get("translated_port")
        assert result is not None, "Required property 'translated_port' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def source_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_addresses")
        return result

    @builtins.property
    def source_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_ip_groups")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallNatRuleCollectionRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallNatRuleCollectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FirewallNatRuleCollectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallNatRuleCollectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FirewallNetworkRuleCollection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FirewallNetworkRuleCollection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        action: builtins.str,
        azure_firewall_name: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        resource_group_name: builtins.str,
        rule: typing.List["FirewallNetworkRuleCollectionRule"],
        timeouts: typing.Optional["FirewallNetworkRuleCollectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param action: -
        :param azure_firewall_name: -
        :param name: -
        :param priority: -
        :param resource_group_name: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FirewallNetworkRuleCollectionConfig(
            action=action,
            azure_firewall_name=azure_firewall_name,
            name=name,
            priority=priority,
            resource_group_name=resource_group_name,
            rule=rule,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FirewallNetworkRuleCollection, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> builtins.str:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFirewallNameInput")
    def azure_firewall_name_input(self) -> builtins.str:
        return jsii.get(self, "azureFirewallNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> jsii.Number:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleInput")
    def rule_input(self) -> typing.List["FirewallNetworkRuleCollectionRule"]:
        return jsii.get(self, "ruleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["FirewallNetworkRuleCollectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: builtins.str) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFirewallName")
    def azure_firewall_name(self) -> builtins.str:
        return jsii.get(self, "azureFirewallName")

    @azure_firewall_name.setter # type: ignore
    def azure_firewall_name(self, value: builtins.str) -> None:
        jsii.set(self, "azureFirewallName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: jsii.Number) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rule")
    def rule(self) -> typing.List["FirewallNetworkRuleCollectionRule"]:
        return jsii.get(self, "rule")

    @rule.setter # type: ignore
    def rule(self, value: typing.List["FirewallNetworkRuleCollectionRule"]) -> None:
        jsii.set(self, "rule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FirewallNetworkRuleCollectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FirewallNetworkRuleCollectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FirewallNetworkRuleCollectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "action": "action",
        "azure_firewall_name": "azureFirewallName",
        "name": "name",
        "priority": "priority",
        "resource_group_name": "resourceGroupName",
        "rule": "rule",
        "timeouts": "timeouts",
    },
)
class FirewallNetworkRuleCollectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        action: builtins.str,
        azure_firewall_name: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        resource_group_name: builtins.str,
        rule: typing.List["FirewallNetworkRuleCollectionRule"],
        timeouts: typing.Optional["FirewallNetworkRuleCollectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action: -
        :param azure_firewall_name: -
        :param name: -
        :param priority: -
        :param resource_group_name: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FirewallNetworkRuleCollectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "azure_firewall_name": azure_firewall_name,
            "name": name,
            "priority": priority,
            "resource_group_name": resource_group_name,
            "rule": rule,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def azure_firewall_name(self) -> builtins.str:
        result = self._values.get("azure_firewall_name")
        assert result is not None, "Required property 'azure_firewall_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def rule(self) -> typing.List["FirewallNetworkRuleCollectionRule"]:
        """rule block."""
        result = self._values.get("rule")
        assert result is not None, "Required property 'rule' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FirewallNetworkRuleCollectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallNetworkRuleCollectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallNetworkRuleCollectionRule",
    jsii_struct_bases=[],
    name_mapping={
        "destination_ports": "destinationPorts",
        "name": "name",
        "protocols": "protocols",
        "description": "description",
        "destination_addresses": "destinationAddresses",
        "destination_fqdns": "destinationFqdns",
        "destination_ip_groups": "destinationIpGroups",
        "source_addresses": "sourceAddresses",
        "source_ip_groups": "sourceIpGroups",
    },
)
class FirewallNetworkRuleCollectionRule:
    def __init__(
        self,
        *,
        destination_ports: typing.List[builtins.str],
        name: builtins.str,
        protocols: typing.List[builtins.str],
        description: typing.Optional[builtins.str] = None,
        destination_addresses: typing.Optional[typing.List[builtins.str]] = None,
        destination_fqdns: typing.Optional[typing.List[builtins.str]] = None,
        destination_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
        source_addresses: typing.Optional[typing.List[builtins.str]] = None,
        source_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param destination_ports: -
        :param name: -
        :param protocols: -
        :param description: -
        :param destination_addresses: -
        :param destination_fqdns: -
        :param destination_ip_groups: -
        :param source_addresses: -
        :param source_ip_groups: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destination_ports": destination_ports,
            "name": name,
            "protocols": protocols,
        }
        if description is not None:
            self._values["description"] = description
        if destination_addresses is not None:
            self._values["destination_addresses"] = destination_addresses
        if destination_fqdns is not None:
            self._values["destination_fqdns"] = destination_fqdns
        if destination_ip_groups is not None:
            self._values["destination_ip_groups"] = destination_ip_groups
        if source_addresses is not None:
            self._values["source_addresses"] = source_addresses
        if source_ip_groups is not None:
            self._values["source_ip_groups"] = source_ip_groups

    @builtins.property
    def destination_ports(self) -> typing.List[builtins.str]:
        result = self._values.get("destination_ports")
        assert result is not None, "Required property 'destination_ports' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocols(self) -> typing.List[builtins.str]:
        result = self._values.get("protocols")
        assert result is not None, "Required property 'protocols' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def destination_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_addresses")
        return result

    @builtins.property
    def destination_fqdns(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_fqdns")
        return result

    @builtins.property
    def destination_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_ip_groups")
        return result

    @builtins.property
    def source_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_addresses")
        return result

    @builtins.property
    def source_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_ip_groups")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallNetworkRuleCollectionRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallNetworkRuleCollectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FirewallNetworkRuleCollectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallNetworkRuleCollectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FirewallPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FirewallPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        base_policy_id: typing.Optional[builtins.str] = None,
        dns: typing.Optional[typing.List["FirewallPolicyDns"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_intelligence_allowlist: typing.Optional[typing.List["FirewallPolicyThreatIntelligenceAllowlist"]] = None,
        threat_intelligence_mode: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["FirewallPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param base_policy_id: -
        :param dns: dns block.
        :param tags: -
        :param threat_intelligence_allowlist: threat_intelligence_allowlist block.
        :param threat_intelligence_mode: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FirewallPolicyConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            base_policy_id=base_policy_id,
            dns=dns,
            tags=tags,
            threat_intelligence_allowlist=threat_intelligence_allowlist,
            threat_intelligence_mode=threat_intelligence_mode,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FirewallPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetBasePolicyId")
    def reset_base_policy_id(self) -> None:
        return jsii.invoke(self, "resetBasePolicyId", [])

    @jsii.member(jsii_name="resetDns")
    def reset_dns(self) -> None:
        return jsii.invoke(self, "resetDns", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetThreatIntelligenceAllowlist")
    def reset_threat_intelligence_allowlist(self) -> None:
        return jsii.invoke(self, "resetThreatIntelligenceAllowlist", [])

    @jsii.member(jsii_name="resetThreatIntelligenceMode")
    def reset_threat_intelligence_mode(self) -> None:
        return jsii.invoke(self, "resetThreatIntelligenceMode", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="childPolicies")
    def child_policies(self) -> typing.List[builtins.str]:
        return jsii.get(self, "childPolicies")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewalls")
    def firewalls(self) -> typing.List[builtins.str]:
        return jsii.get(self, "firewalls")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleCollectionGroups")
    def rule_collection_groups(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ruleCollectionGroups")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="basePolicyIdInput")
    def base_policy_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "basePolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsInput")
    def dns_input(self) -> typing.Optional[typing.List["FirewallPolicyDns"]]:
        return jsii.get(self, "dnsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelligenceAllowlistInput")
    def threat_intelligence_allowlist_input(
        self,
    ) -> typing.Optional[typing.List["FirewallPolicyThreatIntelligenceAllowlist"]]:
        return jsii.get(self, "threatIntelligenceAllowlistInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelligenceModeInput")
    def threat_intelligence_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "threatIntelligenceModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["FirewallPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="basePolicyId")
    def base_policy_id(self) -> builtins.str:
        return jsii.get(self, "basePolicyId")

    @base_policy_id.setter # type: ignore
    def base_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "basePolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dns")
    def dns(self) -> typing.List["FirewallPolicyDns"]:
        return jsii.get(self, "dns")

    @dns.setter # type: ignore
    def dns(self, value: typing.List["FirewallPolicyDns"]) -> None:
        jsii.set(self, "dns", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelligenceAllowlist")
    def threat_intelligence_allowlist(
        self,
    ) -> typing.List["FirewallPolicyThreatIntelligenceAllowlist"]:
        return jsii.get(self, "threatIntelligenceAllowlist")

    @threat_intelligence_allowlist.setter # type: ignore
    def threat_intelligence_allowlist(
        self,
        value: typing.List["FirewallPolicyThreatIntelligenceAllowlist"],
    ) -> None:
        jsii.set(self, "threatIntelligenceAllowlist", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatIntelligenceMode")
    def threat_intelligence_mode(self) -> builtins.str:
        return jsii.get(self, "threatIntelligenceMode")

    @threat_intelligence_mode.setter # type: ignore
    def threat_intelligence_mode(self, value: builtins.str) -> None:
        jsii.set(self, "threatIntelligenceMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FirewallPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FirewallPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "base_policy_id": "basePolicyId",
        "dns": "dns",
        "tags": "tags",
        "threat_intelligence_allowlist": "threatIntelligenceAllowlist",
        "threat_intelligence_mode": "threatIntelligenceMode",
        "timeouts": "timeouts",
    },
)
class FirewallPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        base_policy_id: typing.Optional[builtins.str] = None,
        dns: typing.Optional[typing.List["FirewallPolicyDns"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_intelligence_allowlist: typing.Optional[typing.List["FirewallPolicyThreatIntelligenceAllowlist"]] = None,
        threat_intelligence_mode: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["FirewallPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param base_policy_id: -
        :param dns: dns block.
        :param tags: -
        :param threat_intelligence_allowlist: threat_intelligence_allowlist block.
        :param threat_intelligence_mode: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FirewallPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if base_policy_id is not None:
            self._values["base_policy_id"] = base_policy_id
        if dns is not None:
            self._values["dns"] = dns
        if tags is not None:
            self._values["tags"] = tags
        if threat_intelligence_allowlist is not None:
            self._values["threat_intelligence_allowlist"] = threat_intelligence_allowlist
        if threat_intelligence_mode is not None:
            self._values["threat_intelligence_mode"] = threat_intelligence_mode
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def base_policy_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("base_policy_id")
        return result

    @builtins.property
    def dns(self) -> typing.Optional[typing.List["FirewallPolicyDns"]]:
        """dns block."""
        result = self._values.get("dns")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def threat_intelligence_allowlist(
        self,
    ) -> typing.Optional[typing.List["FirewallPolicyThreatIntelligenceAllowlist"]]:
        """threat_intelligence_allowlist block."""
        result = self._values.get("threat_intelligence_allowlist")
        return result

    @builtins.property
    def threat_intelligence_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("threat_intelligence_mode")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FirewallPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyDns",
    jsii_struct_bases=[],
    name_mapping={
        "network_rule_fqdn_enabled": "networkRuleFqdnEnabled",
        "proxy_enabled": "proxyEnabled",
        "servers": "servers",
    },
)
class FirewallPolicyDns:
    def __init__(
        self,
        *,
        network_rule_fqdn_enabled: typing.Optional[builtins.bool] = None,
        proxy_enabled: typing.Optional[builtins.bool] = None,
        servers: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param network_rule_fqdn_enabled: -
        :param proxy_enabled: -
        :param servers: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if network_rule_fqdn_enabled is not None:
            self._values["network_rule_fqdn_enabled"] = network_rule_fqdn_enabled
        if proxy_enabled is not None:
            self._values["proxy_enabled"] = proxy_enabled
        if servers is not None:
            self._values["servers"] = servers

    @builtins.property
    def network_rule_fqdn_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("network_rule_fqdn_enabled")
        return result

    @builtins.property
    def proxy_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("proxy_enabled")
        return result

    @builtins.property
    def servers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("servers")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyDns(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FirewallPolicyRuleCollectionGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        firewall_policy_id: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        application_rule_collection: typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollection"]] = None,
        nat_rule_collection: typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollection"]] = None,
        network_rule_collection: typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollection"]] = None,
        timeouts: typing.Optional["FirewallPolicyRuleCollectionGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param firewall_policy_id: -
        :param name: -
        :param priority: -
        :param application_rule_collection: application_rule_collection block.
        :param nat_rule_collection: nat_rule_collection block.
        :param network_rule_collection: network_rule_collection block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FirewallPolicyRuleCollectionGroupConfig(
            firewall_policy_id=firewall_policy_id,
            name=name,
            priority=priority,
            application_rule_collection=application_rule_collection,
            nat_rule_collection=nat_rule_collection,
            network_rule_collection=network_rule_collection,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FirewallPolicyRuleCollectionGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetApplicationRuleCollection")
    def reset_application_rule_collection(self) -> None:
        return jsii.invoke(self, "resetApplicationRuleCollection", [])

    @jsii.member(jsii_name="resetNatRuleCollection")
    def reset_nat_rule_collection(self) -> None:
        return jsii.invoke(self, "resetNatRuleCollection", [])

    @jsii.member(jsii_name="resetNetworkRuleCollection")
    def reset_network_rule_collection(self) -> None:
        return jsii.invoke(self, "resetNetworkRuleCollection", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallPolicyIdInput")
    def firewall_policy_id_input(self) -> builtins.str:
        return jsii.get(self, "firewallPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> jsii.Number:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationRuleCollectionInput")
    def application_rule_collection_input(
        self,
    ) -> typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollection"]]:
        return jsii.get(self, "applicationRuleCollectionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natRuleCollectionInput")
    def nat_rule_collection_input(
        self,
    ) -> typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollection"]]:
        return jsii.get(self, "natRuleCollectionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRuleCollectionInput")
    def network_rule_collection_input(
        self,
    ) -> typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollection"]]:
        return jsii.get(self, "networkRuleCollectionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["FirewallPolicyRuleCollectionGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationRuleCollection")
    def application_rule_collection(
        self,
    ) -> typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollection"]:
        return jsii.get(self, "applicationRuleCollection")

    @application_rule_collection.setter # type: ignore
    def application_rule_collection(
        self,
        value: typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollection"],
    ) -> None:
        jsii.set(self, "applicationRuleCollection", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="firewallPolicyId")
    def firewall_policy_id(self) -> builtins.str:
        return jsii.get(self, "firewallPolicyId")

    @firewall_policy_id.setter # type: ignore
    def firewall_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "firewallPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natRuleCollection")
    def nat_rule_collection(
        self,
    ) -> typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollection"]:
        return jsii.get(self, "natRuleCollection")

    @nat_rule_collection.setter # type: ignore
    def nat_rule_collection(
        self,
        value: typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollection"],
    ) -> None:
        jsii.set(self, "natRuleCollection", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRuleCollection")
    def network_rule_collection(
        self,
    ) -> typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollection"]:
        return jsii.get(self, "networkRuleCollection")

    @network_rule_collection.setter # type: ignore
    def network_rule_collection(
        self,
        value: typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollection"],
    ) -> None:
        jsii.set(self, "networkRuleCollection", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: jsii.Number) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FirewallPolicyRuleCollectionGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FirewallPolicyRuleCollectionGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupApplicationRuleCollection",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "name": "name",
        "priority": "priority",
        "rule": "rule",
    },
)
class FirewallPolicyRuleCollectionGroupApplicationRuleCollection:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        rule: typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRule"],
    ) -> None:
        """
        :param action: -
        :param name: -
        :param priority: -
        :param rule: rule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
            "priority": priority,
            "rule": rule,
        }

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def rule(
        self,
    ) -> typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRule"]:
        """rule block."""
        result = self._values.get("rule")
        assert result is not None, "Required property 'rule' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupApplicationRuleCollection(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "protocols": "protocols",
        "destination_fqdns": "destinationFqdns",
        "destination_fqdn_tags": "destinationFqdnTags",
        "source_addresses": "sourceAddresses",
        "source_ip_groups": "sourceIpGroups",
    },
)
class FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRule:
    def __init__(
        self,
        *,
        name: builtins.str,
        protocols: typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRuleProtocols"],
        destination_fqdns: typing.Optional[typing.List[builtins.str]] = None,
        destination_fqdn_tags: typing.Optional[typing.List[builtins.str]] = None,
        source_addresses: typing.Optional[typing.List[builtins.str]] = None,
        source_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param protocols: protocols block.
        :param destination_fqdns: -
        :param destination_fqdn_tags: -
        :param source_addresses: -
        :param source_ip_groups: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "protocols": protocols,
        }
        if destination_fqdns is not None:
            self._values["destination_fqdns"] = destination_fqdns
        if destination_fqdn_tags is not None:
            self._values["destination_fqdn_tags"] = destination_fqdn_tags
        if source_addresses is not None:
            self._values["source_addresses"] = source_addresses
        if source_ip_groups is not None:
            self._values["source_ip_groups"] = source_ip_groups

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocols(
        self,
    ) -> typing.List["FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRuleProtocols"]:
        """protocols block."""
        result = self._values.get("protocols")
        assert result is not None, "Required property 'protocols' is missing"
        return result

    @builtins.property
    def destination_fqdns(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_fqdns")
        return result

    @builtins.property
    def destination_fqdn_tags(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_fqdn_tags")
        return result

    @builtins.property
    def source_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_addresses")
        return result

    @builtins.property
    def source_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_ip_groups")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRuleProtocols",
    jsii_struct_bases=[],
    name_mapping={"port": "port", "type": "type"},
)
class FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRuleProtocols:
    def __init__(self, *, port: jsii.Number, type: builtins.str) -> None:
        """
        :param port: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "port": port,
            "type": type,
        }

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRuleProtocols(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "firewall_policy_id": "firewallPolicyId",
        "name": "name",
        "priority": "priority",
        "application_rule_collection": "applicationRuleCollection",
        "nat_rule_collection": "natRuleCollection",
        "network_rule_collection": "networkRuleCollection",
        "timeouts": "timeouts",
    },
)
class FirewallPolicyRuleCollectionGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        firewall_policy_id: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        application_rule_collection: typing.Optional[typing.List[FirewallPolicyRuleCollectionGroupApplicationRuleCollection]] = None,
        nat_rule_collection: typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollection"]] = None,
        network_rule_collection: typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollection"]] = None,
        timeouts: typing.Optional["FirewallPolicyRuleCollectionGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param firewall_policy_id: -
        :param name: -
        :param priority: -
        :param application_rule_collection: application_rule_collection block.
        :param nat_rule_collection: nat_rule_collection block.
        :param network_rule_collection: network_rule_collection block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FirewallPolicyRuleCollectionGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "firewall_policy_id": firewall_policy_id,
            "name": name,
            "priority": priority,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if application_rule_collection is not None:
            self._values["application_rule_collection"] = application_rule_collection
        if nat_rule_collection is not None:
            self._values["nat_rule_collection"] = nat_rule_collection
        if network_rule_collection is not None:
            self._values["network_rule_collection"] = network_rule_collection
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def firewall_policy_id(self) -> builtins.str:
        result = self._values.get("firewall_policy_id")
        assert result is not None, "Required property 'firewall_policy_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def application_rule_collection(
        self,
    ) -> typing.Optional[typing.List[FirewallPolicyRuleCollectionGroupApplicationRuleCollection]]:
        """application_rule_collection block."""
        result = self._values.get("application_rule_collection")
        return result

    @builtins.property
    def nat_rule_collection(
        self,
    ) -> typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollection"]]:
        """nat_rule_collection block."""
        result = self._values.get("nat_rule_collection")
        return result

    @builtins.property
    def network_rule_collection(
        self,
    ) -> typing.Optional[typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollection"]]:
        """network_rule_collection block."""
        result = self._values.get("network_rule_collection")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FirewallPolicyRuleCollectionGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupNatRuleCollection",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "name": "name",
        "priority": "priority",
        "rule": "rule",
    },
)
class FirewallPolicyRuleCollectionGroupNatRuleCollection:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        rule: typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollectionRule"],
    ) -> None:
        """
        :param action: -
        :param name: -
        :param priority: -
        :param rule: rule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
            "priority": priority,
            "rule": rule,
        }

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def rule(
        self,
    ) -> typing.List["FirewallPolicyRuleCollectionGroupNatRuleCollectionRule"]:
        """rule block."""
        result = self._values.get("rule")
        assert result is not None, "Required property 'rule' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupNatRuleCollection(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupNatRuleCollectionRule",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "protocols": "protocols",
        "translated_address": "translatedAddress",
        "translated_port": "translatedPort",
        "destination_address": "destinationAddress",
        "destination_ports": "destinationPorts",
        "source_addresses": "sourceAddresses",
        "source_ip_groups": "sourceIpGroups",
    },
)
class FirewallPolicyRuleCollectionGroupNatRuleCollectionRule:
    def __init__(
        self,
        *,
        name: builtins.str,
        protocols: typing.List[builtins.str],
        translated_address: builtins.str,
        translated_port: jsii.Number,
        destination_address: typing.Optional[builtins.str] = None,
        destination_ports: typing.Optional[typing.List[builtins.str]] = None,
        source_addresses: typing.Optional[typing.List[builtins.str]] = None,
        source_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param protocols: -
        :param translated_address: -
        :param translated_port: -
        :param destination_address: -
        :param destination_ports: -
        :param source_addresses: -
        :param source_ip_groups: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "protocols": protocols,
            "translated_address": translated_address,
            "translated_port": translated_port,
        }
        if destination_address is not None:
            self._values["destination_address"] = destination_address
        if destination_ports is not None:
            self._values["destination_ports"] = destination_ports
        if source_addresses is not None:
            self._values["source_addresses"] = source_addresses
        if source_ip_groups is not None:
            self._values["source_ip_groups"] = source_ip_groups

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocols(self) -> typing.List[builtins.str]:
        result = self._values.get("protocols")
        assert result is not None, "Required property 'protocols' is missing"
        return result

    @builtins.property
    def translated_address(self) -> builtins.str:
        result = self._values.get("translated_address")
        assert result is not None, "Required property 'translated_address' is missing"
        return result

    @builtins.property
    def translated_port(self) -> jsii.Number:
        result = self._values.get("translated_port")
        assert result is not None, "Required property 'translated_port' is missing"
        return result

    @builtins.property
    def destination_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("destination_address")
        return result

    @builtins.property
    def destination_ports(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_ports")
        return result

    @builtins.property
    def source_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_addresses")
        return result

    @builtins.property
    def source_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_ip_groups")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupNatRuleCollectionRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupNetworkRuleCollection",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "name": "name",
        "priority": "priority",
        "rule": "rule",
    },
)
class FirewallPolicyRuleCollectionGroupNetworkRuleCollection:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        priority: jsii.Number,
        rule: typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollectionRule"],
    ) -> None:
        """
        :param action: -
        :param name: -
        :param priority: -
        :param rule: rule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
            "priority": priority,
            "rule": rule,
        }

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def rule(
        self,
    ) -> typing.List["FirewallPolicyRuleCollectionGroupNetworkRuleCollectionRule"]:
        """rule block."""
        result = self._values.get("rule")
        assert result is not None, "Required property 'rule' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupNetworkRuleCollection(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupNetworkRuleCollectionRule",
    jsii_struct_bases=[],
    name_mapping={
        "destination_ports": "destinationPorts",
        "name": "name",
        "protocols": "protocols",
        "destination_addresses": "destinationAddresses",
        "destination_fqdns": "destinationFqdns",
        "destination_ip_groups": "destinationIpGroups",
        "source_addresses": "sourceAddresses",
        "source_ip_groups": "sourceIpGroups",
    },
)
class FirewallPolicyRuleCollectionGroupNetworkRuleCollectionRule:
    def __init__(
        self,
        *,
        destination_ports: typing.List[builtins.str],
        name: builtins.str,
        protocols: typing.List[builtins.str],
        destination_addresses: typing.Optional[typing.List[builtins.str]] = None,
        destination_fqdns: typing.Optional[typing.List[builtins.str]] = None,
        destination_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
        source_addresses: typing.Optional[typing.List[builtins.str]] = None,
        source_ip_groups: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param destination_ports: -
        :param name: -
        :param protocols: -
        :param destination_addresses: -
        :param destination_fqdns: -
        :param destination_ip_groups: -
        :param source_addresses: -
        :param source_ip_groups: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destination_ports": destination_ports,
            "name": name,
            "protocols": protocols,
        }
        if destination_addresses is not None:
            self._values["destination_addresses"] = destination_addresses
        if destination_fqdns is not None:
            self._values["destination_fqdns"] = destination_fqdns
        if destination_ip_groups is not None:
            self._values["destination_ip_groups"] = destination_ip_groups
        if source_addresses is not None:
            self._values["source_addresses"] = source_addresses
        if source_ip_groups is not None:
            self._values["source_ip_groups"] = source_ip_groups

    @builtins.property
    def destination_ports(self) -> typing.List[builtins.str]:
        result = self._values.get("destination_ports")
        assert result is not None, "Required property 'destination_ports' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocols(self) -> typing.List[builtins.str]:
        result = self._values.get("protocols")
        assert result is not None, "Required property 'protocols' is missing"
        return result

    @builtins.property
    def destination_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_addresses")
        return result

    @builtins.property
    def destination_fqdns(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_fqdns")
        return result

    @builtins.property
    def destination_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_ip_groups")
        return result

    @builtins.property
    def source_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_addresses")
        return result

    @builtins.property
    def source_ip_groups(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_ip_groups")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupNetworkRuleCollectionRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyRuleCollectionGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FirewallPolicyRuleCollectionGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyRuleCollectionGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyThreatIntelligenceAllowlist",
    jsii_struct_bases=[],
    name_mapping={"fqdns": "fqdns", "ip_addresses": "ipAddresses"},
)
class FirewallPolicyThreatIntelligenceAllowlist:
    def __init__(
        self,
        *,
        fqdns: typing.Optional[typing.List[builtins.str]] = None,
        ip_addresses: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param fqdns: -
        :param ip_addresses: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if fqdns is not None:
            self._values["fqdns"] = fqdns
        if ip_addresses is not None:
            self._values["ip_addresses"] = ip_addresses

    @builtins.property
    def fqdns(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("fqdns")
        return result

    @builtins.property
    def ip_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ip_addresses")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyThreatIntelligenceAllowlist(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FirewallPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FirewallTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FirewallVirtualHub",
    jsii_struct_bases=[],
    name_mapping={
        "virtual_hub_id": "virtualHubId",
        "public_ip_count": "publicIpCount",
    },
)
class FirewallVirtualHub:
    def __init__(
        self,
        *,
        virtual_hub_id: builtins.str,
        public_ip_count: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param virtual_hub_id: -
        :param public_ip_count: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "virtual_hub_id": virtual_hub_id,
        }
        if public_ip_count is not None:
            self._values["public_ip_count"] = public_ip_count

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def public_ip_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("public_ip_count")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FirewallVirtualHub(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Frontdoor(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Frontdoor",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_pool: typing.List["FrontdoorBackendPool"],
        backend_pool_health_probe: typing.List["FrontdoorBackendPoolHealthProbe"],
        backend_pool_load_balancing: typing.List["FrontdoorBackendPoolLoadBalancing"],
        enforce_backend_pools_certificate_name_check: builtins.bool,
        frontend_endpoint: typing.List["FrontdoorFrontendEndpoint"],
        name: builtins.str,
        resource_group_name: builtins.str,
        routing_rule: typing.List["FrontdoorRoutingRule"],
        backend_pools_send_receive_timeout_seconds: typing.Optional[jsii.Number] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        load_balancer_enabled: typing.Optional[builtins.bool] = None,
        location: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FrontdoorTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_pool: backend_pool block.
        :param backend_pool_health_probe: backend_pool_health_probe block.
        :param backend_pool_load_balancing: backend_pool_load_balancing block.
        :param enforce_backend_pools_certificate_name_check: -
        :param frontend_endpoint: frontend_endpoint block.
        :param name: -
        :param resource_group_name: -
        :param routing_rule: routing_rule block.
        :param backend_pools_send_receive_timeout_seconds: -
        :param friendly_name: -
        :param load_balancer_enabled: -
        :param location: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FrontdoorConfig(
            backend_pool=backend_pool,
            backend_pool_health_probe=backend_pool_health_probe,
            backend_pool_load_balancing=backend_pool_load_balancing,
            enforce_backend_pools_certificate_name_check=enforce_backend_pools_certificate_name_check,
            frontend_endpoint=frontend_endpoint,
            name=name,
            resource_group_name=resource_group_name,
            routing_rule=routing_rule,
            backend_pools_send_receive_timeout_seconds=backend_pools_send_receive_timeout_seconds,
            friendly_name=friendly_name,
            load_balancer_enabled=load_balancer_enabled,
            location=location,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Frontdoor, self, [scope, id, config])

    @jsii.member(jsii_name="resetBackendPoolsSendReceiveTimeoutSeconds")
    def reset_backend_pools_send_receive_timeout_seconds(self) -> None:
        return jsii.invoke(self, "resetBackendPoolsSendReceiveTimeoutSeconds", [])

    @jsii.member(jsii_name="resetFriendlyName")
    def reset_friendly_name(self) -> None:
        return jsii.invoke(self, "resetFriendlyName", [])

    @jsii.member(jsii_name="resetLoadBalancerEnabled")
    def reset_load_balancer_enabled(self) -> None:
        return jsii.invoke(self, "resetLoadBalancerEnabled", [])

    @jsii.member(jsii_name="resetLocation")
    def reset_location(self) -> None:
        return jsii.invoke(self, "resetLocation", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPoolHealthProbeInput")
    def backend_pool_health_probe_input(
        self,
    ) -> typing.List["FrontdoorBackendPoolHealthProbe"]:
        return jsii.get(self, "backendPoolHealthProbeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPoolInput")
    def backend_pool_input(self) -> typing.List["FrontdoorBackendPool"]:
        return jsii.get(self, "backendPoolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPoolLoadBalancingInput")
    def backend_pool_load_balancing_input(
        self,
    ) -> typing.List["FrontdoorBackendPoolLoadBalancing"]:
        return jsii.get(self, "backendPoolLoadBalancingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cname")
    def cname(self) -> builtins.str:
        return jsii.get(self, "cname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforceBackendPoolsCertificateNameCheckInput")
    def enforce_backend_pools_certificate_name_check_input(self) -> builtins.bool:
        return jsii.get(self, "enforceBackendPoolsCertificateNameCheckInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendEndpointInput")
    def frontend_endpoint_input(self) -> typing.List["FrontdoorFrontendEndpoint"]:
        return jsii.get(self, "frontendEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="headerFrontdoorId")
    def header_frontdoor_id(self) -> builtins.str:
        return jsii.get(self, "headerFrontdoorId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routingRuleInput")
    def routing_rule_input(self) -> typing.List["FrontdoorRoutingRule"]:
        return jsii.get(self, "routingRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPoolsSendReceiveTimeoutSecondsInput")
    def backend_pools_send_receive_timeout_seconds_input(
        self,
    ) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "backendPoolsSendReceiveTimeoutSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyNameInput")
    def friendly_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "friendlyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerEnabledInput")
    def load_balancer_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "loadBalancerEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["FrontdoorTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPool")
    def backend_pool(self) -> typing.List["FrontdoorBackendPool"]:
        return jsii.get(self, "backendPool")

    @backend_pool.setter # type: ignore
    def backend_pool(self, value: typing.List["FrontdoorBackendPool"]) -> None:
        jsii.set(self, "backendPool", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPoolHealthProbe")
    def backend_pool_health_probe(
        self,
    ) -> typing.List["FrontdoorBackendPoolHealthProbe"]:
        return jsii.get(self, "backendPoolHealthProbe")

    @backend_pool_health_probe.setter # type: ignore
    def backend_pool_health_probe(
        self,
        value: typing.List["FrontdoorBackendPoolHealthProbe"],
    ) -> None:
        jsii.set(self, "backendPoolHealthProbe", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPoolLoadBalancing")
    def backend_pool_load_balancing(
        self,
    ) -> typing.List["FrontdoorBackendPoolLoadBalancing"]:
        return jsii.get(self, "backendPoolLoadBalancing")

    @backend_pool_load_balancing.setter # type: ignore
    def backend_pool_load_balancing(
        self,
        value: typing.List["FrontdoorBackendPoolLoadBalancing"],
    ) -> None:
        jsii.set(self, "backendPoolLoadBalancing", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPoolsSendReceiveTimeoutSeconds")
    def backend_pools_send_receive_timeout_seconds(self) -> jsii.Number:
        return jsii.get(self, "backendPoolsSendReceiveTimeoutSeconds")

    @backend_pools_send_receive_timeout_seconds.setter # type: ignore
    def backend_pools_send_receive_timeout_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "backendPoolsSendReceiveTimeoutSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforceBackendPoolsCertificateNameCheck")
    def enforce_backend_pools_certificate_name_check(self) -> builtins.bool:
        return jsii.get(self, "enforceBackendPoolsCertificateNameCheck")

    @enforce_backend_pools_certificate_name_check.setter # type: ignore
    def enforce_backend_pools_certificate_name_check(
        self,
        value: builtins.bool,
    ) -> None:
        jsii.set(self, "enforceBackendPoolsCertificateNameCheck", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @friendly_name.setter # type: ignore
    def friendly_name(self, value: builtins.str) -> None:
        jsii.set(self, "friendlyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendEndpoint")
    def frontend_endpoint(self) -> typing.List["FrontdoorFrontendEndpoint"]:
        return jsii.get(self, "frontendEndpoint")

    @frontend_endpoint.setter # type: ignore
    def frontend_endpoint(
        self,
        value: typing.List["FrontdoorFrontendEndpoint"],
    ) -> None:
        jsii.set(self, "frontendEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerEnabled")
    def load_balancer_enabled(self) -> builtins.bool:
        return jsii.get(self, "loadBalancerEnabled")

    @load_balancer_enabled.setter # type: ignore
    def load_balancer_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "loadBalancerEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routingRule")
    def routing_rule(self) -> typing.List["FrontdoorRoutingRule"]:
        return jsii.get(self, "routingRule")

    @routing_rule.setter # type: ignore
    def routing_rule(self, value: typing.List["FrontdoorRoutingRule"]) -> None:
        jsii.set(self, "routingRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FrontdoorTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FrontdoorTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FrontdoorBackendPool",
    jsii_struct_bases=[],
    name_mapping={
        "backend": "backend",
        "health_probe_name": "healthProbeName",
        "load_balancing_name": "loadBalancingName",
        "name": "name",
    },
)
class FrontdoorBackendPool:
    def __init__(
        self,
        *,
        backend: typing.List["FrontdoorBackendPoolBackend"],
        health_probe_name: builtins.str,
        load_balancing_name: builtins.str,
        name: builtins.str,
    ) -> None:
        """
        :param backend: backend block.
        :param health_probe_name: -
        :param load_balancing_name: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "backend": backend,
            "health_probe_name": health_probe_name,
            "load_balancing_name": load_balancing_name,
            "name": name,
        }

    @builtins.property
    def backend(self) -> typing.List["FrontdoorBackendPoolBackend"]:
        """backend block."""
        result = self._values.get("backend")
        assert result is not None, "Required property 'backend' is missing"
        return result

    @builtins.property
    def health_probe_name(self) -> builtins.str:
        result = self._values.get("health_probe_name")
        assert result is not None, "Required property 'health_probe_name' is missing"
        return result

    @builtins.property
    def load_balancing_name(self) -> builtins.str:
        result = self._values.get("load_balancing_name")
        assert result is not None, "Required property 'load_balancing_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorBackendPool(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorBackendPoolBackend",
    jsii_struct_bases=[],
    name_mapping={
        "address": "address",
        "host_header": "hostHeader",
        "http_port": "httpPort",
        "https_port": "httpsPort",
        "enabled": "enabled",
        "priority": "priority",
        "weight": "weight",
    },
)
class FrontdoorBackendPoolBackend:
    def __init__(
        self,
        *,
        address: builtins.str,
        host_header: builtins.str,
        http_port: jsii.Number,
        https_port: jsii.Number,
        enabled: typing.Optional[builtins.bool] = None,
        priority: typing.Optional[jsii.Number] = None,
        weight: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param address: -
        :param host_header: -
        :param http_port: -
        :param https_port: -
        :param enabled: -
        :param priority: -
        :param weight: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "address": address,
            "host_header": host_header,
            "http_port": http_port,
            "https_port": https_port,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if priority is not None:
            self._values["priority"] = priority
        if weight is not None:
            self._values["weight"] = weight

    @builtins.property
    def address(self) -> builtins.str:
        result = self._values.get("address")
        assert result is not None, "Required property 'address' is missing"
        return result

    @builtins.property
    def host_header(self) -> builtins.str:
        result = self._values.get("host_header")
        assert result is not None, "Required property 'host_header' is missing"
        return result

    @builtins.property
    def http_port(self) -> jsii.Number:
        result = self._values.get("http_port")
        assert result is not None, "Required property 'http_port' is missing"
        return result

    @builtins.property
    def https_port(self) -> jsii.Number:
        result = self._values.get("https_port")
        assert result is not None, "Required property 'https_port' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def weight(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("weight")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorBackendPoolBackend(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorBackendPoolHealthProbe",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "enabled": "enabled",
        "interval_in_seconds": "intervalInSeconds",
        "path": "path",
        "probe_method": "probeMethod",
        "protocol": "protocol",
    },
)
class FrontdoorBackendPoolHealthProbe:
    def __init__(
        self,
        *,
        name: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        interval_in_seconds: typing.Optional[jsii.Number] = None,
        path: typing.Optional[builtins.str] = None,
        probe_method: typing.Optional[builtins.str] = None,
        protocol: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param enabled: -
        :param interval_in_seconds: -
        :param path: -
        :param probe_method: -
        :param protocol: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if interval_in_seconds is not None:
            self._values["interval_in_seconds"] = interval_in_seconds
        if path is not None:
            self._values["path"] = path
        if probe_method is not None:
            self._values["probe_method"] = probe_method
        if protocol is not None:
            self._values["protocol"] = protocol

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def interval_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval_in_seconds")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def probe_method(self) -> typing.Optional[builtins.str]:
        result = self._values.get("probe_method")
        return result

    @builtins.property
    def protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protocol")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorBackendPoolHealthProbe(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorBackendPoolLoadBalancing",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "additional_latency_milliseconds": "additionalLatencyMilliseconds",
        "sample_size": "sampleSize",
        "successful_samples_required": "successfulSamplesRequired",
    },
)
class FrontdoorBackendPoolLoadBalancing:
    def __init__(
        self,
        *,
        name: builtins.str,
        additional_latency_milliseconds: typing.Optional[jsii.Number] = None,
        sample_size: typing.Optional[jsii.Number] = None,
        successful_samples_required: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param name: -
        :param additional_latency_milliseconds: -
        :param sample_size: -
        :param successful_samples_required: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if additional_latency_milliseconds is not None:
            self._values["additional_latency_milliseconds"] = additional_latency_milliseconds
        if sample_size is not None:
            self._values["sample_size"] = sample_size
        if successful_samples_required is not None:
            self._values["successful_samples_required"] = successful_samples_required

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def additional_latency_milliseconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("additional_latency_milliseconds")
        return result

    @builtins.property
    def sample_size(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("sample_size")
        return result

    @builtins.property
    def successful_samples_required(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("successful_samples_required")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorBackendPoolLoadBalancing(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_pool": "backendPool",
        "backend_pool_health_probe": "backendPoolHealthProbe",
        "backend_pool_load_balancing": "backendPoolLoadBalancing",
        "enforce_backend_pools_certificate_name_check": "enforceBackendPoolsCertificateNameCheck",
        "frontend_endpoint": "frontendEndpoint",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "routing_rule": "routingRule",
        "backend_pools_send_receive_timeout_seconds": "backendPoolsSendReceiveTimeoutSeconds",
        "friendly_name": "friendlyName",
        "load_balancer_enabled": "loadBalancerEnabled",
        "location": "location",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class FrontdoorConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_pool: typing.List[FrontdoorBackendPool],
        backend_pool_health_probe: typing.List[FrontdoorBackendPoolHealthProbe],
        backend_pool_load_balancing: typing.List[FrontdoorBackendPoolLoadBalancing],
        enforce_backend_pools_certificate_name_check: builtins.bool,
        frontend_endpoint: typing.List["FrontdoorFrontendEndpoint"],
        name: builtins.str,
        resource_group_name: builtins.str,
        routing_rule: typing.List["FrontdoorRoutingRule"],
        backend_pools_send_receive_timeout_seconds: typing.Optional[jsii.Number] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        load_balancer_enabled: typing.Optional[builtins.bool] = None,
        location: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FrontdoorTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_pool: backend_pool block.
        :param backend_pool_health_probe: backend_pool_health_probe block.
        :param backend_pool_load_balancing: backend_pool_load_balancing block.
        :param enforce_backend_pools_certificate_name_check: -
        :param frontend_endpoint: frontend_endpoint block.
        :param name: -
        :param resource_group_name: -
        :param routing_rule: routing_rule block.
        :param backend_pools_send_receive_timeout_seconds: -
        :param friendly_name: -
        :param load_balancer_enabled: -
        :param location: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FrontdoorTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_pool": backend_pool,
            "backend_pool_health_probe": backend_pool_health_probe,
            "backend_pool_load_balancing": backend_pool_load_balancing,
            "enforce_backend_pools_certificate_name_check": enforce_backend_pools_certificate_name_check,
            "frontend_endpoint": frontend_endpoint,
            "name": name,
            "resource_group_name": resource_group_name,
            "routing_rule": routing_rule,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if backend_pools_send_receive_timeout_seconds is not None:
            self._values["backend_pools_send_receive_timeout_seconds"] = backend_pools_send_receive_timeout_seconds
        if friendly_name is not None:
            self._values["friendly_name"] = friendly_name
        if load_balancer_enabled is not None:
            self._values["load_balancer_enabled"] = load_balancer_enabled
        if location is not None:
            self._values["location"] = location
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_pool(self) -> typing.List[FrontdoorBackendPool]:
        """backend_pool block."""
        result = self._values.get("backend_pool")
        assert result is not None, "Required property 'backend_pool' is missing"
        return result

    @builtins.property
    def backend_pool_health_probe(self) -> typing.List[FrontdoorBackendPoolHealthProbe]:
        """backend_pool_health_probe block."""
        result = self._values.get("backend_pool_health_probe")
        assert result is not None, "Required property 'backend_pool_health_probe' is missing"
        return result

    @builtins.property
    def backend_pool_load_balancing(
        self,
    ) -> typing.List[FrontdoorBackendPoolLoadBalancing]:
        """backend_pool_load_balancing block."""
        result = self._values.get("backend_pool_load_balancing")
        assert result is not None, "Required property 'backend_pool_load_balancing' is missing"
        return result

    @builtins.property
    def enforce_backend_pools_certificate_name_check(self) -> builtins.bool:
        result = self._values.get("enforce_backend_pools_certificate_name_check")
        assert result is not None, "Required property 'enforce_backend_pools_certificate_name_check' is missing"
        return result

    @builtins.property
    def frontend_endpoint(self) -> typing.List["FrontdoorFrontendEndpoint"]:
        """frontend_endpoint block."""
        result = self._values.get("frontend_endpoint")
        assert result is not None, "Required property 'frontend_endpoint' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def routing_rule(self) -> typing.List["FrontdoorRoutingRule"]:
        """routing_rule block."""
        result = self._values.get("routing_rule")
        assert result is not None, "Required property 'routing_rule' is missing"
        return result

    @builtins.property
    def backend_pools_send_receive_timeout_seconds(
        self,
    ) -> typing.Optional[jsii.Number]:
        result = self._values.get("backend_pools_send_receive_timeout_seconds")
        return result

    @builtins.property
    def friendly_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("friendly_name")
        return result

    @builtins.property
    def load_balancer_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("load_balancer_enabled")
        return result

    @builtins.property
    def location(self) -> typing.Optional[builtins.str]:
        result = self._values.get("location")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FrontdoorTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FrontdoorCustomHttpsConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FrontdoorCustomHttpsConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        custom_https_provisioning_enabled: builtins.bool,
        frontend_endpoint_id: builtins.str,
        custom_https_configuration: typing.Optional[typing.List["FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration"]] = None,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["FrontdoorCustomHttpsConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param custom_https_provisioning_enabled: -
        :param frontend_endpoint_id: -
        :param custom_https_configuration: custom_https_configuration block.
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FrontdoorCustomHttpsConfigurationConfig(
            custom_https_provisioning_enabled=custom_https_provisioning_enabled,
            frontend_endpoint_id=frontend_endpoint_id,
            custom_https_configuration=custom_https_configuration,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FrontdoorCustomHttpsConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetCustomHttpsConfiguration")
    def reset_custom_https_configuration(self) -> None:
        return jsii.invoke(self, "resetCustomHttpsConfiguration", [])

    @jsii.member(jsii_name="resetResourceGroupName")
    def reset_resource_group_name(self) -> None:
        return jsii.invoke(self, "resetResourceGroupName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHttpsProvisioningEnabledInput")
    def custom_https_provisioning_enabled_input(self) -> builtins.bool:
        return jsii.get(self, "customHttpsProvisioningEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendEndpointIdInput")
    def frontend_endpoint_id_input(self) -> builtins.str:
        return jsii.get(self, "frontendEndpointIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHttpsConfigurationInput")
    def custom_https_configuration_input(
        self,
    ) -> typing.Optional[typing.List["FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration"]]:
        return jsii.get(self, "customHttpsConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["FrontdoorCustomHttpsConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHttpsConfiguration")
    def custom_https_configuration(
        self,
    ) -> typing.List["FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration"]:
        return jsii.get(self, "customHttpsConfiguration")

    @custom_https_configuration.setter # type: ignore
    def custom_https_configuration(
        self,
        value: typing.List["FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration"],
    ) -> None:
        jsii.set(self, "customHttpsConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHttpsProvisioningEnabled")
    def custom_https_provisioning_enabled(self) -> builtins.bool:
        return jsii.get(self, "customHttpsProvisioningEnabled")

    @custom_https_provisioning_enabled.setter # type: ignore
    def custom_https_provisioning_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "customHttpsProvisioningEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendEndpointId")
    def frontend_endpoint_id(self) -> builtins.str:
        return jsii.get(self, "frontendEndpointId")

    @frontend_endpoint_id.setter # type: ignore
    def frontend_endpoint_id(self, value: builtins.str) -> None:
        jsii.set(self, "frontendEndpointId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FrontdoorCustomHttpsConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FrontdoorCustomHttpsConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FrontdoorCustomHttpsConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "custom_https_provisioning_enabled": "customHttpsProvisioningEnabled",
        "frontend_endpoint_id": "frontendEndpointId",
        "custom_https_configuration": "customHttpsConfiguration",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class FrontdoorCustomHttpsConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        custom_https_provisioning_enabled: builtins.bool,
        frontend_endpoint_id: builtins.str,
        custom_https_configuration: typing.Optional[typing.List["FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration"]] = None,
        resource_group_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["FrontdoorCustomHttpsConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param custom_https_provisioning_enabled: -
        :param frontend_endpoint_id: -
        :param custom_https_configuration: custom_https_configuration block.
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FrontdoorCustomHttpsConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "custom_https_provisioning_enabled": custom_https_provisioning_enabled,
            "frontend_endpoint_id": frontend_endpoint_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if custom_https_configuration is not None:
            self._values["custom_https_configuration"] = custom_https_configuration
        if resource_group_name is not None:
            self._values["resource_group_name"] = resource_group_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def custom_https_provisioning_enabled(self) -> builtins.bool:
        result = self._values.get("custom_https_provisioning_enabled")
        assert result is not None, "Required property 'custom_https_provisioning_enabled' is missing"
        return result

    @builtins.property
    def frontend_endpoint_id(self) -> builtins.str:
        result = self._values.get("frontend_endpoint_id")
        assert result is not None, "Required property 'frontend_endpoint_id' is missing"
        return result

    @builtins.property
    def custom_https_configuration(
        self,
    ) -> typing.Optional[typing.List["FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration"]]:
        """custom_https_configuration block."""
        result = self._values.get("custom_https_configuration")
        return result

    @builtins.property
    def resource_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_group_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FrontdoorCustomHttpsConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorCustomHttpsConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "azure_key_vault_certificate_secret_name": "azureKeyVaultCertificateSecretName",
        "azure_key_vault_certificate_secret_version": "azureKeyVaultCertificateSecretVersion",
        "azure_key_vault_certificate_vault_id": "azureKeyVaultCertificateVaultId",
        "certificate_source": "certificateSource",
    },
)
class FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration:
    def __init__(
        self,
        *,
        azure_key_vault_certificate_secret_name: typing.Optional[builtins.str] = None,
        azure_key_vault_certificate_secret_version: typing.Optional[builtins.str] = None,
        azure_key_vault_certificate_vault_id: typing.Optional[builtins.str] = None,
        certificate_source: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param azure_key_vault_certificate_secret_name: -
        :param azure_key_vault_certificate_secret_version: -
        :param azure_key_vault_certificate_vault_id: -
        :param certificate_source: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if azure_key_vault_certificate_secret_name is not None:
            self._values["azure_key_vault_certificate_secret_name"] = azure_key_vault_certificate_secret_name
        if azure_key_vault_certificate_secret_version is not None:
            self._values["azure_key_vault_certificate_secret_version"] = azure_key_vault_certificate_secret_version
        if azure_key_vault_certificate_vault_id is not None:
            self._values["azure_key_vault_certificate_vault_id"] = azure_key_vault_certificate_vault_id
        if certificate_source is not None:
            self._values["certificate_source"] = certificate_source

    @builtins.property
    def azure_key_vault_certificate_secret_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("azure_key_vault_certificate_secret_name")
        return result

    @builtins.property
    def azure_key_vault_certificate_secret_version(
        self,
    ) -> typing.Optional[builtins.str]:
        result = self._values.get("azure_key_vault_certificate_secret_version")
        return result

    @builtins.property
    def azure_key_vault_certificate_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("azure_key_vault_certificate_vault_id")
        return result

    @builtins.property
    def certificate_source(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_source")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorCustomHttpsConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FrontdoorCustomHttpsConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorCustomHttpsConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FrontdoorFirewallPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FrontdoorFirewallPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        custom_block_response_body: typing.Optional[builtins.str] = None,
        custom_block_response_status_code: typing.Optional[jsii.Number] = None,
        custom_rule: typing.Optional[typing.List["FrontdoorFirewallPolicyCustomRule"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        managed_rule: typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRule"]] = None,
        mode: typing.Optional[builtins.str] = None,
        redirect_url: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FrontdoorFirewallPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param custom_block_response_body: -
        :param custom_block_response_status_code: -
        :param custom_rule: custom_rule block.
        :param enabled: -
        :param managed_rule: managed_rule block.
        :param mode: -
        :param redirect_url: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FrontdoorFirewallPolicyConfig(
            name=name,
            resource_group_name=resource_group_name,
            custom_block_response_body=custom_block_response_body,
            custom_block_response_status_code=custom_block_response_status_code,
            custom_rule=custom_rule,
            enabled=enabled,
            managed_rule=managed_rule,
            mode=mode,
            redirect_url=redirect_url,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FrontdoorFirewallPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetCustomBlockResponseBody")
    def reset_custom_block_response_body(self) -> None:
        return jsii.invoke(self, "resetCustomBlockResponseBody", [])

    @jsii.member(jsii_name="resetCustomBlockResponseStatusCode")
    def reset_custom_block_response_status_code(self) -> None:
        return jsii.invoke(self, "resetCustomBlockResponseStatusCode", [])

    @jsii.member(jsii_name="resetCustomRule")
    def reset_custom_rule(self) -> None:
        return jsii.invoke(self, "resetCustomRule", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetManagedRule")
    def reset_managed_rule(self) -> None:
        return jsii.invoke(self, "resetManagedRule", [])

    @jsii.member(jsii_name="resetMode")
    def reset_mode(self) -> None:
        return jsii.invoke(self, "resetMode", [])

    @jsii.member(jsii_name="resetRedirectUrl")
    def reset_redirect_url(self) -> None:
        return jsii.invoke(self, "resetRedirectUrl", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendEndpointIds")
    def frontend_endpoint_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "frontendEndpointIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customBlockResponseBodyInput")
    def custom_block_response_body_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "customBlockResponseBodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customBlockResponseStatusCodeInput")
    def custom_block_response_status_code_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "customBlockResponseStatusCodeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customRuleInput")
    def custom_rule_input(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyCustomRule"]]:
        return jsii.get(self, "customRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedRuleInput")
    def managed_rule_input(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRule"]]:
        return jsii.get(self, "managedRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="modeInput")
    def mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "modeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redirectUrlInput")
    def redirect_url_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "redirectUrlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["FrontdoorFirewallPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customBlockResponseBody")
    def custom_block_response_body(self) -> builtins.str:
        return jsii.get(self, "customBlockResponseBody")

    @custom_block_response_body.setter # type: ignore
    def custom_block_response_body(self, value: builtins.str) -> None:
        jsii.set(self, "customBlockResponseBody", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customBlockResponseStatusCode")
    def custom_block_response_status_code(self) -> jsii.Number:
        return jsii.get(self, "customBlockResponseStatusCode")

    @custom_block_response_status_code.setter # type: ignore
    def custom_block_response_status_code(self, value: jsii.Number) -> None:
        jsii.set(self, "customBlockResponseStatusCode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customRule")
    def custom_rule(self) -> typing.List["FrontdoorFirewallPolicyCustomRule"]:
        return jsii.get(self, "customRule")

    @custom_rule.setter # type: ignore
    def custom_rule(
        self,
        value: typing.List["FrontdoorFirewallPolicyCustomRule"],
    ) -> None:
        jsii.set(self, "customRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedRule")
    def managed_rule(self) -> typing.List["FrontdoorFirewallPolicyManagedRule"]:
        return jsii.get(self, "managedRule")

    @managed_rule.setter # type: ignore
    def managed_rule(
        self,
        value: typing.List["FrontdoorFirewallPolicyManagedRule"],
    ) -> None:
        jsii.set(self, "managedRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mode")
    def mode(self) -> builtins.str:
        return jsii.get(self, "mode")

    @mode.setter # type: ignore
    def mode(self, value: builtins.str) -> None:
        jsii.set(self, "mode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redirectUrl")
    def redirect_url(self) -> builtins.str:
        return jsii.get(self, "redirectUrl")

    @redirect_url.setter # type: ignore
    def redirect_url(self, value: builtins.str) -> None:
        jsii.set(self, "redirectUrl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FrontdoorFirewallPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FrontdoorFirewallPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "custom_block_response_body": "customBlockResponseBody",
        "custom_block_response_status_code": "customBlockResponseStatusCode",
        "custom_rule": "customRule",
        "enabled": "enabled",
        "managed_rule": "managedRule",
        "mode": "mode",
        "redirect_url": "redirectUrl",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class FrontdoorFirewallPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        custom_block_response_body: typing.Optional[builtins.str] = None,
        custom_block_response_status_code: typing.Optional[jsii.Number] = None,
        custom_rule: typing.Optional[typing.List["FrontdoorFirewallPolicyCustomRule"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        managed_rule: typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRule"]] = None,
        mode: typing.Optional[builtins.str] = None,
        redirect_url: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FrontdoorFirewallPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param custom_block_response_body: -
        :param custom_block_response_status_code: -
        :param custom_rule: custom_rule block.
        :param enabled: -
        :param managed_rule: managed_rule block.
        :param mode: -
        :param redirect_url: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FrontdoorFirewallPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if custom_block_response_body is not None:
            self._values["custom_block_response_body"] = custom_block_response_body
        if custom_block_response_status_code is not None:
            self._values["custom_block_response_status_code"] = custom_block_response_status_code
        if custom_rule is not None:
            self._values["custom_rule"] = custom_rule
        if enabled is not None:
            self._values["enabled"] = enabled
        if managed_rule is not None:
            self._values["managed_rule"] = managed_rule
        if mode is not None:
            self._values["mode"] = mode
        if redirect_url is not None:
            self._values["redirect_url"] = redirect_url
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def custom_block_response_body(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_block_response_body")
        return result

    @builtins.property
    def custom_block_response_status_code(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("custom_block_response_status_code")
        return result

    @builtins.property
    def custom_rule(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyCustomRule"]]:
        """custom_rule block."""
        result = self._values.get("custom_rule")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def managed_rule(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRule"]]:
        """managed_rule block."""
        result = self._values.get("managed_rule")
        return result

    @builtins.property
    def mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("mode")
        return result

    @builtins.property
    def redirect_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("redirect_url")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FrontdoorFirewallPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyCustomRule",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "name": "name",
        "type": "type",
        "enabled": "enabled",
        "match_condition": "matchCondition",
        "priority": "priority",
        "rate_limit_duration_in_minutes": "rateLimitDurationInMinutes",
        "rate_limit_threshold": "rateLimitThreshold",
    },
)
class FrontdoorFirewallPolicyCustomRule:
    def __init__(
        self,
        *,
        action: builtins.str,
        name: builtins.str,
        type: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        match_condition: typing.Optional[typing.List["FrontdoorFirewallPolicyCustomRuleMatchCondition"]] = None,
        priority: typing.Optional[jsii.Number] = None,
        rate_limit_duration_in_minutes: typing.Optional[jsii.Number] = None,
        rate_limit_threshold: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param action: -
        :param name: -
        :param type: -
        :param enabled: -
        :param match_condition: match_condition block.
        :param priority: -
        :param rate_limit_duration_in_minutes: -
        :param rate_limit_threshold: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "name": name,
            "type": type,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if match_condition is not None:
            self._values["match_condition"] = match_condition
        if priority is not None:
            self._values["priority"] = priority
        if rate_limit_duration_in_minutes is not None:
            self._values["rate_limit_duration_in_minutes"] = rate_limit_duration_in_minutes
        if rate_limit_threshold is not None:
            self._values["rate_limit_threshold"] = rate_limit_threshold

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def match_condition(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyCustomRuleMatchCondition"]]:
        """match_condition block."""
        result = self._values.get("match_condition")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def rate_limit_duration_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("rate_limit_duration_in_minutes")
        return result

    @builtins.property
    def rate_limit_threshold(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("rate_limit_threshold")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyCustomRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyCustomRuleMatchCondition",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "match_variable": "matchVariable",
        "operator": "operator",
        "negation_condition": "negationCondition",
        "selector": "selector",
        "transforms": "transforms",
    },
)
class FrontdoorFirewallPolicyCustomRuleMatchCondition:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        match_variable: builtins.str,
        operator: builtins.str,
        negation_condition: typing.Optional[builtins.bool] = None,
        selector: typing.Optional[builtins.str] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param match_variable: -
        :param operator: -
        :param negation_condition: -
        :param selector: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "match_variable": match_variable,
            "operator": operator,
        }
        if negation_condition is not None:
            self._values["negation_condition"] = negation_condition
        if selector is not None:
            self._values["selector"] = selector
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def match_variable(self) -> builtins.str:
        result = self._values.get("match_variable")
        assert result is not None, "Required property 'match_variable' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negation_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negation_condition")
        return result

    @builtins.property
    def selector(self) -> typing.Optional[builtins.str]:
        result = self._values.get("selector")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyCustomRuleMatchCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyManagedRule",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "version": "version",
        "exclusion": "exclusion",
        "override": "override",
    },
)
class FrontdoorFirewallPolicyManagedRule:
    def __init__(
        self,
        *,
        type: builtins.str,
        version: builtins.str,
        exclusion: typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleExclusion"]] = None,
        override: typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverride"]] = None,
    ) -> None:
        """
        :param type: -
        :param version: -
        :param exclusion: exclusion block.
        :param override: override block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
            "version": version,
        }
        if exclusion is not None:
            self._values["exclusion"] = exclusion
        if override is not None:
            self._values["override"] = override

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def exclusion(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleExclusion"]]:
        """exclusion block."""
        result = self._values.get("exclusion")
        return result

    @builtins.property
    def override(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverride"]]:
        """override block."""
        result = self._values.get("override")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyManagedRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyManagedRuleExclusion",
    jsii_struct_bases=[],
    name_mapping={
        "match_variable": "matchVariable",
        "operator": "operator",
        "selector": "selector",
    },
)
class FrontdoorFirewallPolicyManagedRuleExclusion:
    def __init__(
        self,
        *,
        match_variable: builtins.str,
        operator: builtins.str,
        selector: builtins.str,
    ) -> None:
        """
        :param match_variable: -
        :param operator: -
        :param selector: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_variable": match_variable,
            "operator": operator,
            "selector": selector,
        }

    @builtins.property
    def match_variable(self) -> builtins.str:
        result = self._values.get("match_variable")
        assert result is not None, "Required property 'match_variable' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def selector(self) -> builtins.str:
        result = self._values.get("selector")
        assert result is not None, "Required property 'selector' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyManagedRuleExclusion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyManagedRuleOverride",
    jsii_struct_bases=[],
    name_mapping={
        "rule_group_name": "ruleGroupName",
        "exclusion": "exclusion",
        "rule": "rule",
    },
)
class FrontdoorFirewallPolicyManagedRuleOverride:
    def __init__(
        self,
        *,
        rule_group_name: builtins.str,
        exclusion: typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverrideExclusion"]] = None,
        rule: typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverrideRule"]] = None,
    ) -> None:
        """
        :param rule_group_name: -
        :param exclusion: exclusion block.
        :param rule: rule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "rule_group_name": rule_group_name,
        }
        if exclusion is not None:
            self._values["exclusion"] = exclusion
        if rule is not None:
            self._values["rule"] = rule

    @builtins.property
    def rule_group_name(self) -> builtins.str:
        result = self._values.get("rule_group_name")
        assert result is not None, "Required property 'rule_group_name' is missing"
        return result

    @builtins.property
    def exclusion(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverrideExclusion"]]:
        """exclusion block."""
        result = self._values.get("exclusion")
        return result

    @builtins.property
    def rule(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverrideRule"]]:
        """rule block."""
        result = self._values.get("rule")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyManagedRuleOverride(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyManagedRuleOverrideExclusion",
    jsii_struct_bases=[],
    name_mapping={
        "match_variable": "matchVariable",
        "operator": "operator",
        "selector": "selector",
    },
)
class FrontdoorFirewallPolicyManagedRuleOverrideExclusion:
    def __init__(
        self,
        *,
        match_variable: builtins.str,
        operator: builtins.str,
        selector: builtins.str,
    ) -> None:
        """
        :param match_variable: -
        :param operator: -
        :param selector: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_variable": match_variable,
            "operator": operator,
            "selector": selector,
        }

    @builtins.property
    def match_variable(self) -> builtins.str:
        result = self._values.get("match_variable")
        assert result is not None, "Required property 'match_variable' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def selector(self) -> builtins.str:
        result = self._values.get("selector")
        assert result is not None, "Required property 'selector' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyManagedRuleOverrideExclusion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyManagedRuleOverrideRule",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "rule_id": "ruleId",
        "enabled": "enabled",
        "exclusion": "exclusion",
    },
)
class FrontdoorFirewallPolicyManagedRuleOverrideRule:
    def __init__(
        self,
        *,
        action: builtins.str,
        rule_id: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        exclusion: typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverrideRuleExclusion"]] = None,
    ) -> None:
        """
        :param action: -
        :param rule_id: -
        :param enabled: -
        :param exclusion: exclusion block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "rule_id": rule_id,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if exclusion is not None:
            self._values["exclusion"] = exclusion

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def rule_id(self) -> builtins.str:
        result = self._values.get("rule_id")
        assert result is not None, "Required property 'rule_id' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def exclusion(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFirewallPolicyManagedRuleOverrideRuleExclusion"]]:
        """exclusion block."""
        result = self._values.get("exclusion")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyManagedRuleOverrideRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyManagedRuleOverrideRuleExclusion",
    jsii_struct_bases=[],
    name_mapping={
        "match_variable": "matchVariable",
        "operator": "operator",
        "selector": "selector",
    },
)
class FrontdoorFirewallPolicyManagedRuleOverrideRuleExclusion:
    def __init__(
        self,
        *,
        match_variable: builtins.str,
        operator: builtins.str,
        selector: builtins.str,
    ) -> None:
        """
        :param match_variable: -
        :param operator: -
        :param selector: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_variable": match_variable,
            "operator": operator,
            "selector": selector,
        }

    @builtins.property
    def match_variable(self) -> builtins.str:
        result = self._values.get("match_variable")
        assert result is not None, "Required property 'match_variable' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def selector(self) -> builtins.str:
        result = self._values.get("selector")
        assert result is not None, "Required property 'selector' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyManagedRuleOverrideRuleExclusion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFirewallPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FrontdoorFirewallPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFirewallPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFrontendEndpoint",
    jsii_struct_bases=[],
    name_mapping={
        "host_name": "hostName",
        "name": "name",
        "custom_https_configuration": "customHttpsConfiguration",
        "custom_https_provisioning_enabled": "customHttpsProvisioningEnabled",
        "session_affinity_enabled": "sessionAffinityEnabled",
        "session_affinity_ttl_seconds": "sessionAffinityTtlSeconds",
        "web_application_firewall_policy_link_id": "webApplicationFirewallPolicyLinkId",
    },
)
class FrontdoorFrontendEndpoint:
    def __init__(
        self,
        *,
        host_name: builtins.str,
        name: builtins.str,
        custom_https_configuration: typing.Optional[typing.List["FrontdoorFrontendEndpointCustomHttpsConfiguration"]] = None,
        custom_https_provisioning_enabled: typing.Optional[builtins.bool] = None,
        session_affinity_enabled: typing.Optional[builtins.bool] = None,
        session_affinity_ttl_seconds: typing.Optional[jsii.Number] = None,
        web_application_firewall_policy_link_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param host_name: -
        :param name: -
        :param custom_https_configuration: custom_https_configuration block.
        :param custom_https_provisioning_enabled: -
        :param session_affinity_enabled: -
        :param session_affinity_ttl_seconds: -
        :param web_application_firewall_policy_link_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "host_name": host_name,
            "name": name,
        }
        if custom_https_configuration is not None:
            self._values["custom_https_configuration"] = custom_https_configuration
        if custom_https_provisioning_enabled is not None:
            self._values["custom_https_provisioning_enabled"] = custom_https_provisioning_enabled
        if session_affinity_enabled is not None:
            self._values["session_affinity_enabled"] = session_affinity_enabled
        if session_affinity_ttl_seconds is not None:
            self._values["session_affinity_ttl_seconds"] = session_affinity_ttl_seconds
        if web_application_firewall_policy_link_id is not None:
            self._values["web_application_firewall_policy_link_id"] = web_application_firewall_policy_link_id

    @builtins.property
    def host_name(self) -> builtins.str:
        result = self._values.get("host_name")
        assert result is not None, "Required property 'host_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def custom_https_configuration(
        self,
    ) -> typing.Optional[typing.List["FrontdoorFrontendEndpointCustomHttpsConfiguration"]]:
        """custom_https_configuration block."""
        result = self._values.get("custom_https_configuration")
        return result

    @builtins.property
    def custom_https_provisioning_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("custom_https_provisioning_enabled")
        return result

    @builtins.property
    def session_affinity_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("session_affinity_enabled")
        return result

    @builtins.property
    def session_affinity_ttl_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("session_affinity_ttl_seconds")
        return result

    @builtins.property
    def web_application_firewall_policy_link_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("web_application_firewall_policy_link_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFrontendEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorFrontendEndpointCustomHttpsConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "azure_key_vault_certificate_secret_name": "azureKeyVaultCertificateSecretName",
        "azure_key_vault_certificate_secret_version": "azureKeyVaultCertificateSecretVersion",
        "azure_key_vault_certificate_vault_id": "azureKeyVaultCertificateVaultId",
        "certificate_source": "certificateSource",
    },
)
class FrontdoorFrontendEndpointCustomHttpsConfiguration:
    def __init__(
        self,
        *,
        azure_key_vault_certificate_secret_name: typing.Optional[builtins.str] = None,
        azure_key_vault_certificate_secret_version: typing.Optional[builtins.str] = None,
        azure_key_vault_certificate_vault_id: typing.Optional[builtins.str] = None,
        certificate_source: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param azure_key_vault_certificate_secret_name: -
        :param azure_key_vault_certificate_secret_version: -
        :param azure_key_vault_certificate_vault_id: -
        :param certificate_source: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if azure_key_vault_certificate_secret_name is not None:
            self._values["azure_key_vault_certificate_secret_name"] = azure_key_vault_certificate_secret_name
        if azure_key_vault_certificate_secret_version is not None:
            self._values["azure_key_vault_certificate_secret_version"] = azure_key_vault_certificate_secret_version
        if azure_key_vault_certificate_vault_id is not None:
            self._values["azure_key_vault_certificate_vault_id"] = azure_key_vault_certificate_vault_id
        if certificate_source is not None:
            self._values["certificate_source"] = certificate_source

    @builtins.property
    def azure_key_vault_certificate_secret_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("azure_key_vault_certificate_secret_name")
        return result

    @builtins.property
    def azure_key_vault_certificate_secret_version(
        self,
    ) -> typing.Optional[builtins.str]:
        result = self._values.get("azure_key_vault_certificate_secret_version")
        return result

    @builtins.property
    def azure_key_vault_certificate_vault_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("azure_key_vault_certificate_vault_id")
        return result

    @builtins.property
    def certificate_source(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_source")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorFrontendEndpointCustomHttpsConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorRoutingRule",
    jsii_struct_bases=[],
    name_mapping={
        "accepted_protocols": "acceptedProtocols",
        "frontend_endpoints": "frontendEndpoints",
        "name": "name",
        "patterns_to_match": "patternsToMatch",
        "enabled": "enabled",
        "forwarding_configuration": "forwardingConfiguration",
        "redirect_configuration": "redirectConfiguration",
    },
)
class FrontdoorRoutingRule:
    def __init__(
        self,
        *,
        accepted_protocols: typing.List[builtins.str],
        frontend_endpoints: typing.List[builtins.str],
        name: builtins.str,
        patterns_to_match: typing.List[builtins.str],
        enabled: typing.Optional[builtins.bool] = None,
        forwarding_configuration: typing.Optional[typing.List["FrontdoorRoutingRuleForwardingConfiguration"]] = None,
        redirect_configuration: typing.Optional[typing.List["FrontdoorRoutingRuleRedirectConfiguration"]] = None,
    ) -> None:
        """
        :param accepted_protocols: -
        :param frontend_endpoints: -
        :param name: -
        :param patterns_to_match: -
        :param enabled: -
        :param forwarding_configuration: forwarding_configuration block.
        :param redirect_configuration: redirect_configuration block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "accepted_protocols": accepted_protocols,
            "frontend_endpoints": frontend_endpoints,
            "name": name,
            "patterns_to_match": patterns_to_match,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if forwarding_configuration is not None:
            self._values["forwarding_configuration"] = forwarding_configuration
        if redirect_configuration is not None:
            self._values["redirect_configuration"] = redirect_configuration

    @builtins.property
    def accepted_protocols(self) -> typing.List[builtins.str]:
        result = self._values.get("accepted_protocols")
        assert result is not None, "Required property 'accepted_protocols' is missing"
        return result

    @builtins.property
    def frontend_endpoints(self) -> typing.List[builtins.str]:
        result = self._values.get("frontend_endpoints")
        assert result is not None, "Required property 'frontend_endpoints' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def patterns_to_match(self) -> typing.List[builtins.str]:
        result = self._values.get("patterns_to_match")
        assert result is not None, "Required property 'patterns_to_match' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def forwarding_configuration(
        self,
    ) -> typing.Optional[typing.List["FrontdoorRoutingRuleForwardingConfiguration"]]:
        """forwarding_configuration block."""
        result = self._values.get("forwarding_configuration")
        return result

    @builtins.property
    def redirect_configuration(
        self,
    ) -> typing.Optional[typing.List["FrontdoorRoutingRuleRedirectConfiguration"]]:
        """redirect_configuration block."""
        result = self._values.get("redirect_configuration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorRoutingRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorRoutingRuleForwardingConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "backend_pool_name": "backendPoolName",
        "cache_enabled": "cacheEnabled",
        "cache_query_parameter_strip_directive": "cacheQueryParameterStripDirective",
        "cache_use_dynamic_compression": "cacheUseDynamicCompression",
        "custom_forwarding_path": "customForwardingPath",
        "forwarding_protocol": "forwardingProtocol",
    },
)
class FrontdoorRoutingRuleForwardingConfiguration:
    def __init__(
        self,
        *,
        backend_pool_name: builtins.str,
        cache_enabled: typing.Optional[builtins.bool] = None,
        cache_query_parameter_strip_directive: typing.Optional[builtins.str] = None,
        cache_use_dynamic_compression: typing.Optional[builtins.bool] = None,
        custom_forwarding_path: typing.Optional[builtins.str] = None,
        forwarding_protocol: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param backend_pool_name: -
        :param cache_enabled: -
        :param cache_query_parameter_strip_directive: -
        :param cache_use_dynamic_compression: -
        :param custom_forwarding_path: -
        :param forwarding_protocol: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "backend_pool_name": backend_pool_name,
        }
        if cache_enabled is not None:
            self._values["cache_enabled"] = cache_enabled
        if cache_query_parameter_strip_directive is not None:
            self._values["cache_query_parameter_strip_directive"] = cache_query_parameter_strip_directive
        if cache_use_dynamic_compression is not None:
            self._values["cache_use_dynamic_compression"] = cache_use_dynamic_compression
        if custom_forwarding_path is not None:
            self._values["custom_forwarding_path"] = custom_forwarding_path
        if forwarding_protocol is not None:
            self._values["forwarding_protocol"] = forwarding_protocol

    @builtins.property
    def backend_pool_name(self) -> builtins.str:
        result = self._values.get("backend_pool_name")
        assert result is not None, "Required property 'backend_pool_name' is missing"
        return result

    @builtins.property
    def cache_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("cache_enabled")
        return result

    @builtins.property
    def cache_query_parameter_strip_directive(self) -> typing.Optional[builtins.str]:
        result = self._values.get("cache_query_parameter_strip_directive")
        return result

    @builtins.property
    def cache_use_dynamic_compression(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("cache_use_dynamic_compression")
        return result

    @builtins.property
    def custom_forwarding_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_forwarding_path")
        return result

    @builtins.property
    def forwarding_protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("forwarding_protocol")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorRoutingRuleForwardingConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorRoutingRuleRedirectConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "redirect_protocol": "redirectProtocol",
        "redirect_type": "redirectType",
        "custom_fragment": "customFragment",
        "custom_host": "customHost",
        "custom_path": "customPath",
        "custom_query_string": "customQueryString",
    },
)
class FrontdoorRoutingRuleRedirectConfiguration:
    def __init__(
        self,
        *,
        redirect_protocol: builtins.str,
        redirect_type: builtins.str,
        custom_fragment: typing.Optional[builtins.str] = None,
        custom_host: typing.Optional[builtins.str] = None,
        custom_path: typing.Optional[builtins.str] = None,
        custom_query_string: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param redirect_protocol: -
        :param redirect_type: -
        :param custom_fragment: -
        :param custom_host: -
        :param custom_path: -
        :param custom_query_string: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "redirect_protocol": redirect_protocol,
            "redirect_type": redirect_type,
        }
        if custom_fragment is not None:
            self._values["custom_fragment"] = custom_fragment
        if custom_host is not None:
            self._values["custom_host"] = custom_host
        if custom_path is not None:
            self._values["custom_path"] = custom_path
        if custom_query_string is not None:
            self._values["custom_query_string"] = custom_query_string

    @builtins.property
    def redirect_protocol(self) -> builtins.str:
        result = self._values.get("redirect_protocol")
        assert result is not None, "Required property 'redirect_protocol' is missing"
        return result

    @builtins.property
    def redirect_type(self) -> builtins.str:
        result = self._values.get("redirect_type")
        assert result is not None, "Required property 'redirect_type' is missing"
        return result

    @builtins.property
    def custom_fragment(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_fragment")
        return result

    @builtins.property
    def custom_host(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_host")
        return result

    @builtins.property
    def custom_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_path")
        return result

    @builtins.property
    def custom_query_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_query_string")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorRoutingRuleRedirectConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FrontdoorTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FrontdoorTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FrontdoorTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FunctionApp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FunctionApp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_plan_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List["FunctionAppAuthSettings"]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["FunctionAppConnectionString"]] = None,
        daily_memory_time_quota: typing.Optional[jsii.Number] = None,
        enable_builtin_logging: typing.Optional[builtins.bool] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["FunctionAppIdentity"]] = None,
        os_type: typing.Optional[builtins.str] = None,
        site_config: typing.Optional[typing.List["FunctionAppSiteConfig"]] = None,
        source_control: typing.Optional[typing.List["FunctionAppSourceControl"]] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_name: typing.Optional[builtins.str] = None,
        storage_connection_string: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FunctionAppTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_plan_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param client_affinity_enabled: -
        :param connection_string: connection_string block.
        :param daily_memory_time_quota: -
        :param enable_builtin_logging: -
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param os_type: -
        :param site_config: site_config block.
        :param source_control: source_control block.
        :param storage_account_access_key: -
        :param storage_account_name: -
        :param storage_connection_string: -
        :param tags: -
        :param timeouts: timeouts block.
        :param version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FunctionAppConfig(
            app_service_plan_id=app_service_plan_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            app_settings=app_settings,
            auth_settings=auth_settings,
            client_affinity_enabled=client_affinity_enabled,
            connection_string=connection_string,
            daily_memory_time_quota=daily_memory_time_quota,
            enable_builtin_logging=enable_builtin_logging,
            enabled=enabled,
            https_only=https_only,
            identity=identity,
            os_type=os_type,
            site_config=site_config,
            source_control=source_control,
            storage_account_access_key=storage_account_access_key,
            storage_account_name=storage_account_name,
            storage_connection_string=storage_connection_string,
            tags=tags,
            timeouts=timeouts,
            version=version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FunctionApp, self, [scope, id, config])

    @jsii.member(jsii_name="resetAppSettings")
    def reset_app_settings(self) -> None:
        return jsii.invoke(self, "resetAppSettings", [])

    @jsii.member(jsii_name="resetAuthSettings")
    def reset_auth_settings(self) -> None:
        return jsii.invoke(self, "resetAuthSettings", [])

    @jsii.member(jsii_name="resetClientAffinityEnabled")
    def reset_client_affinity_enabled(self) -> None:
        return jsii.invoke(self, "resetClientAffinityEnabled", [])

    @jsii.member(jsii_name="resetConnectionString")
    def reset_connection_string(self) -> None:
        return jsii.invoke(self, "resetConnectionString", [])

    @jsii.member(jsii_name="resetDailyMemoryTimeQuota")
    def reset_daily_memory_time_quota(self) -> None:
        return jsii.invoke(self, "resetDailyMemoryTimeQuota", [])

    @jsii.member(jsii_name="resetEnableBuiltinLogging")
    def reset_enable_builtin_logging(self) -> None:
        return jsii.invoke(self, "resetEnableBuiltinLogging", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetHttpsOnly")
    def reset_https_only(self) -> None:
        return jsii.invoke(self, "resetHttpsOnly", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetOsType")
    def reset_os_type(self) -> None:
        return jsii.invoke(self, "resetOsType", [])

    @jsii.member(jsii_name="resetSiteConfig")
    def reset_site_config(self) -> None:
        return jsii.invoke(self, "resetSiteConfig", [])

    @jsii.member(jsii_name="resetSourceControl")
    def reset_source_control(self) -> None:
        return jsii.invoke(self, "resetSourceControl", [])

    @jsii.member(jsii_name="resetStorageAccountAccessKey")
    def reset_storage_account_access_key(self) -> None:
        return jsii.invoke(self, "resetStorageAccountAccessKey", [])

    @jsii.member(jsii_name="resetStorageAccountName")
    def reset_storage_account_name(self) -> None:
        return jsii.invoke(self, "resetStorageAccountName", [])

    @jsii.member(jsii_name="resetStorageConnectionString")
    def reset_storage_connection_string(self) -> None:
        return jsii.invoke(self, "resetStorageConnectionString", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVersion")
    def reset_version(self) -> None:
        return jsii.invoke(self, "resetVersion", [])

    @jsii.member(jsii_name="siteCredential")
    def site_credential(self, index: builtins.str) -> "FunctionAppSiteCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteCredential", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanIdInput")
    def app_service_plan_id_input(self) -> builtins.str:
        return jsii.get(self, "appServicePlanIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDomainVerificationId")
    def custom_domain_verification_id(self) -> builtins.str:
        return jsii.get(self, "customDomainVerificationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultHostname")
    def default_hostname(self) -> builtins.str:
        return jsii.get(self, "defaultHostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundIpAddresses")
    def outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "outboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="possibleOutboundIpAddresses")
    def possible_outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "possibleOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettingsInput")
    def app_settings_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "appSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettingsInput")
    def auth_settings_input(
        self,
    ) -> typing.Optional[typing.List["FunctionAppAuthSettings"]]:
        return jsii.get(self, "authSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabledInput")
    def client_affinity_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "clientAffinityEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(
        self,
    ) -> typing.Optional[typing.List["FunctionAppConnectionString"]]:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyMemoryTimeQuotaInput")
    def daily_memory_time_quota_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dailyMemoryTimeQuotaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBuiltinLoggingInput")
    def enable_builtin_logging_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableBuiltinLoggingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnlyInput")
    def https_only_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "httpsOnlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["FunctionAppIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osTypeInput")
    def os_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "osTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfigInput")
    def site_config_input(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSiteConfig"]]:
        return jsii.get(self, "siteConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceControlInput")
    def source_control_input(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSourceControl"]]:
        return jsii.get(self, "sourceControlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyInput")
    def storage_account_access_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageConnectionStringInput")
    def storage_connection_string_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageConnectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["FunctionAppTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanId")
    def app_service_plan_id(self) -> builtins.str:
        return jsii.get(self, "appServicePlanId")

    @app_service_plan_id.setter # type: ignore
    def app_service_plan_id(self, value: builtins.str) -> None:
        jsii.set(self, "appServicePlanId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettings")
    def app_settings(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "appSettings")

    @app_settings.setter # type: ignore
    def app_settings(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "appSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettings")
    def auth_settings(self) -> typing.List["FunctionAppAuthSettings"]:
        return jsii.get(self, "authSettings")

    @auth_settings.setter # type: ignore
    def auth_settings(self, value: typing.List["FunctionAppAuthSettings"]) -> None:
        jsii.set(self, "authSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabled")
    def client_affinity_enabled(self) -> builtins.bool:
        return jsii.get(self, "clientAffinityEnabled")

    @client_affinity_enabled.setter # type: ignore
    def client_affinity_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "clientAffinityEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> typing.List["FunctionAppConnectionString"]:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(
        self,
        value: typing.List["FunctionAppConnectionString"],
    ) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyMemoryTimeQuota")
    def daily_memory_time_quota(self) -> jsii.Number:
        return jsii.get(self, "dailyMemoryTimeQuota")

    @daily_memory_time_quota.setter # type: ignore
    def daily_memory_time_quota(self, value: jsii.Number) -> None:
        jsii.set(self, "dailyMemoryTimeQuota", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBuiltinLogging")
    def enable_builtin_logging(self) -> builtins.bool:
        return jsii.get(self, "enableBuiltinLogging")

    @enable_builtin_logging.setter # type: ignore
    def enable_builtin_logging(self, value: builtins.bool) -> None:
        jsii.set(self, "enableBuiltinLogging", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnly")
    def https_only(self) -> builtins.bool:
        return jsii.get(self, "httpsOnly")

    @https_only.setter # type: ignore
    def https_only(self, value: builtins.bool) -> None:
        jsii.set(self, "httpsOnly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["FunctionAppIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["FunctionAppIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @os_type.setter # type: ignore
    def os_type(self, value: builtins.str) -> None:
        jsii.set(self, "osType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfig")
    def site_config(self) -> typing.List["FunctionAppSiteConfig"]:
        return jsii.get(self, "siteConfig")

    @site_config.setter # type: ignore
    def site_config(self, value: typing.List["FunctionAppSiteConfig"]) -> None:
        jsii.set(self, "siteConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceControl")
    def source_control(self) -> typing.List["FunctionAppSourceControl"]:
        return jsii.get(self, "sourceControl")

    @source_control.setter # type: ignore
    def source_control(self, value: typing.List["FunctionAppSourceControl"]) -> None:
        jsii.set(self, "sourceControl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKey")
    def storage_account_access_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKey")

    @storage_account_access_key.setter # type: ignore
    def storage_account_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageConnectionString")
    def storage_connection_string(self) -> builtins.str:
        return jsii.get(self, "storageConnectionString")

    @storage_connection_string.setter # type: ignore
    def storage_connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "storageConnectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FunctionAppTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FunctionAppTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.FunctionAppAuthSettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "active_directory": "activeDirectory",
        "additional_login_params": "additionalLoginParams",
        "allowed_external_redirect_urls": "allowedExternalRedirectUrls",
        "default_provider": "defaultProvider",
        "facebook": "facebook",
        "google": "google",
        "issuer": "issuer",
        "microsoft": "microsoft",
        "runtime_version": "runtimeVersion",
        "token_refresh_extension_hours": "tokenRefreshExtensionHours",
        "token_store_enabled": "tokenStoreEnabled",
        "twitter": "twitter",
        "unauthenticated_client_action": "unauthenticatedClientAction",
    },
)
class FunctionAppAuthSettings:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        active_directory: typing.Optional[typing.List["FunctionAppAuthSettingsActiveDirectory"]] = None,
        additional_login_params: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        allowed_external_redirect_urls: typing.Optional[typing.List[builtins.str]] = None,
        default_provider: typing.Optional[builtins.str] = None,
        facebook: typing.Optional[typing.List["FunctionAppAuthSettingsFacebook"]] = None,
        google: typing.Optional[typing.List["FunctionAppAuthSettingsGoogle"]] = None,
        issuer: typing.Optional[builtins.str] = None,
        microsoft: typing.Optional[typing.List["FunctionAppAuthSettingsMicrosoft"]] = None,
        runtime_version: typing.Optional[builtins.str] = None,
        token_refresh_extension_hours: typing.Optional[jsii.Number] = None,
        token_store_enabled: typing.Optional[builtins.bool] = None,
        twitter: typing.Optional[typing.List["FunctionAppAuthSettingsTwitter"]] = None,
        unauthenticated_client_action: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param active_directory: active_directory block.
        :param additional_login_params: -
        :param allowed_external_redirect_urls: -
        :param default_provider: -
        :param facebook: facebook block.
        :param google: google block.
        :param issuer: -
        :param microsoft: microsoft block.
        :param runtime_version: -
        :param token_refresh_extension_hours: -
        :param token_store_enabled: -
        :param twitter: twitter block.
        :param unauthenticated_client_action: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if active_directory is not None:
            self._values["active_directory"] = active_directory
        if additional_login_params is not None:
            self._values["additional_login_params"] = additional_login_params
        if allowed_external_redirect_urls is not None:
            self._values["allowed_external_redirect_urls"] = allowed_external_redirect_urls
        if default_provider is not None:
            self._values["default_provider"] = default_provider
        if facebook is not None:
            self._values["facebook"] = facebook
        if google is not None:
            self._values["google"] = google
        if issuer is not None:
            self._values["issuer"] = issuer
        if microsoft is not None:
            self._values["microsoft"] = microsoft
        if runtime_version is not None:
            self._values["runtime_version"] = runtime_version
        if token_refresh_extension_hours is not None:
            self._values["token_refresh_extension_hours"] = token_refresh_extension_hours
        if token_store_enabled is not None:
            self._values["token_store_enabled"] = token_store_enabled
        if twitter is not None:
            self._values["twitter"] = twitter
        if unauthenticated_client_action is not None:
            self._values["unauthenticated_client_action"] = unauthenticated_client_action

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def active_directory(
        self,
    ) -> typing.Optional[typing.List["FunctionAppAuthSettingsActiveDirectory"]]:
        """active_directory block."""
        result = self._values.get("active_directory")
        return result

    @builtins.property
    def additional_login_params(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_login_params")
        return result

    @builtins.property
    def allowed_external_redirect_urls(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_external_redirect_urls")
        return result

    @builtins.property
    def default_provider(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_provider")
        return result

    @builtins.property
    def facebook(
        self,
    ) -> typing.Optional[typing.List["FunctionAppAuthSettingsFacebook"]]:
        """facebook block."""
        result = self._values.get("facebook")
        return result

    @builtins.property
    def google(self) -> typing.Optional[typing.List["FunctionAppAuthSettingsGoogle"]]:
        """google block."""
        result = self._values.get("google")
        return result

    @builtins.property
    def issuer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("issuer")
        return result

    @builtins.property
    def microsoft(
        self,
    ) -> typing.Optional[typing.List["FunctionAppAuthSettingsMicrosoft"]]:
        """microsoft block."""
        result = self._values.get("microsoft")
        return result

    @builtins.property
    def runtime_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("runtime_version")
        return result

    @builtins.property
    def token_refresh_extension_hours(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("token_refresh_extension_hours")
        return result

    @builtins.property
    def token_store_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("token_store_enabled")
        return result

    @builtins.property
    def twitter(self) -> typing.Optional[typing.List["FunctionAppAuthSettingsTwitter"]]:
        """twitter block."""
        result = self._values.get("twitter")
        return result

    @builtins.property
    def unauthenticated_client_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("unauthenticated_client_action")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppAuthSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppAuthSettingsActiveDirectory",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "allowed_audiences": "allowedAudiences",
        "client_secret": "clientSecret",
    },
)
class FunctionAppAuthSettingsActiveDirectory:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        allowed_audiences: typing.Optional[typing.List[builtins.str]] = None,
        client_secret: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param client_id: -
        :param allowed_audiences: -
        :param client_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
        }
        if allowed_audiences is not None:
            self._values["allowed_audiences"] = allowed_audiences
        if client_secret is not None:
            self._values["client_secret"] = client_secret

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def allowed_audiences(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_audiences")
        return result

    @builtins.property
    def client_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("client_secret")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppAuthSettingsActiveDirectory(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppAuthSettingsFacebook",
    jsii_struct_bases=[],
    name_mapping={
        "app_id": "appId",
        "app_secret": "appSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class FunctionAppAuthSettingsFacebook:
    def __init__(
        self,
        *,
        app_id: builtins.str,
        app_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param app_id: -
        :param app_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "app_id": app_id,
            "app_secret": app_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def app_id(self) -> builtins.str:
        result = self._values.get("app_id")
        assert result is not None, "Required property 'app_id' is missing"
        return result

    @builtins.property
    def app_secret(self) -> builtins.str:
        result = self._values.get("app_secret")
        assert result is not None, "Required property 'app_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppAuthSettingsFacebook(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppAuthSettingsGoogle",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class FunctionAppAuthSettingsGoogle:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppAuthSettingsGoogle(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppAuthSettingsMicrosoft",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class FunctionAppAuthSettingsMicrosoft:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppAuthSettingsMicrosoft(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppAuthSettingsTwitter",
    jsii_struct_bases=[],
    name_mapping={"consumer_key": "consumerKey", "consumer_secret": "consumerSecret"},
)
class FunctionAppAuthSettingsTwitter:
    def __init__(
        self,
        *,
        consumer_key: builtins.str,
        consumer_secret: builtins.str,
    ) -> None:
        """
        :param consumer_key: -
        :param consumer_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "consumer_key": consumer_key,
            "consumer_secret": consumer_secret,
        }

    @builtins.property
    def consumer_key(self) -> builtins.str:
        result = self._values.get("consumer_key")
        assert result is not None, "Required property 'consumer_key' is missing"
        return result

    @builtins.property
    def consumer_secret(self) -> builtins.str:
        result = self._values.get("consumer_secret")
        assert result is not None, "Required property 'consumer_secret' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppAuthSettingsTwitter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_plan_id": "appServicePlanId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "app_settings": "appSettings",
        "auth_settings": "authSettings",
        "client_affinity_enabled": "clientAffinityEnabled",
        "connection_string": "connectionString",
        "daily_memory_time_quota": "dailyMemoryTimeQuota",
        "enable_builtin_logging": "enableBuiltinLogging",
        "enabled": "enabled",
        "https_only": "httpsOnly",
        "identity": "identity",
        "os_type": "osType",
        "site_config": "siteConfig",
        "source_control": "sourceControl",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_name": "storageAccountName",
        "storage_connection_string": "storageConnectionString",
        "tags": "tags",
        "timeouts": "timeouts",
        "version": "version",
    },
)
class FunctionAppConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_plan_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List[FunctionAppAuthSettings]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["FunctionAppConnectionString"]] = None,
        daily_memory_time_quota: typing.Optional[jsii.Number] = None,
        enable_builtin_logging: typing.Optional[builtins.bool] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["FunctionAppIdentity"]] = None,
        os_type: typing.Optional[builtins.str] = None,
        site_config: typing.Optional[typing.List["FunctionAppSiteConfig"]] = None,
        source_control: typing.Optional[typing.List["FunctionAppSourceControl"]] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_name: typing.Optional[builtins.str] = None,
        storage_connection_string: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FunctionAppTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_plan_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param client_affinity_enabled: -
        :param connection_string: connection_string block.
        :param daily_memory_time_quota: -
        :param enable_builtin_logging: -
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param os_type: -
        :param site_config: site_config block.
        :param source_control: source_control block.
        :param storage_account_access_key: -
        :param storage_account_name: -
        :param storage_connection_string: -
        :param tags: -
        :param timeouts: timeouts block.
        :param version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FunctionAppTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_plan_id": app_service_plan_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if app_settings is not None:
            self._values["app_settings"] = app_settings
        if auth_settings is not None:
            self._values["auth_settings"] = auth_settings
        if client_affinity_enabled is not None:
            self._values["client_affinity_enabled"] = client_affinity_enabled
        if connection_string is not None:
            self._values["connection_string"] = connection_string
        if daily_memory_time_quota is not None:
            self._values["daily_memory_time_quota"] = daily_memory_time_quota
        if enable_builtin_logging is not None:
            self._values["enable_builtin_logging"] = enable_builtin_logging
        if enabled is not None:
            self._values["enabled"] = enabled
        if https_only is not None:
            self._values["https_only"] = https_only
        if identity is not None:
            self._values["identity"] = identity
        if os_type is not None:
            self._values["os_type"] = os_type
        if site_config is not None:
            self._values["site_config"] = site_config
        if source_control is not None:
            self._values["source_control"] = source_control
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_account_name is not None:
            self._values["storage_account_name"] = storage_account_name
        if storage_connection_string is not None:
            self._values["storage_connection_string"] = storage_connection_string
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_plan_id(self) -> builtins.str:
        result = self._values.get("app_service_plan_id")
        assert result is not None, "Required property 'app_service_plan_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def app_settings(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("app_settings")
        return result

    @builtins.property
    def auth_settings(self) -> typing.Optional[typing.List[FunctionAppAuthSettings]]:
        """auth_settings block."""
        result = self._values.get("auth_settings")
        return result

    @builtins.property
    def client_affinity_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("client_affinity_enabled")
        return result

    @builtins.property
    def connection_string(
        self,
    ) -> typing.Optional[typing.List["FunctionAppConnectionString"]]:
        """connection_string block."""
        result = self._values.get("connection_string")
        return result

    @builtins.property
    def daily_memory_time_quota(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("daily_memory_time_quota")
        return result

    @builtins.property
    def enable_builtin_logging(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_builtin_logging")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def https_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("https_only")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["FunctionAppIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def os_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_type")
        return result

    @builtins.property
    def site_config(self) -> typing.Optional[typing.List["FunctionAppSiteConfig"]]:
        """site_config block."""
        result = self._values.get("site_config")
        return result

    @builtins.property
    def source_control(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSourceControl"]]:
        """source_control block."""
        result = self._values.get("source_control")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_account_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_name")
        return result

    @builtins.property
    def storage_connection_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_connection_string")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FunctionAppTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppConnectionString",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "type": "type", "value": "value"},
)
class FunctionAppConnectionString:
    def __init__(
        self,
        *,
        name: builtins.str,
        type: builtins.str,
        value: builtins.str,
    ) -> None:
        """
        :param name: -
        :param type: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "type": type,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppConnectionString(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class FunctionAppIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSiteConfig",
    jsii_struct_bases=[],
    name_mapping={
        "always_on": "alwaysOn",
        "auto_swap_slot_name": "autoSwapSlotName",
        "cors": "cors",
        "ftps_state": "ftpsState",
        "health_check_path": "healthCheckPath",
        "http2_enabled": "http2Enabled",
        "ip_restriction": "ipRestriction",
        "linux_fx_version": "linuxFxVersion",
        "min_tls_version": "minTlsVersion",
        "pre_warmed_instance_count": "preWarmedInstanceCount",
        "scm_ip_restriction": "scmIpRestriction",
        "scm_type": "scmType",
        "scm_use_main_ip_restriction": "scmUseMainIpRestriction",
        "use32_bit_worker_process": "use32BitWorkerProcess",
        "websockets_enabled": "websocketsEnabled",
    },
)
class FunctionAppSiteConfig:
    def __init__(
        self,
        *,
        always_on: typing.Optional[builtins.bool] = None,
        auto_swap_slot_name: typing.Optional[builtins.str] = None,
        cors: typing.Optional[typing.List["FunctionAppSiteConfigCors"]] = None,
        ftps_state: typing.Optional[builtins.str] = None,
        health_check_path: typing.Optional[builtins.str] = None,
        http2_enabled: typing.Optional[builtins.bool] = None,
        ip_restriction: typing.Optional[typing.List["FunctionAppSiteConfigIpRestriction"]] = None,
        linux_fx_version: typing.Optional[builtins.str] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        pre_warmed_instance_count: typing.Optional[jsii.Number] = None,
        scm_ip_restriction: typing.Optional[typing.List["FunctionAppSiteConfigScmIpRestriction"]] = None,
        scm_type: typing.Optional[builtins.str] = None,
        scm_use_main_ip_restriction: typing.Optional[builtins.bool] = None,
        use32_bit_worker_process: typing.Optional[builtins.bool] = None,
        websockets_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param always_on: -
        :param auto_swap_slot_name: -
        :param cors: cors block.
        :param ftps_state: -
        :param health_check_path: -
        :param http2_enabled: -
        :param ip_restriction: -
        :param linux_fx_version: -
        :param min_tls_version: -
        :param pre_warmed_instance_count: -
        :param scm_ip_restriction: -
        :param scm_type: -
        :param scm_use_main_ip_restriction: -
        :param use32_bit_worker_process: -
        :param websockets_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if always_on is not None:
            self._values["always_on"] = always_on
        if auto_swap_slot_name is not None:
            self._values["auto_swap_slot_name"] = auto_swap_slot_name
        if cors is not None:
            self._values["cors"] = cors
        if ftps_state is not None:
            self._values["ftps_state"] = ftps_state
        if health_check_path is not None:
            self._values["health_check_path"] = health_check_path
        if http2_enabled is not None:
            self._values["http2_enabled"] = http2_enabled
        if ip_restriction is not None:
            self._values["ip_restriction"] = ip_restriction
        if linux_fx_version is not None:
            self._values["linux_fx_version"] = linux_fx_version
        if min_tls_version is not None:
            self._values["min_tls_version"] = min_tls_version
        if pre_warmed_instance_count is not None:
            self._values["pre_warmed_instance_count"] = pre_warmed_instance_count
        if scm_ip_restriction is not None:
            self._values["scm_ip_restriction"] = scm_ip_restriction
        if scm_type is not None:
            self._values["scm_type"] = scm_type
        if scm_use_main_ip_restriction is not None:
            self._values["scm_use_main_ip_restriction"] = scm_use_main_ip_restriction
        if use32_bit_worker_process is not None:
            self._values["use32_bit_worker_process"] = use32_bit_worker_process
        if websockets_enabled is not None:
            self._values["websockets_enabled"] = websockets_enabled

    @builtins.property
    def always_on(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("always_on")
        return result

    @builtins.property
    def auto_swap_slot_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_swap_slot_name")
        return result

    @builtins.property
    def cors(self) -> typing.Optional[typing.List["FunctionAppSiteConfigCors"]]:
        """cors block."""
        result = self._values.get("cors")
        return result

    @builtins.property
    def ftps_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ftps_state")
        return result

    @builtins.property
    def health_check_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("health_check_path")
        return result

    @builtins.property
    def http2_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("http2_enabled")
        return result

    @builtins.property
    def ip_restriction(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSiteConfigIpRestriction"]]:
        result = self._values.get("ip_restriction")
        return result

    @builtins.property
    def linux_fx_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("linux_fx_version")
        return result

    @builtins.property
    def min_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_tls_version")
        return result

    @builtins.property
    def pre_warmed_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("pre_warmed_instance_count")
        return result

    @builtins.property
    def scm_ip_restriction(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSiteConfigScmIpRestriction"]]:
        result = self._values.get("scm_ip_restriction")
        return result

    @builtins.property
    def scm_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scm_type")
        return result

    @builtins.property
    def scm_use_main_ip_restriction(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("scm_use_main_ip_restriction")
        return result

    @builtins.property
    def use32_bit_worker_process(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use32_bit_worker_process")
        return result

    @builtins.property
    def websockets_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("websockets_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSiteConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSiteConfigCors",
    jsii_struct_bases=[],
    name_mapping={
        "allowed_origins": "allowedOrigins",
        "support_credentials": "supportCredentials",
    },
)
class FunctionAppSiteConfigCors:
    def __init__(
        self,
        *,
        allowed_origins: typing.List[builtins.str],
        support_credentials: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param allowed_origins: -
        :param support_credentials: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_origins": allowed_origins,
        }
        if support_credentials is not None:
            self._values["support_credentials"] = support_credentials

    @builtins.property
    def allowed_origins(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_origins")
        assert result is not None, "Required property 'allowed_origins' is missing"
        return result

    @builtins.property
    def support_credentials(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("support_credentials")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSiteConfigCors(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSiteConfigIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class FunctionAppSiteConfigIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSiteConfigIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSiteConfigScmIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class FunctionAppSiteConfigScmIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSiteConfigScmIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FunctionAppSiteCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FunctionAppSiteCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(FunctionAppSiteCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class FunctionAppSlot(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FunctionAppSlot",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        app_service_plan_id: builtins.str,
        function_app_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_access_key: builtins.str,
        storage_account_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List["FunctionAppSlotAuthSettings"]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["FunctionAppSlotConnectionString"]] = None,
        daily_memory_time_quota: typing.Optional[jsii.Number] = None,
        enable_builtin_logging: typing.Optional[builtins.bool] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["FunctionAppSlotIdentity"]] = None,
        os_type: typing.Optional[builtins.str] = None,
        site_config: typing.Optional[typing.List["FunctionAppSlotSiteConfig"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FunctionAppSlotTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param app_service_plan_id: -
        :param function_app_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account_access_key: -
        :param storage_account_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param client_affinity_enabled: -
        :param connection_string: connection_string block.
        :param daily_memory_time_quota: -
        :param enable_builtin_logging: -
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param os_type: -
        :param site_config: site_config block.
        :param tags: -
        :param timeouts: timeouts block.
        :param version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FunctionAppSlotConfig(
            app_service_plan_id=app_service_plan_id,
            function_app_name=function_app_name,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            storage_account_access_key=storage_account_access_key,
            storage_account_name=storage_account_name,
            app_settings=app_settings,
            auth_settings=auth_settings,
            client_affinity_enabled=client_affinity_enabled,
            connection_string=connection_string,
            daily_memory_time_quota=daily_memory_time_quota,
            enable_builtin_logging=enable_builtin_logging,
            enabled=enabled,
            https_only=https_only,
            identity=identity,
            os_type=os_type,
            site_config=site_config,
            tags=tags,
            timeouts=timeouts,
            version=version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(FunctionAppSlot, self, [scope, id, config])

    @jsii.member(jsii_name="resetAppSettings")
    def reset_app_settings(self) -> None:
        return jsii.invoke(self, "resetAppSettings", [])

    @jsii.member(jsii_name="resetAuthSettings")
    def reset_auth_settings(self) -> None:
        return jsii.invoke(self, "resetAuthSettings", [])

    @jsii.member(jsii_name="resetClientAffinityEnabled")
    def reset_client_affinity_enabled(self) -> None:
        return jsii.invoke(self, "resetClientAffinityEnabled", [])

    @jsii.member(jsii_name="resetConnectionString")
    def reset_connection_string(self) -> None:
        return jsii.invoke(self, "resetConnectionString", [])

    @jsii.member(jsii_name="resetDailyMemoryTimeQuota")
    def reset_daily_memory_time_quota(self) -> None:
        return jsii.invoke(self, "resetDailyMemoryTimeQuota", [])

    @jsii.member(jsii_name="resetEnableBuiltinLogging")
    def reset_enable_builtin_logging(self) -> None:
        return jsii.invoke(self, "resetEnableBuiltinLogging", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetHttpsOnly")
    def reset_https_only(self) -> None:
        return jsii.invoke(self, "resetHttpsOnly", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetOsType")
    def reset_os_type(self) -> None:
        return jsii.invoke(self, "resetOsType", [])

    @jsii.member(jsii_name="resetSiteConfig")
    def reset_site_config(self) -> None:
        return jsii.invoke(self, "resetSiteConfig", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVersion")
    def reset_version(self) -> None:
        return jsii.invoke(self, "resetVersion", [])

    @jsii.member(jsii_name="siteCredential")
    def site_credential(self, index: builtins.str) -> "FunctionAppSlotSiteCredential":
        """
        :param index: -
        """
        return jsii.invoke(self, "siteCredential", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanIdInput")
    def app_service_plan_id_input(self) -> builtins.str:
        return jsii.get(self, "appServicePlanIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultHostname")
    def default_hostname(self) -> builtins.str:
        return jsii.get(self, "defaultHostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionAppNameInput")
    def function_app_name_input(self) -> builtins.str:
        return jsii.get(self, "functionAppNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundIpAddresses")
    def outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "outboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="possibleOutboundIpAddresses")
    def possible_outbound_ip_addresses(self) -> builtins.str:
        return jsii.get(self, "possibleOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyInput")
    def storage_account_access_key_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettingsInput")
    def app_settings_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "appSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettingsInput")
    def auth_settings_input(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotAuthSettings"]]:
        return jsii.get(self, "authSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabledInput")
    def client_affinity_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "clientAffinityEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotConnectionString"]]:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyMemoryTimeQuotaInput")
    def daily_memory_time_quota_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dailyMemoryTimeQuotaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBuiltinLoggingInput")
    def enable_builtin_logging_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableBuiltinLoggingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnlyInput")
    def https_only_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "httpsOnlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["FunctionAppSlotIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osTypeInput")
    def os_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "osTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfigInput")
    def site_config_input(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotSiteConfig"]]:
        return jsii.get(self, "siteConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["FunctionAppSlotTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appServicePlanId")
    def app_service_plan_id(self) -> builtins.str:
        return jsii.get(self, "appServicePlanId")

    @app_service_plan_id.setter # type: ignore
    def app_service_plan_id(self, value: builtins.str) -> None:
        jsii.set(self, "appServicePlanId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appSettings")
    def app_settings(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "appSettings")

    @app_settings.setter # type: ignore
    def app_settings(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "appSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authSettings")
    def auth_settings(self) -> typing.List["FunctionAppSlotAuthSettings"]:
        return jsii.get(self, "authSettings")

    @auth_settings.setter # type: ignore
    def auth_settings(self, value: typing.List["FunctionAppSlotAuthSettings"]) -> None:
        jsii.set(self, "authSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientAffinityEnabled")
    def client_affinity_enabled(self) -> builtins.bool:
        return jsii.get(self, "clientAffinityEnabled")

    @client_affinity_enabled.setter # type: ignore
    def client_affinity_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "clientAffinityEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> typing.List["FunctionAppSlotConnectionString"]:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(
        self,
        value: typing.List["FunctionAppSlotConnectionString"],
    ) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyMemoryTimeQuota")
    def daily_memory_time_quota(self) -> jsii.Number:
        return jsii.get(self, "dailyMemoryTimeQuota")

    @daily_memory_time_quota.setter # type: ignore
    def daily_memory_time_quota(self, value: jsii.Number) -> None:
        jsii.set(self, "dailyMemoryTimeQuota", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBuiltinLogging")
    def enable_builtin_logging(self) -> builtins.bool:
        return jsii.get(self, "enableBuiltinLogging")

    @enable_builtin_logging.setter # type: ignore
    def enable_builtin_logging(self, value: builtins.bool) -> None:
        jsii.set(self, "enableBuiltinLogging", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionAppName")
    def function_app_name(self) -> builtins.str:
        return jsii.get(self, "functionAppName")

    @function_app_name.setter # type: ignore
    def function_app_name(self, value: builtins.str) -> None:
        jsii.set(self, "functionAppName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsOnly")
    def https_only(self) -> builtins.bool:
        return jsii.get(self, "httpsOnly")

    @https_only.setter # type: ignore
    def https_only(self, value: builtins.bool) -> None:
        jsii.set(self, "httpsOnly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["FunctionAppSlotIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["FunctionAppSlotIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @os_type.setter # type: ignore
    def os_type(self, value: builtins.str) -> None:
        jsii.set(self, "osType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="siteConfig")
    def site_config(self) -> typing.List["FunctionAppSlotSiteConfig"]:
        return jsii.get(self, "siteConfig")

    @site_config.setter # type: ignore
    def site_config(self, value: typing.List["FunctionAppSlotSiteConfig"]) -> None:
        jsii.set(self, "siteConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKey")
    def storage_account_access_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKey")

    @storage_account_access_key.setter # type: ignore
    def storage_account_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "FunctionAppSlotTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "FunctionAppSlotTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotAuthSettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "active_directory": "activeDirectory",
        "additional_login_params": "additionalLoginParams",
        "allowed_external_redirect_urls": "allowedExternalRedirectUrls",
        "default_provider": "defaultProvider",
        "facebook": "facebook",
        "google": "google",
        "issuer": "issuer",
        "microsoft": "microsoft",
        "runtime_version": "runtimeVersion",
        "token_refresh_extension_hours": "tokenRefreshExtensionHours",
        "token_store_enabled": "tokenStoreEnabled",
        "twitter": "twitter",
        "unauthenticated_client_action": "unauthenticatedClientAction",
    },
)
class FunctionAppSlotAuthSettings:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        active_directory: typing.Optional[typing.List["FunctionAppSlotAuthSettingsActiveDirectory"]] = None,
        additional_login_params: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        allowed_external_redirect_urls: typing.Optional[typing.List[builtins.str]] = None,
        default_provider: typing.Optional[builtins.str] = None,
        facebook: typing.Optional[typing.List["FunctionAppSlotAuthSettingsFacebook"]] = None,
        google: typing.Optional[typing.List["FunctionAppSlotAuthSettingsGoogle"]] = None,
        issuer: typing.Optional[builtins.str] = None,
        microsoft: typing.Optional[typing.List["FunctionAppSlotAuthSettingsMicrosoft"]] = None,
        runtime_version: typing.Optional[builtins.str] = None,
        token_refresh_extension_hours: typing.Optional[jsii.Number] = None,
        token_store_enabled: typing.Optional[builtins.bool] = None,
        twitter: typing.Optional[typing.List["FunctionAppSlotAuthSettingsTwitter"]] = None,
        unauthenticated_client_action: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param active_directory: active_directory block.
        :param additional_login_params: -
        :param allowed_external_redirect_urls: -
        :param default_provider: -
        :param facebook: facebook block.
        :param google: google block.
        :param issuer: -
        :param microsoft: microsoft block.
        :param runtime_version: -
        :param token_refresh_extension_hours: -
        :param token_store_enabled: -
        :param twitter: twitter block.
        :param unauthenticated_client_action: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if active_directory is not None:
            self._values["active_directory"] = active_directory
        if additional_login_params is not None:
            self._values["additional_login_params"] = additional_login_params
        if allowed_external_redirect_urls is not None:
            self._values["allowed_external_redirect_urls"] = allowed_external_redirect_urls
        if default_provider is not None:
            self._values["default_provider"] = default_provider
        if facebook is not None:
            self._values["facebook"] = facebook
        if google is not None:
            self._values["google"] = google
        if issuer is not None:
            self._values["issuer"] = issuer
        if microsoft is not None:
            self._values["microsoft"] = microsoft
        if runtime_version is not None:
            self._values["runtime_version"] = runtime_version
        if token_refresh_extension_hours is not None:
            self._values["token_refresh_extension_hours"] = token_refresh_extension_hours
        if token_store_enabled is not None:
            self._values["token_store_enabled"] = token_store_enabled
        if twitter is not None:
            self._values["twitter"] = twitter
        if unauthenticated_client_action is not None:
            self._values["unauthenticated_client_action"] = unauthenticated_client_action

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def active_directory(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotAuthSettingsActiveDirectory"]]:
        """active_directory block."""
        result = self._values.get("active_directory")
        return result

    @builtins.property
    def additional_login_params(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("additional_login_params")
        return result

    @builtins.property
    def allowed_external_redirect_urls(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_external_redirect_urls")
        return result

    @builtins.property
    def default_provider(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_provider")
        return result

    @builtins.property
    def facebook(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotAuthSettingsFacebook"]]:
        """facebook block."""
        result = self._values.get("facebook")
        return result

    @builtins.property
    def google(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotAuthSettingsGoogle"]]:
        """google block."""
        result = self._values.get("google")
        return result

    @builtins.property
    def issuer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("issuer")
        return result

    @builtins.property
    def microsoft(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotAuthSettingsMicrosoft"]]:
        """microsoft block."""
        result = self._values.get("microsoft")
        return result

    @builtins.property
    def runtime_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("runtime_version")
        return result

    @builtins.property
    def token_refresh_extension_hours(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("token_refresh_extension_hours")
        return result

    @builtins.property
    def token_store_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("token_store_enabled")
        return result

    @builtins.property
    def twitter(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotAuthSettingsTwitter"]]:
        """twitter block."""
        result = self._values.get("twitter")
        return result

    @builtins.property
    def unauthenticated_client_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("unauthenticated_client_action")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotAuthSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotAuthSettingsActiveDirectory",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "allowed_audiences": "allowedAudiences",
        "client_secret": "clientSecret",
    },
)
class FunctionAppSlotAuthSettingsActiveDirectory:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        allowed_audiences: typing.Optional[typing.List[builtins.str]] = None,
        client_secret: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param client_id: -
        :param allowed_audiences: -
        :param client_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
        }
        if allowed_audiences is not None:
            self._values["allowed_audiences"] = allowed_audiences
        if client_secret is not None:
            self._values["client_secret"] = client_secret

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def allowed_audiences(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_audiences")
        return result

    @builtins.property
    def client_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("client_secret")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotAuthSettingsActiveDirectory(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotAuthSettingsFacebook",
    jsii_struct_bases=[],
    name_mapping={
        "app_id": "appId",
        "app_secret": "appSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class FunctionAppSlotAuthSettingsFacebook:
    def __init__(
        self,
        *,
        app_id: builtins.str,
        app_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param app_id: -
        :param app_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "app_id": app_id,
            "app_secret": app_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def app_id(self) -> builtins.str:
        result = self._values.get("app_id")
        assert result is not None, "Required property 'app_id' is missing"
        return result

    @builtins.property
    def app_secret(self) -> builtins.str:
        result = self._values.get("app_secret")
        assert result is not None, "Required property 'app_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotAuthSettingsFacebook(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotAuthSettingsGoogle",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class FunctionAppSlotAuthSettingsGoogle:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotAuthSettingsGoogle(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotAuthSettingsMicrosoft",
    jsii_struct_bases=[],
    name_mapping={
        "client_id": "clientId",
        "client_secret": "clientSecret",
        "oauth_scopes": "oauthScopes",
    },
)
class FunctionAppSlotAuthSettingsMicrosoft:
    def __init__(
        self,
        *,
        client_id: builtins.str,
        client_secret: builtins.str,
        oauth_scopes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param client_id: -
        :param client_secret: -
        :param oauth_scopes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }
        if oauth_scopes is not None:
            self._values["oauth_scopes"] = oauth_scopes

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("oauth_scopes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotAuthSettingsMicrosoft(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotAuthSettingsTwitter",
    jsii_struct_bases=[],
    name_mapping={"consumer_key": "consumerKey", "consumer_secret": "consumerSecret"},
)
class FunctionAppSlotAuthSettingsTwitter:
    def __init__(
        self,
        *,
        consumer_key: builtins.str,
        consumer_secret: builtins.str,
    ) -> None:
        """
        :param consumer_key: -
        :param consumer_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "consumer_key": consumer_key,
            "consumer_secret": consumer_secret,
        }

    @builtins.property
    def consumer_key(self) -> builtins.str:
        result = self._values.get("consumer_key")
        assert result is not None, "Required property 'consumer_key' is missing"
        return result

    @builtins.property
    def consumer_secret(self) -> builtins.str:
        result = self._values.get("consumer_secret")
        assert result is not None, "Required property 'consumer_secret' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotAuthSettingsTwitter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "app_service_plan_id": "appServicePlanId",
        "function_app_name": "functionAppName",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_name": "storageAccountName",
        "app_settings": "appSettings",
        "auth_settings": "authSettings",
        "client_affinity_enabled": "clientAffinityEnabled",
        "connection_string": "connectionString",
        "daily_memory_time_quota": "dailyMemoryTimeQuota",
        "enable_builtin_logging": "enableBuiltinLogging",
        "enabled": "enabled",
        "https_only": "httpsOnly",
        "identity": "identity",
        "os_type": "osType",
        "site_config": "siteConfig",
        "tags": "tags",
        "timeouts": "timeouts",
        "version": "version",
    },
)
class FunctionAppSlotConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        app_service_plan_id: builtins.str,
        function_app_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_access_key: builtins.str,
        storage_account_name: builtins.str,
        app_settings: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        auth_settings: typing.Optional[typing.List[FunctionAppSlotAuthSettings]] = None,
        client_affinity_enabled: typing.Optional[builtins.bool] = None,
        connection_string: typing.Optional[typing.List["FunctionAppSlotConnectionString"]] = None,
        daily_memory_time_quota: typing.Optional[jsii.Number] = None,
        enable_builtin_logging: typing.Optional[builtins.bool] = None,
        enabled: typing.Optional[builtins.bool] = None,
        https_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["FunctionAppSlotIdentity"]] = None,
        os_type: typing.Optional[builtins.str] = None,
        site_config: typing.Optional[typing.List["FunctionAppSlotSiteConfig"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["FunctionAppSlotTimeouts"] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_service_plan_id: -
        :param function_app_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account_access_key: -
        :param storage_account_name: -
        :param app_settings: -
        :param auth_settings: auth_settings block.
        :param client_affinity_enabled: -
        :param connection_string: connection_string block.
        :param daily_memory_time_quota: -
        :param enable_builtin_logging: -
        :param enabled: -
        :param https_only: -
        :param identity: identity block.
        :param os_type: -
        :param site_config: site_config block.
        :param tags: -
        :param timeouts: timeouts block.
        :param version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = FunctionAppSlotTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "app_service_plan_id": app_service_plan_id,
            "function_app_name": function_app_name,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "storage_account_access_key": storage_account_access_key,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if app_settings is not None:
            self._values["app_settings"] = app_settings
        if auth_settings is not None:
            self._values["auth_settings"] = auth_settings
        if client_affinity_enabled is not None:
            self._values["client_affinity_enabled"] = client_affinity_enabled
        if connection_string is not None:
            self._values["connection_string"] = connection_string
        if daily_memory_time_quota is not None:
            self._values["daily_memory_time_quota"] = daily_memory_time_quota
        if enable_builtin_logging is not None:
            self._values["enable_builtin_logging"] = enable_builtin_logging
        if enabled is not None:
            self._values["enabled"] = enabled
        if https_only is not None:
            self._values["https_only"] = https_only
        if identity is not None:
            self._values["identity"] = identity
        if os_type is not None:
            self._values["os_type"] = os_type
        if site_config is not None:
            self._values["site_config"] = site_config
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def app_service_plan_id(self) -> builtins.str:
        result = self._values.get("app_service_plan_id")
        assert result is not None, "Required property 'app_service_plan_id' is missing"
        return result

    @builtins.property
    def function_app_name(self) -> builtins.str:
        result = self._values.get("function_app_name")
        assert result is not None, "Required property 'function_app_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account_access_key(self) -> builtins.str:
        result = self._values.get("storage_account_access_key")
        assert result is not None, "Required property 'storage_account_access_key' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def app_settings(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("app_settings")
        return result

    @builtins.property
    def auth_settings(
        self,
    ) -> typing.Optional[typing.List[FunctionAppSlotAuthSettings]]:
        """auth_settings block."""
        result = self._values.get("auth_settings")
        return result

    @builtins.property
    def client_affinity_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("client_affinity_enabled")
        return result

    @builtins.property
    def connection_string(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotConnectionString"]]:
        """connection_string block."""
        result = self._values.get("connection_string")
        return result

    @builtins.property
    def daily_memory_time_quota(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("daily_memory_time_quota")
        return result

    @builtins.property
    def enable_builtin_logging(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_builtin_logging")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def https_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("https_only")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["FunctionAppSlotIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def os_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_type")
        return result

    @builtins.property
    def site_config(self) -> typing.Optional[typing.List["FunctionAppSlotSiteConfig"]]:
        """site_config block."""
        result = self._values.get("site_config")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["FunctionAppSlotTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotConnectionString",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "type": "type", "value": "value"},
)
class FunctionAppSlotConnectionString:
    def __init__(
        self,
        *,
        name: builtins.str,
        type: builtins.str,
        value: builtins.str,
    ) -> None:
        """
        :param name: -
        :param type: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "type": type,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotConnectionString(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class FunctionAppSlotIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotSiteConfig",
    jsii_struct_bases=[],
    name_mapping={
        "always_on": "alwaysOn",
        "auto_swap_slot_name": "autoSwapSlotName",
        "cors": "cors",
        "ftps_state": "ftpsState",
        "health_check_path": "healthCheckPath",
        "http2_enabled": "http2Enabled",
        "ip_restriction": "ipRestriction",
        "linux_fx_version": "linuxFxVersion",
        "min_tls_version": "minTlsVersion",
        "pre_warmed_instance_count": "preWarmedInstanceCount",
        "scm_ip_restriction": "scmIpRestriction",
        "scm_type": "scmType",
        "scm_use_main_ip_restriction": "scmUseMainIpRestriction",
        "use32_bit_worker_process": "use32BitWorkerProcess",
        "websockets_enabled": "websocketsEnabled",
    },
)
class FunctionAppSlotSiteConfig:
    def __init__(
        self,
        *,
        always_on: typing.Optional[builtins.bool] = None,
        auto_swap_slot_name: typing.Optional[builtins.str] = None,
        cors: typing.Optional[typing.List["FunctionAppSlotSiteConfigCors"]] = None,
        ftps_state: typing.Optional[builtins.str] = None,
        health_check_path: typing.Optional[builtins.str] = None,
        http2_enabled: typing.Optional[builtins.bool] = None,
        ip_restriction: typing.Optional[typing.List["FunctionAppSlotSiteConfigIpRestriction"]] = None,
        linux_fx_version: typing.Optional[builtins.str] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        pre_warmed_instance_count: typing.Optional[jsii.Number] = None,
        scm_ip_restriction: typing.Optional[typing.List["FunctionAppSlotSiteConfigScmIpRestriction"]] = None,
        scm_type: typing.Optional[builtins.str] = None,
        scm_use_main_ip_restriction: typing.Optional[builtins.bool] = None,
        use32_bit_worker_process: typing.Optional[builtins.bool] = None,
        websockets_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param always_on: -
        :param auto_swap_slot_name: -
        :param cors: cors block.
        :param ftps_state: -
        :param health_check_path: -
        :param http2_enabled: -
        :param ip_restriction: -
        :param linux_fx_version: -
        :param min_tls_version: -
        :param pre_warmed_instance_count: -
        :param scm_ip_restriction: -
        :param scm_type: -
        :param scm_use_main_ip_restriction: -
        :param use32_bit_worker_process: -
        :param websockets_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if always_on is not None:
            self._values["always_on"] = always_on
        if auto_swap_slot_name is not None:
            self._values["auto_swap_slot_name"] = auto_swap_slot_name
        if cors is not None:
            self._values["cors"] = cors
        if ftps_state is not None:
            self._values["ftps_state"] = ftps_state
        if health_check_path is not None:
            self._values["health_check_path"] = health_check_path
        if http2_enabled is not None:
            self._values["http2_enabled"] = http2_enabled
        if ip_restriction is not None:
            self._values["ip_restriction"] = ip_restriction
        if linux_fx_version is not None:
            self._values["linux_fx_version"] = linux_fx_version
        if min_tls_version is not None:
            self._values["min_tls_version"] = min_tls_version
        if pre_warmed_instance_count is not None:
            self._values["pre_warmed_instance_count"] = pre_warmed_instance_count
        if scm_ip_restriction is not None:
            self._values["scm_ip_restriction"] = scm_ip_restriction
        if scm_type is not None:
            self._values["scm_type"] = scm_type
        if scm_use_main_ip_restriction is not None:
            self._values["scm_use_main_ip_restriction"] = scm_use_main_ip_restriction
        if use32_bit_worker_process is not None:
            self._values["use32_bit_worker_process"] = use32_bit_worker_process
        if websockets_enabled is not None:
            self._values["websockets_enabled"] = websockets_enabled

    @builtins.property
    def always_on(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("always_on")
        return result

    @builtins.property
    def auto_swap_slot_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_swap_slot_name")
        return result

    @builtins.property
    def cors(self) -> typing.Optional[typing.List["FunctionAppSlotSiteConfigCors"]]:
        """cors block."""
        result = self._values.get("cors")
        return result

    @builtins.property
    def ftps_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ftps_state")
        return result

    @builtins.property
    def health_check_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("health_check_path")
        return result

    @builtins.property
    def http2_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("http2_enabled")
        return result

    @builtins.property
    def ip_restriction(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotSiteConfigIpRestriction"]]:
        result = self._values.get("ip_restriction")
        return result

    @builtins.property
    def linux_fx_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("linux_fx_version")
        return result

    @builtins.property
    def min_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_tls_version")
        return result

    @builtins.property
    def pre_warmed_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("pre_warmed_instance_count")
        return result

    @builtins.property
    def scm_ip_restriction(
        self,
    ) -> typing.Optional[typing.List["FunctionAppSlotSiteConfigScmIpRestriction"]]:
        result = self._values.get("scm_ip_restriction")
        return result

    @builtins.property
    def scm_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scm_type")
        return result

    @builtins.property
    def scm_use_main_ip_restriction(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("scm_use_main_ip_restriction")
        return result

    @builtins.property
    def use32_bit_worker_process(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use32_bit_worker_process")
        return result

    @builtins.property
    def websockets_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("websockets_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotSiteConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotSiteConfigCors",
    jsii_struct_bases=[],
    name_mapping={
        "allowed_origins": "allowedOrigins",
        "support_credentials": "supportCredentials",
    },
)
class FunctionAppSlotSiteConfigCors:
    def __init__(
        self,
        *,
        allowed_origins: typing.List[builtins.str],
        support_credentials: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param allowed_origins: -
        :param support_credentials: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_origins": allowed_origins,
        }
        if support_credentials is not None:
            self._values["support_credentials"] = support_credentials

    @builtins.property
    def allowed_origins(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_origins")
        assert result is not None, "Required property 'allowed_origins' is missing"
        return result

    @builtins.property
    def support_credentials(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("support_credentials")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotSiteConfigCors(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotSiteConfigIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class FunctionAppSlotSiteConfigIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotSiteConfigIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotSiteConfigScmIpRestriction",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "ip_address": "ipAddress",
        "name": "name",
        "priority": "priority",
        "subnet_id": "subnetId",
        "virtual_network_subnet_id": "virtualNetworkSubnetId",
    },
)
class FunctionAppSlotSiteConfigScmIpRestriction:
    def __init__(
        self,
        *,
        action: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param ip_address: -
        :param name: -
        :param priority: -
        :param subnet_id: -
        :param virtual_network_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if action is not None:
            self._values["action"] = action
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_subnet_id is not None:
            self._values["virtual_network_subnet_id"] = virtual_network_subnet_id

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotSiteConfigScmIpRestriction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class FunctionAppSlotSiteCredential(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.FunctionAppSlotSiteCredential",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(FunctionAppSlotSiteCredential, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSlotTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FunctionAppSlotTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSlotTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppSourceControl",
    jsii_struct_bases=[],
    name_mapping={
        "branch": "branch",
        "manual_integration": "manualIntegration",
        "repo_url": "repoUrl",
        "rollback_enabled": "rollbackEnabled",
        "use_mercurial": "useMercurial",
    },
)
class FunctionAppSourceControl:
    def __init__(
        self,
        *,
        branch: typing.Optional[builtins.str] = None,
        manual_integration: typing.Optional[builtins.bool] = None,
        repo_url: typing.Optional[builtins.str] = None,
        rollback_enabled: typing.Optional[builtins.bool] = None,
        use_mercurial: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param branch: -
        :param manual_integration: -
        :param repo_url: -
        :param rollback_enabled: -
        :param use_mercurial: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if branch is not None:
            self._values["branch"] = branch
        if manual_integration is not None:
            self._values["manual_integration"] = manual_integration
        if repo_url is not None:
            self._values["repo_url"] = repo_url
        if rollback_enabled is not None:
            self._values["rollback_enabled"] = rollback_enabled
        if use_mercurial is not None:
            self._values["use_mercurial"] = use_mercurial

    @builtins.property
    def branch(self) -> typing.Optional[builtins.str]:
        result = self._values.get("branch")
        return result

    @builtins.property
    def manual_integration(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manual_integration")
        return result

    @builtins.property
    def repo_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("repo_url")
        return result

    @builtins.property
    def rollback_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("rollback_enabled")
        return result

    @builtins.property
    def use_mercurial(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_mercurial")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppSourceControl(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.FunctionAppTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class FunctionAppTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "FunctionAppTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightHadoopCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightHadoopCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        component_version: typing.List["HdinsightHadoopClusterComponentVersion"],
        gateway: typing.List["HdinsightHadoopClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightHadoopClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightHadoopClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightHadoopClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightHadoopClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightHadoopClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightHadoopClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightHadoopClusterConfig(
            cluster_version=cluster_version,
            component_version=component_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            tier=tier,
            metastores=metastores,
            monitor=monitor,
            storage_account=storage_account,
            storage_account_gen2=storage_account_gen2,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightHadoopCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetastores")
    def reset_metastores(self) -> None:
        return jsii.invoke(self, "resetMetastores", [])

    @jsii.member(jsii_name="resetMonitor")
    def reset_monitor(self) -> None:
        return jsii.invoke(self, "resetMonitor", [])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetStorageAccountGen2")
    def reset_storage_account_gen2(self) -> None:
        return jsii.invoke(self, "resetStorageAccountGen2", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersionInput")
    def component_version_input(
        self,
    ) -> typing.List["HdinsightHadoopClusterComponentVersion"]:
        return jsii.get(self, "componentVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightHadoopClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightHadoopClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastoresInput")
    def metastores_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterMetastores"]]:
        return jsii.get(self, "metastoresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorInput")
    def monitor_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterMonitor"]]:
        return jsii.get(self, "monitorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2Input")
    def storage_account_gen2_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterStorageAccountGen2"]]:
        return jsii.get(self, "storageAccountGen2Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HdinsightHadoopClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersion")
    def component_version(
        self,
    ) -> typing.List["HdinsightHadoopClusterComponentVersion"]:
        return jsii.get(self, "componentVersion")

    @component_version.setter # type: ignore
    def component_version(
        self,
        value: typing.List["HdinsightHadoopClusterComponentVersion"],
    ) -> None:
        jsii.set(self, "componentVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightHadoopClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(self, value: typing.List["HdinsightHadoopClusterGateway"]) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastores")
    def metastores(self) -> typing.List["HdinsightHadoopClusterMetastores"]:
        return jsii.get(self, "metastores")

    @metastores.setter # type: ignore
    def metastores(
        self,
        value: typing.List["HdinsightHadoopClusterMetastores"],
    ) -> None:
        jsii.set(self, "metastores", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitor")
    def monitor(self) -> typing.List["HdinsightHadoopClusterMonitor"]:
        return jsii.get(self, "monitor")

    @monitor.setter # type: ignore
    def monitor(self, value: typing.List["HdinsightHadoopClusterMonitor"]) -> None:
        jsii.set(self, "monitor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightHadoopClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List["HdinsightHadoopClusterRoles"]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["HdinsightHadoopClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightHadoopClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2")
    def storage_account_gen2(
        self,
    ) -> typing.List["HdinsightHadoopClusterStorageAccountGen2"]:
        return jsii.get(self, "storageAccountGen2")

    @storage_account_gen2.setter # type: ignore
    def storage_account_gen2(
        self,
        value: typing.List["HdinsightHadoopClusterStorageAccountGen2"],
    ) -> None:
        jsii.set(self, "storageAccountGen2", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightHadoopClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightHadoopClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterComponentVersion",
    jsii_struct_bases=[],
    name_mapping={"hadoop": "hadoop"},
)
class HdinsightHadoopClusterComponentVersion:
    def __init__(self, *, hadoop: builtins.str) -> None:
        """
        :param hadoop: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "hadoop": hadoop,
        }

    @builtins.property
    def hadoop(self) -> builtins.str:
        result = self._values.get("hadoop")
        assert result is not None, "Required property 'hadoop' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterComponentVersion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "component_version": "componentVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "tier": "tier",
        "metastores": "metastores",
        "monitor": "monitor",
        "storage_account": "storageAccount",
        "storage_account_gen2": "storageAccountGen2",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightHadoopClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        component_version: typing.List[HdinsightHadoopClusterComponentVersion],
        gateway: typing.List["HdinsightHadoopClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightHadoopClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightHadoopClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightHadoopClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightHadoopClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightHadoopClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightHadoopClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightHadoopClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "component_version": component_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metastores is not None:
            self._values["metastores"] = metastores
        if monitor is not None:
            self._values["monitor"] = monitor
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if storage_account_gen2 is not None:
            self._values["storage_account_gen2"] = storage_account_gen2
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def component_version(self) -> typing.List[HdinsightHadoopClusterComponentVersion]:
        """component_version block."""
        result = self._values.get("component_version")
        assert result is not None, "Required property 'component_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightHadoopClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightHadoopClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def metastores(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterMetastores"]]:
        """metastores block."""
        result = self._values.get("metastores")
        return result

    @builtins.property
    def monitor(self) -> typing.Optional[typing.List["HdinsightHadoopClusterMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def storage_account_gen2(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterStorageAccountGen2"]]:
        """storage_account_gen2 block."""
        result = self._values.get("storage_account_gen2")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightHadoopClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightHadoopClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterMetastores",
    jsii_struct_bases=[],
    name_mapping={"ambari": "ambari", "hive": "hive", "oozie": "oozie"},
)
class HdinsightHadoopClusterMetastores:
    def __init__(
        self,
        *,
        ambari: typing.Optional[typing.List["HdinsightHadoopClusterMetastoresAmbari"]] = None,
        hive: typing.Optional[typing.List["HdinsightHadoopClusterMetastoresHive"]] = None,
        oozie: typing.Optional[typing.List["HdinsightHadoopClusterMetastoresOozie"]] = None,
    ) -> None:
        """
        :param ambari: ambari block.
        :param hive: hive block.
        :param oozie: oozie block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ambari is not None:
            self._values["ambari"] = ambari
        if hive is not None:
            self._values["hive"] = hive
        if oozie is not None:
            self._values["oozie"] = oozie

    @builtins.property
    def ambari(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterMetastoresAmbari"]]:
        """ambari block."""
        result = self._values.get("ambari")
        return result

    @builtins.property
    def hive(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterMetastoresHive"]]:
        """hive block."""
        result = self._values.get("hive")
        return result

    @builtins.property
    def oozie(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterMetastoresOozie"]]:
        """oozie block."""
        result = self._values.get("oozie")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterMetastores(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterMetastoresAmbari",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightHadoopClusterMetastoresAmbari:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterMetastoresAmbari(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterMetastoresHive",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightHadoopClusterMetastoresHive:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterMetastoresHive(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterMetastoresOozie",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightHadoopClusterMetastoresOozie:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterMetastoresOozie(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterMonitor",
    jsii_struct_bases=[],
    name_mapping={
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "primary_key": "primaryKey",
    },
)
class HdinsightHadoopClusterMonitor:
    def __init__(
        self,
        *,
        log_analytics_workspace_id: builtins.str,
        primary_key: builtins.str,
    ) -> None:
        """
        :param log_analytics_workspace_id: -
        :param primary_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "primary_key": primary_key,
        }

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def primary_key(self) -> builtins.str:
        result = self._values.get("primary_key")
        assert result is not None, "Required property 'primary_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
        "edge_node": "edgeNode",
    },
)
class HdinsightHadoopClusterRoles:
    def __init__(
        self,
        *,
        head_node: typing.List["HdinsightHadoopClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightHadoopClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightHadoopClusterRolesZookeeperNode"],
        edge_node: typing.Optional[typing.List["HdinsightHadoopClusterRolesEdgeNode"]] = None,
    ) -> None:
        """
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        :param edge_node: edge_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }
        if edge_node is not None:
            self._values["edge_node"] = edge_node

    @builtins.property
    def head_node(self) -> typing.List["HdinsightHadoopClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(self) -> typing.List["HdinsightHadoopClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(self) -> typing.List["HdinsightHadoopClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    @builtins.property
    def edge_node(
        self,
    ) -> typing.Optional[typing.List["HdinsightHadoopClusterRolesEdgeNode"]]:
        """edge_node block."""
        result = self._values.get("edge_node")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterRolesEdgeNode",
    jsii_struct_bases=[],
    name_mapping={
        "install_script_action": "installScriptAction",
        "target_instance_count": "targetInstanceCount",
        "vm_size": "vmSize",
    },
)
class HdinsightHadoopClusterRolesEdgeNode:
    def __init__(
        self,
        *,
        install_script_action: typing.List["HdinsightHadoopClusterRolesEdgeNodeInstallScriptAction"],
        target_instance_count: jsii.Number,
        vm_size: builtins.str,
    ) -> None:
        """
        :param install_script_action: install_script_action block.
        :param target_instance_count: -
        :param vm_size: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "install_script_action": install_script_action,
            "target_instance_count": target_instance_count,
            "vm_size": vm_size,
        }

    @builtins.property
    def install_script_action(
        self,
    ) -> typing.List["HdinsightHadoopClusterRolesEdgeNodeInstallScriptAction"]:
        """install_script_action block."""
        result = self._values.get("install_script_action")
        assert result is not None, "Required property 'install_script_action' is missing"
        return result

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterRolesEdgeNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterRolesEdgeNodeInstallScriptAction",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "uri": "uri"},
)
class HdinsightHadoopClusterRolesEdgeNodeInstallScriptAction:
    def __init__(self, *, name: builtins.str, uri: builtins.str) -> None:
        """
        :param name: -
        :param uri: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "uri": uri,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def uri(self) -> builtins.str:
        result = self._values.get("uri")
        assert result is not None, "Required property 'uri' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterRolesEdgeNodeInstallScriptAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightHadoopClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightHadoopClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightHadoopClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightHadoopClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterStorageAccountGen2",
    jsii_struct_bases=[],
    name_mapping={
        "filesystem_id": "filesystemId",
        "is_default": "isDefault",
        "managed_identity_resource_id": "managedIdentityResourceId",
        "storage_resource_id": "storageResourceId",
    },
)
class HdinsightHadoopClusterStorageAccountGen2:
    def __init__(
        self,
        *,
        filesystem_id: builtins.str,
        is_default: builtins.bool,
        managed_identity_resource_id: builtins.str,
        storage_resource_id: builtins.str,
    ) -> None:
        """
        :param filesystem_id: -
        :param is_default: -
        :param managed_identity_resource_id: -
        :param storage_resource_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "filesystem_id": filesystem_id,
            "is_default": is_default,
            "managed_identity_resource_id": managed_identity_resource_id,
            "storage_resource_id": storage_resource_id,
        }

    @builtins.property
    def filesystem_id(self) -> builtins.str:
        result = self._values.get("filesystem_id")
        assert result is not None, "Required property 'filesystem_id' is missing"
        return result

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def managed_identity_resource_id(self) -> builtins.str:
        result = self._values.get("managed_identity_resource_id")
        assert result is not None, "Required property 'managed_identity_resource_id' is missing"
        return result

    @builtins.property
    def storage_resource_id(self) -> builtins.str:
        result = self._values.get("storage_resource_id")
        assert result is not None, "Required property 'storage_resource_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterStorageAccountGen2(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHadoopClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightHadoopClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHadoopClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightHbaseCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightHbaseCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        component_version: typing.List["HdinsightHbaseClusterComponentVersion"],
        gateway: typing.List["HdinsightHbaseClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightHbaseClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightHbaseClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightHbaseClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightHbaseClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightHbaseClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightHbaseClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightHbaseClusterConfig(
            cluster_version=cluster_version,
            component_version=component_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            tier=tier,
            metastores=metastores,
            monitor=monitor,
            storage_account=storage_account,
            storage_account_gen2=storage_account_gen2,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightHbaseCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetastores")
    def reset_metastores(self) -> None:
        return jsii.invoke(self, "resetMetastores", [])

    @jsii.member(jsii_name="resetMonitor")
    def reset_monitor(self) -> None:
        return jsii.invoke(self, "resetMonitor", [])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetStorageAccountGen2")
    def reset_storage_account_gen2(self) -> None:
        return jsii.invoke(self, "resetStorageAccountGen2", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersionInput")
    def component_version_input(
        self,
    ) -> typing.List["HdinsightHbaseClusterComponentVersion"]:
        return jsii.get(self, "componentVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightHbaseClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightHbaseClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastoresInput")
    def metastores_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterMetastores"]]:
        return jsii.get(self, "metastoresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorInput")
    def monitor_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterMonitor"]]:
        return jsii.get(self, "monitorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2Input")
    def storage_account_gen2_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterStorageAccountGen2"]]:
        return jsii.get(self, "storageAccountGen2Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HdinsightHbaseClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersion")
    def component_version(self) -> typing.List["HdinsightHbaseClusterComponentVersion"]:
        return jsii.get(self, "componentVersion")

    @component_version.setter # type: ignore
    def component_version(
        self,
        value: typing.List["HdinsightHbaseClusterComponentVersion"],
    ) -> None:
        jsii.set(self, "componentVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightHbaseClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(self, value: typing.List["HdinsightHbaseClusterGateway"]) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastores")
    def metastores(self) -> typing.List["HdinsightHbaseClusterMetastores"]:
        return jsii.get(self, "metastores")

    @metastores.setter # type: ignore
    def metastores(self, value: typing.List["HdinsightHbaseClusterMetastores"]) -> None:
        jsii.set(self, "metastores", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitor")
    def monitor(self) -> typing.List["HdinsightHbaseClusterMonitor"]:
        return jsii.get(self, "monitor")

    @monitor.setter # type: ignore
    def monitor(self, value: typing.List["HdinsightHbaseClusterMonitor"]) -> None:
        jsii.set(self, "monitor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightHbaseClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List["HdinsightHbaseClusterRoles"]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["HdinsightHbaseClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightHbaseClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2")
    def storage_account_gen2(
        self,
    ) -> typing.List["HdinsightHbaseClusterStorageAccountGen2"]:
        return jsii.get(self, "storageAccountGen2")

    @storage_account_gen2.setter # type: ignore
    def storage_account_gen2(
        self,
        value: typing.List["HdinsightHbaseClusterStorageAccountGen2"],
    ) -> None:
        jsii.set(self, "storageAccountGen2", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightHbaseClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightHbaseClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterComponentVersion",
    jsii_struct_bases=[],
    name_mapping={"hbase": "hbase"},
)
class HdinsightHbaseClusterComponentVersion:
    def __init__(self, *, hbase: builtins.str) -> None:
        """
        :param hbase: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "hbase": hbase,
        }

    @builtins.property
    def hbase(self) -> builtins.str:
        result = self._values.get("hbase")
        assert result is not None, "Required property 'hbase' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterComponentVersion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "component_version": "componentVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "tier": "tier",
        "metastores": "metastores",
        "monitor": "monitor",
        "storage_account": "storageAccount",
        "storage_account_gen2": "storageAccountGen2",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightHbaseClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        component_version: typing.List[HdinsightHbaseClusterComponentVersion],
        gateway: typing.List["HdinsightHbaseClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightHbaseClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightHbaseClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightHbaseClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightHbaseClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightHbaseClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightHbaseClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightHbaseClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "component_version": component_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metastores is not None:
            self._values["metastores"] = metastores
        if monitor is not None:
            self._values["monitor"] = monitor
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if storage_account_gen2 is not None:
            self._values["storage_account_gen2"] = storage_account_gen2
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def component_version(self) -> typing.List[HdinsightHbaseClusterComponentVersion]:
        """component_version block."""
        result = self._values.get("component_version")
        assert result is not None, "Required property 'component_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightHbaseClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightHbaseClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def metastores(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterMetastores"]]:
        """metastores block."""
        result = self._values.get("metastores")
        return result

    @builtins.property
    def monitor(self) -> typing.Optional[typing.List["HdinsightHbaseClusterMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def storage_account_gen2(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterStorageAccountGen2"]]:
        """storage_account_gen2 block."""
        result = self._values.get("storage_account_gen2")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightHbaseClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightHbaseClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterMetastores",
    jsii_struct_bases=[],
    name_mapping={"ambari": "ambari", "hive": "hive", "oozie": "oozie"},
)
class HdinsightHbaseClusterMetastores:
    def __init__(
        self,
        *,
        ambari: typing.Optional[typing.List["HdinsightHbaseClusterMetastoresAmbari"]] = None,
        hive: typing.Optional[typing.List["HdinsightHbaseClusterMetastoresHive"]] = None,
        oozie: typing.Optional[typing.List["HdinsightHbaseClusterMetastoresOozie"]] = None,
    ) -> None:
        """
        :param ambari: ambari block.
        :param hive: hive block.
        :param oozie: oozie block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ambari is not None:
            self._values["ambari"] = ambari
        if hive is not None:
            self._values["hive"] = hive
        if oozie is not None:
            self._values["oozie"] = oozie

    @builtins.property
    def ambari(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterMetastoresAmbari"]]:
        """ambari block."""
        result = self._values.get("ambari")
        return result

    @builtins.property
    def hive(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterMetastoresHive"]]:
        """hive block."""
        result = self._values.get("hive")
        return result

    @builtins.property
    def oozie(
        self,
    ) -> typing.Optional[typing.List["HdinsightHbaseClusterMetastoresOozie"]]:
        """oozie block."""
        result = self._values.get("oozie")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterMetastores(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterMetastoresAmbari",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightHbaseClusterMetastoresAmbari:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterMetastoresAmbari(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterMetastoresHive",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightHbaseClusterMetastoresHive:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterMetastoresHive(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterMetastoresOozie",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightHbaseClusterMetastoresOozie:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterMetastoresOozie(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterMonitor",
    jsii_struct_bases=[],
    name_mapping={
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "primary_key": "primaryKey",
    },
)
class HdinsightHbaseClusterMonitor:
    def __init__(
        self,
        *,
        log_analytics_workspace_id: builtins.str,
        primary_key: builtins.str,
    ) -> None:
        """
        :param log_analytics_workspace_id: -
        :param primary_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "primary_key": primary_key,
        }

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def primary_key(self) -> builtins.str:
        result = self._values.get("primary_key")
        assert result is not None, "Required property 'primary_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
    },
)
class HdinsightHbaseClusterRoles:
    def __init__(
        self,
        *,
        head_node: typing.List["HdinsightHbaseClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightHbaseClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightHbaseClusterRolesZookeeperNode"],
    ) -> None:
        """
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }

    @builtins.property
    def head_node(self) -> typing.List["HdinsightHbaseClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(self) -> typing.List["HdinsightHbaseClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(self) -> typing.List["HdinsightHbaseClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightHbaseClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightHbaseClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightHbaseClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightHbaseClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterStorageAccountGen2",
    jsii_struct_bases=[],
    name_mapping={
        "filesystem_id": "filesystemId",
        "is_default": "isDefault",
        "managed_identity_resource_id": "managedIdentityResourceId",
        "storage_resource_id": "storageResourceId",
    },
)
class HdinsightHbaseClusterStorageAccountGen2:
    def __init__(
        self,
        *,
        filesystem_id: builtins.str,
        is_default: builtins.bool,
        managed_identity_resource_id: builtins.str,
        storage_resource_id: builtins.str,
    ) -> None:
        """
        :param filesystem_id: -
        :param is_default: -
        :param managed_identity_resource_id: -
        :param storage_resource_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "filesystem_id": filesystem_id,
            "is_default": is_default,
            "managed_identity_resource_id": managed_identity_resource_id,
            "storage_resource_id": storage_resource_id,
        }

    @builtins.property
    def filesystem_id(self) -> builtins.str:
        result = self._values.get("filesystem_id")
        assert result is not None, "Required property 'filesystem_id' is missing"
        return result

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def managed_identity_resource_id(self) -> builtins.str:
        result = self._values.get("managed_identity_resource_id")
        assert result is not None, "Required property 'managed_identity_resource_id' is missing"
        return result

    @builtins.property
    def storage_resource_id(self) -> builtins.str:
        result = self._values.get("storage_resource_id")
        assert result is not None, "Required property 'storage_resource_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterStorageAccountGen2(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightHbaseClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightHbaseClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightHbaseClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightInteractiveQueryCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightInteractiveQueryCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        component_version: typing.List["HdinsightInteractiveQueryClusterComponentVersion"],
        gateway: typing.List["HdinsightInteractiveQueryClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightInteractiveQueryClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightInteractiveQueryClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightInteractiveQueryClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightInteractiveQueryClusterConfig(
            cluster_version=cluster_version,
            component_version=component_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            tier=tier,
            metastores=metastores,
            monitor=monitor,
            storage_account=storage_account,
            storage_account_gen2=storage_account_gen2,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightInteractiveQueryCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetastores")
    def reset_metastores(self) -> None:
        return jsii.invoke(self, "resetMetastores", [])

    @jsii.member(jsii_name="resetMonitor")
    def reset_monitor(self) -> None:
        return jsii.invoke(self, "resetMonitor", [])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetStorageAccountGen2")
    def reset_storage_account_gen2(self) -> None:
        return jsii.invoke(self, "resetStorageAccountGen2", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersionInput")
    def component_version_input(
        self,
    ) -> typing.List["HdinsightInteractiveQueryClusterComponentVersion"]:
        return jsii.get(self, "componentVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightInteractiveQueryClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightInteractiveQueryClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastoresInput")
    def metastores_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastores"]]:
        return jsii.get(self, "metastoresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorInput")
    def monitor_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterMonitor"]]:
        return jsii.get(self, "monitorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2Input")
    def storage_account_gen2_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccountGen2"]]:
        return jsii.get(self, "storageAccountGen2Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["HdinsightInteractiveQueryClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersion")
    def component_version(
        self,
    ) -> typing.List["HdinsightInteractiveQueryClusterComponentVersion"]:
        return jsii.get(self, "componentVersion")

    @component_version.setter # type: ignore
    def component_version(
        self,
        value: typing.List["HdinsightInteractiveQueryClusterComponentVersion"],
    ) -> None:
        jsii.set(self, "componentVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightInteractiveQueryClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(
        self,
        value: typing.List["HdinsightInteractiveQueryClusterGateway"],
    ) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastores")
    def metastores(self) -> typing.List["HdinsightInteractiveQueryClusterMetastores"]:
        return jsii.get(self, "metastores")

    @metastores.setter # type: ignore
    def metastores(
        self,
        value: typing.List["HdinsightInteractiveQueryClusterMetastores"],
    ) -> None:
        jsii.set(self, "metastores", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitor")
    def monitor(self) -> typing.List["HdinsightInteractiveQueryClusterMonitor"]:
        return jsii.get(self, "monitor")

    @monitor.setter # type: ignore
    def monitor(
        self,
        value: typing.List["HdinsightInteractiveQueryClusterMonitor"],
    ) -> None:
        jsii.set(self, "monitor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightInteractiveQueryClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(
        self,
        value: typing.List["HdinsightInteractiveQueryClusterRoles"],
    ) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(
        self,
    ) -> typing.List["HdinsightInteractiveQueryClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightInteractiveQueryClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2")
    def storage_account_gen2(
        self,
    ) -> typing.List["HdinsightInteractiveQueryClusterStorageAccountGen2"]:
        return jsii.get(self, "storageAccountGen2")

    @storage_account_gen2.setter # type: ignore
    def storage_account_gen2(
        self,
        value: typing.List["HdinsightInteractiveQueryClusterStorageAccountGen2"],
    ) -> None:
        jsii.set(self, "storageAccountGen2", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightInteractiveQueryClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightInteractiveQueryClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterComponentVersion",
    jsii_struct_bases=[],
    name_mapping={"interactive_hive": "interactiveHive"},
)
class HdinsightInteractiveQueryClusterComponentVersion:
    def __init__(self, *, interactive_hive: builtins.str) -> None:
        """
        :param interactive_hive: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "interactive_hive": interactive_hive,
        }

    @builtins.property
    def interactive_hive(self) -> builtins.str:
        result = self._values.get("interactive_hive")
        assert result is not None, "Required property 'interactive_hive' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterComponentVersion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "component_version": "componentVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "tier": "tier",
        "metastores": "metastores",
        "monitor": "monitor",
        "storage_account": "storageAccount",
        "storage_account_gen2": "storageAccountGen2",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightInteractiveQueryClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        component_version: typing.List[HdinsightInteractiveQueryClusterComponentVersion],
        gateway: typing.List["HdinsightInteractiveQueryClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightInteractiveQueryClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightInteractiveQueryClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightInteractiveQueryClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightInteractiveQueryClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "component_version": component_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metastores is not None:
            self._values["metastores"] = metastores
        if monitor is not None:
            self._values["monitor"] = monitor
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if storage_account_gen2 is not None:
            self._values["storage_account_gen2"] = storage_account_gen2
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def component_version(
        self,
    ) -> typing.List[HdinsightInteractiveQueryClusterComponentVersion]:
        """component_version block."""
        result = self._values.get("component_version")
        assert result is not None, "Required property 'component_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightInteractiveQueryClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightInteractiveQueryClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def metastores(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastores"]]:
        """metastores block."""
        result = self._values.get("metastores")
        return result

    @builtins.property
    def monitor(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def storage_account_gen2(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterStorageAccountGen2"]]:
        """storage_account_gen2 block."""
        result = self._values.get("storage_account_gen2")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightInteractiveQueryClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightInteractiveQueryClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterMetastores",
    jsii_struct_bases=[],
    name_mapping={"ambari": "ambari", "hive": "hive", "oozie": "oozie"},
)
class HdinsightInteractiveQueryClusterMetastores:
    def __init__(
        self,
        *,
        ambari: typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastoresAmbari"]] = None,
        hive: typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastoresHive"]] = None,
        oozie: typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastoresOozie"]] = None,
    ) -> None:
        """
        :param ambari: ambari block.
        :param hive: hive block.
        :param oozie: oozie block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ambari is not None:
            self._values["ambari"] = ambari
        if hive is not None:
            self._values["hive"] = hive
        if oozie is not None:
            self._values["oozie"] = oozie

    @builtins.property
    def ambari(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastoresAmbari"]]:
        """ambari block."""
        result = self._values.get("ambari")
        return result

    @builtins.property
    def hive(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastoresHive"]]:
        """hive block."""
        result = self._values.get("hive")
        return result

    @builtins.property
    def oozie(
        self,
    ) -> typing.Optional[typing.List["HdinsightInteractiveQueryClusterMetastoresOozie"]]:
        """oozie block."""
        result = self._values.get("oozie")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterMetastores(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterMetastoresAmbari",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightInteractiveQueryClusterMetastoresAmbari:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterMetastoresAmbari(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterMetastoresHive",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightInteractiveQueryClusterMetastoresHive:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterMetastoresHive(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterMetastoresOozie",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightInteractiveQueryClusterMetastoresOozie:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterMetastoresOozie(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterMonitor",
    jsii_struct_bases=[],
    name_mapping={
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "primary_key": "primaryKey",
    },
)
class HdinsightInteractiveQueryClusterMonitor:
    def __init__(
        self,
        *,
        log_analytics_workspace_id: builtins.str,
        primary_key: builtins.str,
    ) -> None:
        """
        :param log_analytics_workspace_id: -
        :param primary_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "primary_key": primary_key,
        }

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def primary_key(self) -> builtins.str:
        result = self._values.get("primary_key")
        assert result is not None, "Required property 'primary_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
    },
)
class HdinsightInteractiveQueryClusterRoles:
    def __init__(
        self,
        *,
        head_node: typing.List["HdinsightInteractiveQueryClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightInteractiveQueryClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightInteractiveQueryClusterRolesZookeeperNode"],
    ) -> None:
        """
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }

    @builtins.property
    def head_node(self) -> typing.List["HdinsightInteractiveQueryClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(
        self,
    ) -> typing.List["HdinsightInteractiveQueryClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(
        self,
    ) -> typing.List["HdinsightInteractiveQueryClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightInteractiveQueryClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightInteractiveQueryClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightInteractiveQueryClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightInteractiveQueryClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterStorageAccountGen2",
    jsii_struct_bases=[],
    name_mapping={
        "filesystem_id": "filesystemId",
        "is_default": "isDefault",
        "managed_identity_resource_id": "managedIdentityResourceId",
        "storage_resource_id": "storageResourceId",
    },
)
class HdinsightInteractiveQueryClusterStorageAccountGen2:
    def __init__(
        self,
        *,
        filesystem_id: builtins.str,
        is_default: builtins.bool,
        managed_identity_resource_id: builtins.str,
        storage_resource_id: builtins.str,
    ) -> None:
        """
        :param filesystem_id: -
        :param is_default: -
        :param managed_identity_resource_id: -
        :param storage_resource_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "filesystem_id": filesystem_id,
            "is_default": is_default,
            "managed_identity_resource_id": managed_identity_resource_id,
            "storage_resource_id": storage_resource_id,
        }

    @builtins.property
    def filesystem_id(self) -> builtins.str:
        result = self._values.get("filesystem_id")
        assert result is not None, "Required property 'filesystem_id' is missing"
        return result

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def managed_identity_resource_id(self) -> builtins.str:
        result = self._values.get("managed_identity_resource_id")
        assert result is not None, "Required property 'managed_identity_resource_id' is missing"
        return result

    @builtins.property
    def storage_resource_id(self) -> builtins.str:
        result = self._values.get("storage_resource_id")
        assert result is not None, "Required property 'storage_resource_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterStorageAccountGen2(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightInteractiveQueryClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightInteractiveQueryClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightInteractiveQueryClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightKafkaCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightKafkaCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        component_version: typing.List["HdinsightKafkaClusterComponentVersion"],
        gateway: typing.List["HdinsightKafkaClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightKafkaClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightKafkaClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightKafkaClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightKafkaClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightKafkaClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightKafkaClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightKafkaClusterConfig(
            cluster_version=cluster_version,
            component_version=component_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            tier=tier,
            metastores=metastores,
            monitor=monitor,
            storage_account=storage_account,
            storage_account_gen2=storage_account_gen2,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightKafkaCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetastores")
    def reset_metastores(self) -> None:
        return jsii.invoke(self, "resetMetastores", [])

    @jsii.member(jsii_name="resetMonitor")
    def reset_monitor(self) -> None:
        return jsii.invoke(self, "resetMonitor", [])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetStorageAccountGen2")
    def reset_storage_account_gen2(self) -> None:
        return jsii.invoke(self, "resetStorageAccountGen2", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersionInput")
    def component_version_input(
        self,
    ) -> typing.List["HdinsightKafkaClusterComponentVersion"]:
        return jsii.get(self, "componentVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightKafkaClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightKafkaClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastoresInput")
    def metastores_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterMetastores"]]:
        return jsii.get(self, "metastoresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorInput")
    def monitor_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterMonitor"]]:
        return jsii.get(self, "monitorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2Input")
    def storage_account_gen2_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterStorageAccountGen2"]]:
        return jsii.get(self, "storageAccountGen2Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HdinsightKafkaClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersion")
    def component_version(self) -> typing.List["HdinsightKafkaClusterComponentVersion"]:
        return jsii.get(self, "componentVersion")

    @component_version.setter # type: ignore
    def component_version(
        self,
        value: typing.List["HdinsightKafkaClusterComponentVersion"],
    ) -> None:
        jsii.set(self, "componentVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightKafkaClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(self, value: typing.List["HdinsightKafkaClusterGateway"]) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastores")
    def metastores(self) -> typing.List["HdinsightKafkaClusterMetastores"]:
        return jsii.get(self, "metastores")

    @metastores.setter # type: ignore
    def metastores(self, value: typing.List["HdinsightKafkaClusterMetastores"]) -> None:
        jsii.set(self, "metastores", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitor")
    def monitor(self) -> typing.List["HdinsightKafkaClusterMonitor"]:
        return jsii.get(self, "monitor")

    @monitor.setter # type: ignore
    def monitor(self, value: typing.List["HdinsightKafkaClusterMonitor"]) -> None:
        jsii.set(self, "monitor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightKafkaClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List["HdinsightKafkaClusterRoles"]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["HdinsightKafkaClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightKafkaClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2")
    def storage_account_gen2(
        self,
    ) -> typing.List["HdinsightKafkaClusterStorageAccountGen2"]:
        return jsii.get(self, "storageAccountGen2")

    @storage_account_gen2.setter # type: ignore
    def storage_account_gen2(
        self,
        value: typing.List["HdinsightKafkaClusterStorageAccountGen2"],
    ) -> None:
        jsii.set(self, "storageAccountGen2", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightKafkaClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightKafkaClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterComponentVersion",
    jsii_struct_bases=[],
    name_mapping={"kafka": "kafka"},
)
class HdinsightKafkaClusterComponentVersion:
    def __init__(self, *, kafka: builtins.str) -> None:
        """
        :param kafka: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "kafka": kafka,
        }

    @builtins.property
    def kafka(self) -> builtins.str:
        result = self._values.get("kafka")
        assert result is not None, "Required property 'kafka' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterComponentVersion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "component_version": "componentVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "tier": "tier",
        "metastores": "metastores",
        "monitor": "monitor",
        "storage_account": "storageAccount",
        "storage_account_gen2": "storageAccountGen2",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightKafkaClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        component_version: typing.List[HdinsightKafkaClusterComponentVersion],
        gateway: typing.List["HdinsightKafkaClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightKafkaClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightKafkaClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightKafkaClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightKafkaClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightKafkaClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightKafkaClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightKafkaClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "component_version": component_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metastores is not None:
            self._values["metastores"] = metastores
        if monitor is not None:
            self._values["monitor"] = monitor
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if storage_account_gen2 is not None:
            self._values["storage_account_gen2"] = storage_account_gen2
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def component_version(self) -> typing.List[HdinsightKafkaClusterComponentVersion]:
        """component_version block."""
        result = self._values.get("component_version")
        assert result is not None, "Required property 'component_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightKafkaClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightKafkaClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def metastores(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterMetastores"]]:
        """metastores block."""
        result = self._values.get("metastores")
        return result

    @builtins.property
    def monitor(self) -> typing.Optional[typing.List["HdinsightKafkaClusterMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def storage_account_gen2(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterStorageAccountGen2"]]:
        """storage_account_gen2 block."""
        result = self._values.get("storage_account_gen2")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightKafkaClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightKafkaClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterMetastores",
    jsii_struct_bases=[],
    name_mapping={"ambari": "ambari", "hive": "hive", "oozie": "oozie"},
)
class HdinsightKafkaClusterMetastores:
    def __init__(
        self,
        *,
        ambari: typing.Optional[typing.List["HdinsightKafkaClusterMetastoresAmbari"]] = None,
        hive: typing.Optional[typing.List["HdinsightKafkaClusterMetastoresHive"]] = None,
        oozie: typing.Optional[typing.List["HdinsightKafkaClusterMetastoresOozie"]] = None,
    ) -> None:
        """
        :param ambari: ambari block.
        :param hive: hive block.
        :param oozie: oozie block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ambari is not None:
            self._values["ambari"] = ambari
        if hive is not None:
            self._values["hive"] = hive
        if oozie is not None:
            self._values["oozie"] = oozie

    @builtins.property
    def ambari(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterMetastoresAmbari"]]:
        """ambari block."""
        result = self._values.get("ambari")
        return result

    @builtins.property
    def hive(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterMetastoresHive"]]:
        """hive block."""
        result = self._values.get("hive")
        return result

    @builtins.property
    def oozie(
        self,
    ) -> typing.Optional[typing.List["HdinsightKafkaClusterMetastoresOozie"]]:
        """oozie block."""
        result = self._values.get("oozie")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterMetastores(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterMetastoresAmbari",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightKafkaClusterMetastoresAmbari:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterMetastoresAmbari(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterMetastoresHive",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightKafkaClusterMetastoresHive:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterMetastoresHive(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterMetastoresOozie",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightKafkaClusterMetastoresOozie:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterMetastoresOozie(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterMonitor",
    jsii_struct_bases=[],
    name_mapping={
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "primary_key": "primaryKey",
    },
)
class HdinsightKafkaClusterMonitor:
    def __init__(
        self,
        *,
        log_analytics_workspace_id: builtins.str,
        primary_key: builtins.str,
    ) -> None:
        """
        :param log_analytics_workspace_id: -
        :param primary_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "primary_key": primary_key,
        }

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def primary_key(self) -> builtins.str:
        result = self._values.get("primary_key")
        assert result is not None, "Required property 'primary_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
    },
)
class HdinsightKafkaClusterRoles:
    def __init__(
        self,
        *,
        head_node: typing.List["HdinsightKafkaClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightKafkaClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightKafkaClusterRolesZookeeperNode"],
    ) -> None:
        """
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }

    @builtins.property
    def head_node(self) -> typing.List["HdinsightKafkaClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(self) -> typing.List["HdinsightKafkaClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(self) -> typing.List["HdinsightKafkaClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightKafkaClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "number_of_disks_per_node": "numberOfDisksPerNode",
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightKafkaClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        number_of_disks_per_node: jsii.Number,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param number_of_disks_per_node: -
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "number_of_disks_per_node": number_of_disks_per_node,
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def number_of_disks_per_node(self) -> jsii.Number:
        result = self._values.get("number_of_disks_per_node")
        assert result is not None, "Required property 'number_of_disks_per_node' is missing"
        return result

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightKafkaClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightKafkaClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterStorageAccountGen2",
    jsii_struct_bases=[],
    name_mapping={
        "filesystem_id": "filesystemId",
        "is_default": "isDefault",
        "managed_identity_resource_id": "managedIdentityResourceId",
        "storage_resource_id": "storageResourceId",
    },
)
class HdinsightKafkaClusterStorageAccountGen2:
    def __init__(
        self,
        *,
        filesystem_id: builtins.str,
        is_default: builtins.bool,
        managed_identity_resource_id: builtins.str,
        storage_resource_id: builtins.str,
    ) -> None:
        """
        :param filesystem_id: -
        :param is_default: -
        :param managed_identity_resource_id: -
        :param storage_resource_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "filesystem_id": filesystem_id,
            "is_default": is_default,
            "managed_identity_resource_id": managed_identity_resource_id,
            "storage_resource_id": storage_resource_id,
        }

    @builtins.property
    def filesystem_id(self) -> builtins.str:
        result = self._values.get("filesystem_id")
        assert result is not None, "Required property 'filesystem_id' is missing"
        return result

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def managed_identity_resource_id(self) -> builtins.str:
        result = self._values.get("managed_identity_resource_id")
        assert result is not None, "Required property 'managed_identity_resource_id' is missing"
        return result

    @builtins.property
    def storage_resource_id(self) -> builtins.str:
        result = self._values.get("storage_resource_id")
        assert result is not None, "Required property 'storage_resource_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterStorageAccountGen2(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightKafkaClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightKafkaClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightKafkaClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightMlServicesCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightMlServicesCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        gateway: typing.List["HdinsightMlServicesClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightMlServicesClusterRoles"],
        rstudio: builtins.bool,
        tier: builtins.str,
        storage_account: typing.Optional[typing.List["HdinsightMlServicesClusterStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightMlServicesClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param rstudio: -
        :param tier: -
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightMlServicesClusterConfig(
            cluster_version=cluster_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            rstudio=rstudio,
            tier=tier,
            storage_account=storage_account,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightMlServicesCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="edgeSshEndpoint")
    def edge_ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "edgeSshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightMlServicesClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightMlServicesClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rstudioInput")
    def rstudio_input(self) -> builtins.bool:
        return jsii.get(self, "rstudioInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightMlServicesClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HdinsightMlServicesClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightMlServicesClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(self, value: typing.List["HdinsightMlServicesClusterGateway"]) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightMlServicesClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List["HdinsightMlServicesClusterRoles"]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rstudio")
    def rstudio(self) -> builtins.bool:
        return jsii.get(self, "rstudio")

    @rstudio.setter # type: ignore
    def rstudio(self, value: builtins.bool) -> None:
        jsii.set(self, "rstudio", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(
        self,
    ) -> typing.List["HdinsightMlServicesClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightMlServicesClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightMlServicesClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightMlServicesClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "rstudio": "rstudio",
        "tier": "tier",
        "storage_account": "storageAccount",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightMlServicesClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        gateway: typing.List["HdinsightMlServicesClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightMlServicesClusterRoles"],
        rstudio: builtins.bool,
        tier: builtins.str,
        storage_account: typing.Optional[typing.List["HdinsightMlServicesClusterStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightMlServicesClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param rstudio: -
        :param tier: -
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightMlServicesClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "rstudio": rstudio,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightMlServicesClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightMlServicesClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def rstudio(self) -> builtins.bool:
        result = self._values.get("rstudio")
        assert result is not None, "Required property 'rstudio' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightMlServicesClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightMlServicesClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightMlServicesClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "edge_node": "edgeNode",
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
    },
)
class HdinsightMlServicesClusterRoles:
    def __init__(
        self,
        *,
        edge_node: typing.List["HdinsightMlServicesClusterRolesEdgeNode"],
        head_node: typing.List["HdinsightMlServicesClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightMlServicesClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightMlServicesClusterRolesZookeeperNode"],
    ) -> None:
        """
        :param edge_node: edge_node block.
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "edge_node": edge_node,
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }

    @builtins.property
    def edge_node(self) -> typing.List["HdinsightMlServicesClusterRolesEdgeNode"]:
        """edge_node block."""
        result = self._values.get("edge_node")
        assert result is not None, "Required property 'edge_node' is missing"
        return result

    @builtins.property
    def head_node(self) -> typing.List["HdinsightMlServicesClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(self) -> typing.List["HdinsightMlServicesClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(
        self,
    ) -> typing.List["HdinsightMlServicesClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterRolesEdgeNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightMlServicesClusterRolesEdgeNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterRolesEdgeNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightMlServicesClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightMlServicesClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightMlServicesClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightMlServicesClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightMlServicesClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightMlServicesClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightMlServicesClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightRserverCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightRserverCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        gateway: typing.List["HdinsightRserverClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightRserverClusterRoles"],
        rstudio: builtins.bool,
        tier: builtins.str,
        storage_account: typing.Optional[typing.List["HdinsightRserverClusterStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightRserverClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param rstudio: -
        :param tier: -
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightRserverClusterConfig(
            cluster_version=cluster_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            rstudio=rstudio,
            tier=tier,
            storage_account=storage_account,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightRserverCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="edgeSshEndpoint")
    def edge_ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "edgeSshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightRserverClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightRserverClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rstudioInput")
    def rstudio_input(self) -> builtins.bool:
        return jsii.get(self, "rstudioInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightRserverClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HdinsightRserverClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightRserverClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(self, value: typing.List["HdinsightRserverClusterGateway"]) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightRserverClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List["HdinsightRserverClusterRoles"]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rstudio")
    def rstudio(self) -> builtins.bool:
        return jsii.get(self, "rstudio")

    @rstudio.setter # type: ignore
    def rstudio(self, value: builtins.bool) -> None:
        jsii.set(self, "rstudio", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["HdinsightRserverClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightRserverClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightRserverClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightRserverClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "rstudio": "rstudio",
        "tier": "tier",
        "storage_account": "storageAccount",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightRserverClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        gateway: typing.List["HdinsightRserverClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightRserverClusterRoles"],
        rstudio: builtins.bool,
        tier: builtins.str,
        storage_account: typing.Optional[typing.List["HdinsightRserverClusterStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightRserverClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param rstudio: -
        :param tier: -
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightRserverClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "rstudio": rstudio,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightRserverClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightRserverClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def rstudio(self) -> builtins.bool:
        result = self._values.get("rstudio")
        assert result is not None, "Required property 'rstudio' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightRserverClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightRserverClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightRserverClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "edge_node": "edgeNode",
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
    },
)
class HdinsightRserverClusterRoles:
    def __init__(
        self,
        *,
        edge_node: typing.List["HdinsightRserverClusterRolesEdgeNode"],
        head_node: typing.List["HdinsightRserverClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightRserverClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightRserverClusterRolesZookeeperNode"],
    ) -> None:
        """
        :param edge_node: edge_node block.
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "edge_node": edge_node,
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }

    @builtins.property
    def edge_node(self) -> typing.List["HdinsightRserverClusterRolesEdgeNode"]:
        """edge_node block."""
        result = self._values.get("edge_node")
        assert result is not None, "Required property 'edge_node' is missing"
        return result

    @builtins.property
    def head_node(self) -> typing.List["HdinsightRserverClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(self) -> typing.List["HdinsightRserverClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(
        self,
    ) -> typing.List["HdinsightRserverClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterRolesEdgeNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightRserverClusterRolesEdgeNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterRolesEdgeNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightRserverClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightRserverClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightRserverClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightRserverClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightRserverClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightRserverClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightRserverClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightSparkCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightSparkCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        component_version: typing.List["HdinsightSparkClusterComponentVersion"],
        gateway: typing.List["HdinsightSparkClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightSparkClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightSparkClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightSparkClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightSparkClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightSparkClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightSparkClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightSparkClusterConfig(
            cluster_version=cluster_version,
            component_version=component_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            tier=tier,
            metastores=metastores,
            monitor=monitor,
            storage_account=storage_account,
            storage_account_gen2=storage_account_gen2,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightSparkCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetastores")
    def reset_metastores(self) -> None:
        return jsii.invoke(self, "resetMetastores", [])

    @jsii.member(jsii_name="resetMonitor")
    def reset_monitor(self) -> None:
        return jsii.invoke(self, "resetMonitor", [])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetStorageAccountGen2")
    def reset_storage_account_gen2(self) -> None:
        return jsii.invoke(self, "resetStorageAccountGen2", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersionInput")
    def component_version_input(
        self,
    ) -> typing.List["HdinsightSparkClusterComponentVersion"]:
        return jsii.get(self, "componentVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightSparkClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightSparkClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastoresInput")
    def metastores_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterMetastores"]]:
        return jsii.get(self, "metastoresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorInput")
    def monitor_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterMonitor"]]:
        return jsii.get(self, "monitorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2Input")
    def storage_account_gen2_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterStorageAccountGen2"]]:
        return jsii.get(self, "storageAccountGen2Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HdinsightSparkClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersion")
    def component_version(self) -> typing.List["HdinsightSparkClusterComponentVersion"]:
        return jsii.get(self, "componentVersion")

    @component_version.setter # type: ignore
    def component_version(
        self,
        value: typing.List["HdinsightSparkClusterComponentVersion"],
    ) -> None:
        jsii.set(self, "componentVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightSparkClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(self, value: typing.List["HdinsightSparkClusterGateway"]) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastores")
    def metastores(self) -> typing.List["HdinsightSparkClusterMetastores"]:
        return jsii.get(self, "metastores")

    @metastores.setter # type: ignore
    def metastores(self, value: typing.List["HdinsightSparkClusterMetastores"]) -> None:
        jsii.set(self, "metastores", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitor")
    def monitor(self) -> typing.List["HdinsightSparkClusterMonitor"]:
        return jsii.get(self, "monitor")

    @monitor.setter # type: ignore
    def monitor(self, value: typing.List["HdinsightSparkClusterMonitor"]) -> None:
        jsii.set(self, "monitor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightSparkClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List["HdinsightSparkClusterRoles"]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["HdinsightSparkClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightSparkClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountGen2")
    def storage_account_gen2(
        self,
    ) -> typing.List["HdinsightSparkClusterStorageAccountGen2"]:
        return jsii.get(self, "storageAccountGen2")

    @storage_account_gen2.setter # type: ignore
    def storage_account_gen2(
        self,
        value: typing.List["HdinsightSparkClusterStorageAccountGen2"],
    ) -> None:
        jsii.set(self, "storageAccountGen2", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightSparkClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightSparkClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterComponentVersion",
    jsii_struct_bases=[],
    name_mapping={"spark": "spark"},
)
class HdinsightSparkClusterComponentVersion:
    def __init__(self, *, spark: builtins.str) -> None:
        """
        :param spark: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "spark": spark,
        }

    @builtins.property
    def spark(self) -> builtins.str:
        result = self._values.get("spark")
        assert result is not None, "Required property 'spark' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterComponentVersion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "component_version": "componentVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "tier": "tier",
        "metastores": "metastores",
        "monitor": "monitor",
        "storage_account": "storageAccount",
        "storage_account_gen2": "storageAccountGen2",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightSparkClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        component_version: typing.List[HdinsightSparkClusterComponentVersion],
        gateway: typing.List["HdinsightSparkClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightSparkClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightSparkClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightSparkClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightSparkClusterStorageAccount"]] = None,
        storage_account_gen2: typing.Optional[typing.List["HdinsightSparkClusterStorageAccountGen2"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightSparkClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param storage_account_gen2: storage_account_gen2 block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightSparkClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "component_version": component_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metastores is not None:
            self._values["metastores"] = metastores
        if monitor is not None:
            self._values["monitor"] = monitor
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if storage_account_gen2 is not None:
            self._values["storage_account_gen2"] = storage_account_gen2
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def component_version(self) -> typing.List[HdinsightSparkClusterComponentVersion]:
        """component_version block."""
        result = self._values.get("component_version")
        assert result is not None, "Required property 'component_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightSparkClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightSparkClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def metastores(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterMetastores"]]:
        """metastores block."""
        result = self._values.get("metastores")
        return result

    @builtins.property
    def monitor(self) -> typing.Optional[typing.List["HdinsightSparkClusterMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def storage_account_gen2(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterStorageAccountGen2"]]:
        """storage_account_gen2 block."""
        result = self._values.get("storage_account_gen2")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightSparkClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightSparkClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterMetastores",
    jsii_struct_bases=[],
    name_mapping={"ambari": "ambari", "hive": "hive", "oozie": "oozie"},
)
class HdinsightSparkClusterMetastores:
    def __init__(
        self,
        *,
        ambari: typing.Optional[typing.List["HdinsightSparkClusterMetastoresAmbari"]] = None,
        hive: typing.Optional[typing.List["HdinsightSparkClusterMetastoresHive"]] = None,
        oozie: typing.Optional[typing.List["HdinsightSparkClusterMetastoresOozie"]] = None,
    ) -> None:
        """
        :param ambari: ambari block.
        :param hive: hive block.
        :param oozie: oozie block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ambari is not None:
            self._values["ambari"] = ambari
        if hive is not None:
            self._values["hive"] = hive
        if oozie is not None:
            self._values["oozie"] = oozie

    @builtins.property
    def ambari(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterMetastoresAmbari"]]:
        """ambari block."""
        result = self._values.get("ambari")
        return result

    @builtins.property
    def hive(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterMetastoresHive"]]:
        """hive block."""
        result = self._values.get("hive")
        return result

    @builtins.property
    def oozie(
        self,
    ) -> typing.Optional[typing.List["HdinsightSparkClusterMetastoresOozie"]]:
        """oozie block."""
        result = self._values.get("oozie")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterMetastores(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterMetastoresAmbari",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightSparkClusterMetastoresAmbari:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterMetastoresAmbari(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterMetastoresHive",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightSparkClusterMetastoresHive:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterMetastoresHive(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterMetastoresOozie",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightSparkClusterMetastoresOozie:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterMetastoresOozie(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterMonitor",
    jsii_struct_bases=[],
    name_mapping={
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "primary_key": "primaryKey",
    },
)
class HdinsightSparkClusterMonitor:
    def __init__(
        self,
        *,
        log_analytics_workspace_id: builtins.str,
        primary_key: builtins.str,
    ) -> None:
        """
        :param log_analytics_workspace_id: -
        :param primary_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "primary_key": primary_key,
        }

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def primary_key(self) -> builtins.str:
        result = self._values.get("primary_key")
        assert result is not None, "Required property 'primary_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
    },
)
class HdinsightSparkClusterRoles:
    def __init__(
        self,
        *,
        head_node: typing.List["HdinsightSparkClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightSparkClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightSparkClusterRolesZookeeperNode"],
    ) -> None:
        """
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }

    @builtins.property
    def head_node(self) -> typing.List["HdinsightSparkClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(self) -> typing.List["HdinsightSparkClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(self) -> typing.List["HdinsightSparkClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightSparkClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightSparkClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightSparkClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightSparkClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterStorageAccountGen2",
    jsii_struct_bases=[],
    name_mapping={
        "filesystem_id": "filesystemId",
        "is_default": "isDefault",
        "managed_identity_resource_id": "managedIdentityResourceId",
        "storage_resource_id": "storageResourceId",
    },
)
class HdinsightSparkClusterStorageAccountGen2:
    def __init__(
        self,
        *,
        filesystem_id: builtins.str,
        is_default: builtins.bool,
        managed_identity_resource_id: builtins.str,
        storage_resource_id: builtins.str,
    ) -> None:
        """
        :param filesystem_id: -
        :param is_default: -
        :param managed_identity_resource_id: -
        :param storage_resource_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "filesystem_id": filesystem_id,
            "is_default": is_default,
            "managed_identity_resource_id": managed_identity_resource_id,
            "storage_resource_id": storage_resource_id,
        }

    @builtins.property
    def filesystem_id(self) -> builtins.str:
        result = self._values.get("filesystem_id")
        assert result is not None, "Required property 'filesystem_id' is missing"
        return result

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def managed_identity_resource_id(self) -> builtins.str:
        result = self._values.get("managed_identity_resource_id")
        assert result is not None, "Required property 'managed_identity_resource_id' is missing"
        return result

    @builtins.property
    def storage_resource_id(self) -> builtins.str:
        result = self._values.get("storage_resource_id")
        assert result is not None, "Required property 'storage_resource_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterStorageAccountGen2(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightSparkClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightSparkClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightSparkClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HdinsightStormCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HdinsightStormCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_version: builtins.str,
        component_version: typing.List["HdinsightStormClusterComponentVersion"],
        gateway: typing.List["HdinsightStormClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightStormClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightStormClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightStormClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightStormClusterStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightStormClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HdinsightStormClusterConfig(
            cluster_version=cluster_version,
            component_version=component_version,
            gateway=gateway,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            roles=roles,
            tier=tier,
            metastores=metastores,
            monitor=monitor,
            storage_account=storage_account,
            tags=tags,
            timeouts=timeouts,
            tls_min_version=tls_min_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HdinsightStormCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetastores")
    def reset_metastores(self) -> None:
        return jsii.invoke(self, "resetMetastores", [])

    @jsii.member(jsii_name="resetMonitor")
    def reset_monitor(self) -> None:
        return jsii.invoke(self, "resetMonitor", [])

    @jsii.member(jsii_name="resetStorageAccount")
    def reset_storage_account(self) -> None:
        return jsii.invoke(self, "resetStorageAccount", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTlsMinVersion")
    def reset_tls_min_version(self) -> None:
        return jsii.invoke(self, "resetTlsMinVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersionInput")
    def cluster_version_input(self) -> builtins.str:
        return jsii.get(self, "clusterVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersionInput")
    def component_version_input(
        self,
    ) -> typing.List["HdinsightStormClusterComponentVersion"]:
        return jsii.get(self, "componentVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayInput")
    def gateway_input(self) -> typing.List["HdinsightStormClusterGateway"]:
        return jsii.get(self, "gatewayInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="httpsEndpoint")
    def https_endpoint(self) -> builtins.str:
        return jsii.get(self, "httpsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List["HdinsightStormClusterRoles"]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sshEndpoint")
    def ssh_endpoint(self) -> builtins.str:
        return jsii.get(self, "sshEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastoresInput")
    def metastores_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterMetastores"]]:
        return jsii.get(self, "metastoresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorInput")
    def monitor_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterMonitor"]]:
        return jsii.get(self, "monitorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterStorageAccount"]]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HdinsightStormClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersionInput")
    def tls_min_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tlsMinVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterVersion")
    def cluster_version(self) -> builtins.str:
        return jsii.get(self, "clusterVersion")

    @cluster_version.setter # type: ignore
    def cluster_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="componentVersion")
    def component_version(self) -> typing.List["HdinsightStormClusterComponentVersion"]:
        return jsii.get(self, "componentVersion")

    @component_version.setter # type: ignore
    def component_version(
        self,
        value: typing.List["HdinsightStormClusterComponentVersion"],
    ) -> None:
        jsii.set(self, "componentVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gateway")
    def gateway(self) -> typing.List["HdinsightStormClusterGateway"]:
        return jsii.get(self, "gateway")

    @gateway.setter # type: ignore
    def gateway(self, value: typing.List["HdinsightStormClusterGateway"]) -> None:
        jsii.set(self, "gateway", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metastores")
    def metastores(self) -> typing.List["HdinsightStormClusterMetastores"]:
        return jsii.get(self, "metastores")

    @metastores.setter # type: ignore
    def metastores(self, value: typing.List["HdinsightStormClusterMetastores"]) -> None:
        jsii.set(self, "metastores", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitor")
    def monitor(self) -> typing.List["HdinsightStormClusterMonitor"]:
        return jsii.get(self, "monitor")

    @monitor.setter # type: ignore
    def monitor(self, value: typing.List["HdinsightStormClusterMonitor"]) -> None:
        jsii.set(self, "monitor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List["HdinsightStormClusterRoles"]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List["HdinsightStormClusterRoles"]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["HdinsightStormClusterStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["HdinsightStormClusterStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HdinsightStormClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HdinsightStormClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tlsMinVersion")
    def tls_min_version(self) -> builtins.str:
        return jsii.get(self, "tlsMinVersion")

    @tls_min_version.setter # type: ignore
    def tls_min_version(self, value: builtins.str) -> None:
        jsii.set(self, "tlsMinVersion", value)


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterComponentVersion",
    jsii_struct_bases=[],
    name_mapping={"storm": "storm"},
)
class HdinsightStormClusterComponentVersion:
    def __init__(self, *, storm: builtins.str) -> None:
        """
        :param storm: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "storm": storm,
        }

    @builtins.property
    def storm(self) -> builtins.str:
        result = self._values.get("storm")
        assert result is not None, "Required property 'storm' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterComponentVersion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_version": "clusterVersion",
        "component_version": "componentVersion",
        "gateway": "gateway",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "roles": "roles",
        "tier": "tier",
        "metastores": "metastores",
        "monitor": "monitor",
        "storage_account": "storageAccount",
        "tags": "tags",
        "timeouts": "timeouts",
        "tls_min_version": "tlsMinVersion",
    },
)
class HdinsightStormClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_version: builtins.str,
        component_version: typing.List[HdinsightStormClusterComponentVersion],
        gateway: typing.List["HdinsightStormClusterGateway"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        roles: typing.List["HdinsightStormClusterRoles"],
        tier: builtins.str,
        metastores: typing.Optional[typing.List["HdinsightStormClusterMetastores"]] = None,
        monitor: typing.Optional[typing.List["HdinsightStormClusterMonitor"]] = None,
        storage_account: typing.Optional[typing.List["HdinsightStormClusterStorageAccount"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HdinsightStormClusterTimeouts"] = None,
        tls_min_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_version: -
        :param component_version: component_version block.
        :param gateway: gateway block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param roles: roles block.
        :param tier: -
        :param metastores: metastores block.
        :param monitor: monitor block.
        :param storage_account: storage_account block.
        :param tags: -
        :param timeouts: timeouts block.
        :param tls_min_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HdinsightStormClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_version": cluster_version,
            "component_version": component_version,
            "gateway": gateway,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "roles": roles,
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metastores is not None:
            self._values["metastores"] = metastores
        if monitor is not None:
            self._values["monitor"] = monitor
        if storage_account is not None:
            self._values["storage_account"] = storage_account
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if tls_min_version is not None:
            self._values["tls_min_version"] = tls_min_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_version(self) -> builtins.str:
        result = self._values.get("cluster_version")
        assert result is not None, "Required property 'cluster_version' is missing"
        return result

    @builtins.property
    def component_version(self) -> typing.List[HdinsightStormClusterComponentVersion]:
        """component_version block."""
        result = self._values.get("component_version")
        assert result is not None, "Required property 'component_version' is missing"
        return result

    @builtins.property
    def gateway(self) -> typing.List["HdinsightStormClusterGateway"]:
        """gateway block."""
        result = self._values.get("gateway")
        assert result is not None, "Required property 'gateway' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List["HdinsightStormClusterRoles"]:
        """roles block."""
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def metastores(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterMetastores"]]:
        """metastores block."""
        result = self._values.get("metastores")
        return result

    @builtins.property
    def monitor(self) -> typing.Optional[typing.List["HdinsightStormClusterMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def storage_account(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterStorageAccount"]]:
        """storage_account block."""
        result = self._values.get("storage_account")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HdinsightStormClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def tls_min_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tls_min_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterGateway",
    jsii_struct_bases=[],
    name_mapping={
        "password": "password",
        "username": "username",
        "enabled": "enabled",
    },
)
class HdinsightStormClusterGateway:
    def __init__(
        self,
        *,
        password: builtins.str,
        username: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param password: -
        :param username: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterGateway(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterMetastores",
    jsii_struct_bases=[],
    name_mapping={"ambari": "ambari", "hive": "hive", "oozie": "oozie"},
)
class HdinsightStormClusterMetastores:
    def __init__(
        self,
        *,
        ambari: typing.Optional[typing.List["HdinsightStormClusterMetastoresAmbari"]] = None,
        hive: typing.Optional[typing.List["HdinsightStormClusterMetastoresHive"]] = None,
        oozie: typing.Optional[typing.List["HdinsightStormClusterMetastoresOozie"]] = None,
    ) -> None:
        """
        :param ambari: ambari block.
        :param hive: hive block.
        :param oozie: oozie block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ambari is not None:
            self._values["ambari"] = ambari
        if hive is not None:
            self._values["hive"] = hive
        if oozie is not None:
            self._values["oozie"] = oozie

    @builtins.property
    def ambari(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterMetastoresAmbari"]]:
        """ambari block."""
        result = self._values.get("ambari")
        return result

    @builtins.property
    def hive(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterMetastoresHive"]]:
        """hive block."""
        result = self._values.get("hive")
        return result

    @builtins.property
    def oozie(
        self,
    ) -> typing.Optional[typing.List["HdinsightStormClusterMetastoresOozie"]]:
        """oozie block."""
        result = self._values.get("oozie")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterMetastores(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterMetastoresAmbari",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightStormClusterMetastoresAmbari:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterMetastoresAmbari(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterMetastoresHive",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightStormClusterMetastoresHive:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterMetastoresHive(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterMetastoresOozie",
    jsii_struct_bases=[],
    name_mapping={
        "database_name": "databaseName",
        "password": "password",
        "server": "server",
        "username": "username",
    },
)
class HdinsightStormClusterMetastoresOozie:
    def __init__(
        self,
        *,
        database_name: builtins.str,
        password: builtins.str,
        server: builtins.str,
        username: builtins.str,
    ) -> None:
        """
        :param database_name: -
        :param password: -
        :param server: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "database_name": database_name,
            "password": password,
            "server": server,
            "username": username,
        }

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterMetastoresOozie(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterMonitor",
    jsii_struct_bases=[],
    name_mapping={
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "primary_key": "primaryKey",
    },
)
class HdinsightStormClusterMonitor:
    def __init__(
        self,
        *,
        log_analytics_workspace_id: builtins.str,
        primary_key: builtins.str,
    ) -> None:
        """
        :param log_analytics_workspace_id: -
        :param primary_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "primary_key": primary_key,
        }

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def primary_key(self) -> builtins.str:
        result = self._values.get("primary_key")
        assert result is not None, "Required property 'primary_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterRoles",
    jsii_struct_bases=[],
    name_mapping={
        "head_node": "headNode",
        "worker_node": "workerNode",
        "zookeeper_node": "zookeeperNode",
    },
)
class HdinsightStormClusterRoles:
    def __init__(
        self,
        *,
        head_node: typing.List["HdinsightStormClusterRolesHeadNode"],
        worker_node: typing.List["HdinsightStormClusterRolesWorkerNode"],
        zookeeper_node: typing.List["HdinsightStormClusterRolesZookeeperNode"],
    ) -> None:
        """
        :param head_node: head_node block.
        :param worker_node: worker_node block.
        :param zookeeper_node: zookeeper_node block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "head_node": head_node,
            "worker_node": worker_node,
            "zookeeper_node": zookeeper_node,
        }

    @builtins.property
    def head_node(self) -> typing.List["HdinsightStormClusterRolesHeadNode"]:
        """head_node block."""
        result = self._values.get("head_node")
        assert result is not None, "Required property 'head_node' is missing"
        return result

    @builtins.property
    def worker_node(self) -> typing.List["HdinsightStormClusterRolesWorkerNode"]:
        """worker_node block."""
        result = self._values.get("worker_node")
        assert result is not None, "Required property 'worker_node' is missing"
        return result

    @builtins.property
    def zookeeper_node(self) -> typing.List["HdinsightStormClusterRolesZookeeperNode"]:
        """zookeeper_node block."""
        result = self._values.get("zookeeper_node")
        assert result is not None, "Required property 'zookeeper_node' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterRoles(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterRolesHeadNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightStormClusterRolesHeadNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterRolesHeadNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterRolesWorkerNode",
    jsii_struct_bases=[],
    name_mapping={
        "target_instance_count": "targetInstanceCount",
        "username": "username",
        "vm_size": "vmSize",
        "min_instance_count": "minInstanceCount",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightStormClusterRolesWorkerNode:
    def __init__(
        self,
        *,
        target_instance_count: jsii.Number,
        username: builtins.str,
        vm_size: builtins.str,
        min_instance_count: typing.Optional[jsii.Number] = None,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param target_instance_count: -
        :param username: -
        :param vm_size: -
        :param min_instance_count: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "target_instance_count": target_instance_count,
            "username": username,
            "vm_size": vm_size,
        }
        if min_instance_count is not None:
            self._values["min_instance_count"] = min_instance_count
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def target_instance_count(self) -> jsii.Number:
        result = self._values.get("target_instance_count")
        assert result is not None, "Required property 'target_instance_count' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def min_instance_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_instance_count")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterRolesWorkerNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterRolesZookeeperNode",
    jsii_struct_bases=[],
    name_mapping={
        "username": "username",
        "vm_size": "vmSize",
        "password": "password",
        "ssh_keys": "sshKeys",
        "subnet_id": "subnetId",
        "virtual_network_id": "virtualNetworkId",
    },
)
class HdinsightStormClusterRolesZookeeperNode:
    def __init__(
        self,
        *,
        username: builtins.str,
        vm_size: builtins.str,
        password: typing.Optional[builtins.str] = None,
        ssh_keys: typing.Optional[typing.List[builtins.str]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        virtual_network_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param username: -
        :param vm_size: -
        :param password: -
        :param ssh_keys: -
        :param subnet_id: -
        :param virtual_network_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "username": username,
            "vm_size": vm_size,
        }
        if password is not None:
            self._values["password"] = password
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if virtual_network_id is not None:
            self._values["virtual_network_id"] = virtual_network_id

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def ssh_keys(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ssh_keys")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def virtual_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_network_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterRolesZookeeperNode(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterStorageAccount",
    jsii_struct_bases=[],
    name_mapping={
        "is_default": "isDefault",
        "storage_account_key": "storageAccountKey",
        "storage_container_id": "storageContainerId",
    },
)
class HdinsightStormClusterStorageAccount:
    def __init__(
        self,
        *,
        is_default: builtins.bool,
        storage_account_key: builtins.str,
        storage_container_id: builtins.str,
    ) -> None:
        """
        :param is_default: -
        :param storage_account_key: -
        :param storage_container_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_default": is_default,
            "storage_account_key": storage_account_key,
            "storage_container_id": storage_container_id,
        }

    @builtins.property
    def is_default(self) -> builtins.bool:
        result = self._values.get("is_default")
        assert result is not None, "Required property 'is_default' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HdinsightStormClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HdinsightStormClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HdinsightStormClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HealthcareService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HealthcareService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        access_policy_object_ids: typing.Optional[typing.List[builtins.str]] = None,
        authentication_configuration: typing.Optional[typing.List["HealthcareServiceAuthenticationConfiguration"]] = None,
        cors_configuration: typing.Optional[typing.List["HealthcareServiceCorsConfiguration"]] = None,
        cosmosdb_throughput: typing.Optional[jsii.Number] = None,
        kind: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HealthcareServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param access_policy_object_ids: -
        :param authentication_configuration: authentication_configuration block.
        :param cors_configuration: cors_configuration block.
        :param cosmosdb_throughput: -
        :param kind: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareServiceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            access_policy_object_ids=access_policy_object_ids,
            authentication_configuration=authentication_configuration,
            cors_configuration=cors_configuration,
            cosmosdb_throughput=cosmosdb_throughput,
            kind=kind,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HealthcareService, self, [scope, id, config])

    @jsii.member(jsii_name="resetAccessPolicyObjectIds")
    def reset_access_policy_object_ids(self) -> None:
        return jsii.invoke(self, "resetAccessPolicyObjectIds", [])

    @jsii.member(jsii_name="resetAuthenticationConfiguration")
    def reset_authentication_configuration(self) -> None:
        return jsii.invoke(self, "resetAuthenticationConfiguration", [])

    @jsii.member(jsii_name="resetCorsConfiguration")
    def reset_cors_configuration(self) -> None:
        return jsii.invoke(self, "resetCorsConfiguration", [])

    @jsii.member(jsii_name="resetCosmosdbThroughput")
    def reset_cosmosdb_throughput(self) -> None:
        return jsii.invoke(self, "resetCosmosdbThroughput", [])

    @jsii.member(jsii_name="resetKind")
    def reset_kind(self) -> None:
        return jsii.invoke(self, "resetKind", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessPolicyObjectIdsInput")
    def access_policy_object_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "accessPolicyObjectIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationConfigurationInput")
    def authentication_configuration_input(
        self,
    ) -> typing.Optional[typing.List["HealthcareServiceAuthenticationConfiguration"]]:
        return jsii.get(self, "authenticationConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="corsConfigurationInput")
    def cors_configuration_input(
        self,
    ) -> typing.Optional[typing.List["HealthcareServiceCorsConfiguration"]]:
        return jsii.get(self, "corsConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cosmosdbThroughputInput")
    def cosmosdb_throughput_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "cosmosdbThroughputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kindInput")
    def kind_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "kindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HealthcareServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessPolicyObjectIds")
    def access_policy_object_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "accessPolicyObjectIds")

    @access_policy_object_ids.setter # type: ignore
    def access_policy_object_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "accessPolicyObjectIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authenticationConfiguration")
    def authentication_configuration(
        self,
    ) -> typing.List["HealthcareServiceAuthenticationConfiguration"]:
        return jsii.get(self, "authenticationConfiguration")

    @authentication_configuration.setter # type: ignore
    def authentication_configuration(
        self,
        value: typing.List["HealthcareServiceAuthenticationConfiguration"],
    ) -> None:
        jsii.set(self, "authenticationConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="corsConfiguration")
    def cors_configuration(self) -> typing.List["HealthcareServiceCorsConfiguration"]:
        return jsii.get(self, "corsConfiguration")

    @cors_configuration.setter # type: ignore
    def cors_configuration(
        self,
        value: typing.List["HealthcareServiceCorsConfiguration"],
    ) -> None:
        jsii.set(self, "corsConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cosmosdbThroughput")
    def cosmosdb_throughput(self) -> jsii.Number:
        return jsii.get(self, "cosmosdbThroughput")

    @cosmosdb_throughput.setter # type: ignore
    def cosmosdb_throughput(self, value: jsii.Number) -> None:
        jsii.set(self, "cosmosdbThroughput", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @kind.setter # type: ignore
    def kind(self, value: builtins.str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HealthcareServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HealthcareServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.HealthcareServiceAuthenticationConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "audience": "audience",
        "authority": "authority",
        "smart_proxy_enabled": "smartProxyEnabled",
    },
)
class HealthcareServiceAuthenticationConfiguration:
    def __init__(
        self,
        *,
        audience: typing.Optional[builtins.str] = None,
        authority: typing.Optional[builtins.str] = None,
        smart_proxy_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param audience: -
        :param authority: -
        :param smart_proxy_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if audience is not None:
            self._values["audience"] = audience
        if authority is not None:
            self._values["authority"] = authority
        if smart_proxy_enabled is not None:
            self._values["smart_proxy_enabled"] = smart_proxy_enabled

    @builtins.property
    def audience(self) -> typing.Optional[builtins.str]:
        result = self._values.get("audience")
        return result

    @builtins.property
    def authority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("authority")
        return result

    @builtins.property
    def smart_proxy_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("smart_proxy_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HealthcareServiceAuthenticationConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HealthcareServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "access_policy_object_ids": "accessPolicyObjectIds",
        "authentication_configuration": "authenticationConfiguration",
        "cors_configuration": "corsConfiguration",
        "cosmosdb_throughput": "cosmosdbThroughput",
        "kind": "kind",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class HealthcareServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        access_policy_object_ids: typing.Optional[typing.List[builtins.str]] = None,
        authentication_configuration: typing.Optional[typing.List[HealthcareServiceAuthenticationConfiguration]] = None,
        cors_configuration: typing.Optional[typing.List["HealthcareServiceCorsConfiguration"]] = None,
        cosmosdb_throughput: typing.Optional[jsii.Number] = None,
        kind: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["HealthcareServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param access_policy_object_ids: -
        :param authentication_configuration: authentication_configuration block.
        :param cors_configuration: cors_configuration block.
        :param cosmosdb_throughput: -
        :param kind: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HealthcareServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if access_policy_object_ids is not None:
            self._values["access_policy_object_ids"] = access_policy_object_ids
        if authentication_configuration is not None:
            self._values["authentication_configuration"] = authentication_configuration
        if cors_configuration is not None:
            self._values["cors_configuration"] = cors_configuration
        if cosmosdb_throughput is not None:
            self._values["cosmosdb_throughput"] = cosmosdb_throughput
        if kind is not None:
            self._values["kind"] = kind
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def access_policy_object_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("access_policy_object_ids")
        return result

    @builtins.property
    def authentication_configuration(
        self,
    ) -> typing.Optional[typing.List[HealthcareServiceAuthenticationConfiguration]]:
        """authentication_configuration block."""
        result = self._values.get("authentication_configuration")
        return result

    @builtins.property
    def cors_configuration(
        self,
    ) -> typing.Optional[typing.List["HealthcareServiceCorsConfiguration"]]:
        """cors_configuration block."""
        result = self._values.get("cors_configuration")
        return result

    @builtins.property
    def cosmosdb_throughput(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("cosmosdb_throughput")
        return result

    @builtins.property
    def kind(self) -> typing.Optional[builtins.str]:
        result = self._values.get("kind")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HealthcareServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HealthcareServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HealthcareServiceCorsConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "allow_credentials": "allowCredentials",
        "allowed_headers": "allowedHeaders",
        "allowed_methods": "allowedMethods",
        "allowed_origins": "allowedOrigins",
        "max_age_in_seconds": "maxAgeInSeconds",
    },
)
class HealthcareServiceCorsConfiguration:
    def __init__(
        self,
        *,
        allow_credentials: typing.Optional[builtins.bool] = None,
        allowed_headers: typing.Optional[typing.List[builtins.str]] = None,
        allowed_methods: typing.Optional[typing.List[builtins.str]] = None,
        allowed_origins: typing.Optional[typing.List[builtins.str]] = None,
        max_age_in_seconds: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param allow_credentials: -
        :param allowed_headers: -
        :param allowed_methods: -
        :param allowed_origins: -
        :param max_age_in_seconds: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if allow_credentials is not None:
            self._values["allow_credentials"] = allow_credentials
        if allowed_headers is not None:
            self._values["allowed_headers"] = allowed_headers
        if allowed_methods is not None:
            self._values["allowed_methods"] = allowed_methods
        if allowed_origins is not None:
            self._values["allowed_origins"] = allowed_origins
        if max_age_in_seconds is not None:
            self._values["max_age_in_seconds"] = max_age_in_seconds

    @builtins.property
    def allow_credentials(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_credentials")
        return result

    @builtins.property
    def allowed_headers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_headers")
        return result

    @builtins.property
    def allowed_methods(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_methods")
        return result

    @builtins.property
    def allowed_origins(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_origins")
        return result

    @builtins.property
    def max_age_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_age_in_seconds")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HealthcareServiceCorsConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HealthcareServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HealthcareServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HealthcareServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HpcCache(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HpcCache",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cache_size_in_gb: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        subnet_id: builtins.str,
        mtu: typing.Optional[jsii.Number] = None,
        root_squash_enabled: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["HpcCacheTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cache_size_in_gb: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param subnet_id: -
        :param mtu: -
        :param root_squash_enabled: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HpcCacheConfig(
            cache_size_in_gb=cache_size_in_gb,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            subnet_id=subnet_id,
            mtu=mtu,
            root_squash_enabled=root_squash_enabled,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HpcCache, self, [scope, id, config])

    @jsii.member(jsii_name="resetMtu")
    def reset_mtu(self) -> None:
        return jsii.invoke(self, "resetMtu", [])

    @jsii.member(jsii_name="resetRootSquashEnabled")
    def reset_root_squash_enabled(self) -> None:
        return jsii.invoke(self, "resetRootSquashEnabled", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheSizeInGbInput")
    def cache_size_in_gb_input(self) -> jsii.Number:
        return jsii.get(self, "cacheSizeInGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mountAddresses")
    def mount_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "mountAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mtuInput")
    def mtu_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "mtuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rootSquashEnabledInput")
    def root_squash_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "rootSquashEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HpcCacheTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheSizeInGb")
    def cache_size_in_gb(self) -> jsii.Number:
        return jsii.get(self, "cacheSizeInGb")

    @cache_size_in_gb.setter # type: ignore
    def cache_size_in_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "cacheSizeInGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mtu")
    def mtu(self) -> jsii.Number:
        return jsii.get(self, "mtu")

    @mtu.setter # type: ignore
    def mtu(self, value: jsii.Number) -> None:
        jsii.set(self, "mtu", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rootSquashEnabled")
    def root_squash_enabled(self) -> builtins.bool:
        return jsii.get(self, "rootSquashEnabled")

    @root_squash_enabled.setter # type: ignore
    def root_squash_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "rootSquashEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HpcCacheTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HpcCacheTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class HpcCacheBlobTarget(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HpcCacheBlobTarget",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cache_name: builtins.str,
        name: builtins.str,
        namespace_path: builtins.str,
        resource_group_name: builtins.str,
        storage_container_id: builtins.str,
        timeouts: typing.Optional["HpcCacheBlobTargetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cache_name: -
        :param name: -
        :param namespace_path: -
        :param resource_group_name: -
        :param storage_container_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HpcCacheBlobTargetConfig(
            cache_name=cache_name,
            name=name,
            namespace_path=namespace_path,
            resource_group_name=resource_group_name,
            storage_container_id=storage_container_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HpcCacheBlobTarget, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheNameInput")
    def cache_name_input(self) -> builtins.str:
        return jsii.get(self, "cacheNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespacePathInput")
    def namespace_path_input(self) -> builtins.str:
        return jsii.get(self, "namespacePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerIdInput")
    def storage_container_id_input(self) -> builtins.str:
        return jsii.get(self, "storageContainerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HpcCacheBlobTargetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheName")
    def cache_name(self) -> builtins.str:
        return jsii.get(self, "cacheName")

    @cache_name.setter # type: ignore
    def cache_name(self, value: builtins.str) -> None:
        jsii.set(self, "cacheName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespacePath")
    def namespace_path(self) -> builtins.str:
        return jsii.get(self, "namespacePath")

    @namespace_path.setter # type: ignore
    def namespace_path(self, value: builtins.str) -> None:
        jsii.set(self, "namespacePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerId")
    def storage_container_id(self) -> builtins.str:
        return jsii.get(self, "storageContainerId")

    @storage_container_id.setter # type: ignore
    def storage_container_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageContainerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HpcCacheBlobTargetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HpcCacheBlobTargetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.HpcCacheBlobTargetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cache_name": "cacheName",
        "name": "name",
        "namespace_path": "namespacePath",
        "resource_group_name": "resourceGroupName",
        "storage_container_id": "storageContainerId",
        "timeouts": "timeouts",
    },
)
class HpcCacheBlobTargetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cache_name: builtins.str,
        name: builtins.str,
        namespace_path: builtins.str,
        resource_group_name: builtins.str,
        storage_container_id: builtins.str,
        timeouts: typing.Optional["HpcCacheBlobTargetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cache_name: -
        :param name: -
        :param namespace_path: -
        :param resource_group_name: -
        :param storage_container_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HpcCacheBlobTargetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cache_name": cache_name,
            "name": name,
            "namespace_path": namespace_path,
            "resource_group_name": resource_group_name,
            "storage_container_id": storage_container_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cache_name(self) -> builtins.str:
        result = self._values.get("cache_name")
        assert result is not None, "Required property 'cache_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_path(self) -> builtins.str:
        result = self._values.get("namespace_path")
        assert result is not None, "Required property 'namespace_path' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_container_id(self) -> builtins.str:
        result = self._values.get("storage_container_id")
        assert result is not None, "Required property 'storage_container_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HpcCacheBlobTargetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HpcCacheBlobTargetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HpcCacheBlobTargetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HpcCacheBlobTargetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HpcCacheBlobTargetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HpcCacheConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cache_size_in_gb": "cacheSizeInGb",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "subnet_id": "subnetId",
        "mtu": "mtu",
        "root_squash_enabled": "rootSquashEnabled",
        "timeouts": "timeouts",
    },
)
class HpcCacheConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cache_size_in_gb: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        subnet_id: builtins.str,
        mtu: typing.Optional[jsii.Number] = None,
        root_squash_enabled: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["HpcCacheTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cache_size_in_gb: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param subnet_id: -
        :param mtu: -
        :param root_squash_enabled: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HpcCacheTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cache_size_in_gb": cache_size_in_gb,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if mtu is not None:
            self._values["mtu"] = mtu
        if root_squash_enabled is not None:
            self._values["root_squash_enabled"] = root_squash_enabled
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cache_size_in_gb(self) -> jsii.Number:
        result = self._values.get("cache_size_in_gb")
        assert result is not None, "Required property 'cache_size_in_gb' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def mtu(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("mtu")
        return result

    @builtins.property
    def root_squash_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("root_squash_enabled")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HpcCacheTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HpcCacheConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class HpcCacheNfsTarget(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.HpcCacheNfsTarget",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cache_name: builtins.str,
        name: builtins.str,
        namespace_junction: typing.List["HpcCacheNfsTargetNamespaceJunction"],
        resource_group_name: builtins.str,
        target_host_name: builtins.str,
        usage_model: builtins.str,
        timeouts: typing.Optional["HpcCacheNfsTargetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cache_name: -
        :param name: -
        :param namespace_junction: namespace_junction block.
        :param resource_group_name: -
        :param target_host_name: -
        :param usage_model: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HpcCacheNfsTargetConfig(
            cache_name=cache_name,
            name=name,
            namespace_junction=namespace_junction,
            resource_group_name=resource_group_name,
            target_host_name=target_host_name,
            usage_model=usage_model,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(HpcCacheNfsTarget, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheNameInput")
    def cache_name_input(self) -> builtins.str:
        return jsii.get(self, "cacheNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceJunctionInput")
    def namespace_junction_input(
        self,
    ) -> typing.List["HpcCacheNfsTargetNamespaceJunction"]:
        return jsii.get(self, "namespaceJunctionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetHostNameInput")
    def target_host_name_input(self) -> builtins.str:
        return jsii.get(self, "targetHostNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usageModelInput")
    def usage_model_input(self) -> builtins.str:
        return jsii.get(self, "usageModelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["HpcCacheNfsTargetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cacheName")
    def cache_name(self) -> builtins.str:
        return jsii.get(self, "cacheName")

    @cache_name.setter # type: ignore
    def cache_name(self, value: builtins.str) -> None:
        jsii.set(self, "cacheName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceJunction")
    def namespace_junction(self) -> typing.List["HpcCacheNfsTargetNamespaceJunction"]:
        return jsii.get(self, "namespaceJunction")

    @namespace_junction.setter # type: ignore
    def namespace_junction(
        self,
        value: typing.List["HpcCacheNfsTargetNamespaceJunction"],
    ) -> None:
        jsii.set(self, "namespaceJunction", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetHostName")
    def target_host_name(self) -> builtins.str:
        return jsii.get(self, "targetHostName")

    @target_host_name.setter # type: ignore
    def target_host_name(self, value: builtins.str) -> None:
        jsii.set(self, "targetHostName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "HpcCacheNfsTargetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "HpcCacheNfsTargetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usageModel")
    def usage_model(self) -> builtins.str:
        return jsii.get(self, "usageModel")

    @usage_model.setter # type: ignore
    def usage_model(self, value: builtins.str) -> None:
        jsii.set(self, "usageModel", value)


@jsii.data_type(
    jsii_type="azurerm.HpcCacheNfsTargetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cache_name": "cacheName",
        "name": "name",
        "namespace_junction": "namespaceJunction",
        "resource_group_name": "resourceGroupName",
        "target_host_name": "targetHostName",
        "usage_model": "usageModel",
        "timeouts": "timeouts",
    },
)
class HpcCacheNfsTargetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cache_name: builtins.str,
        name: builtins.str,
        namespace_junction: typing.List["HpcCacheNfsTargetNamespaceJunction"],
        resource_group_name: builtins.str,
        target_host_name: builtins.str,
        usage_model: builtins.str,
        timeouts: typing.Optional["HpcCacheNfsTargetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cache_name: -
        :param name: -
        :param namespace_junction: namespace_junction block.
        :param resource_group_name: -
        :param target_host_name: -
        :param usage_model: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = HpcCacheNfsTargetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cache_name": cache_name,
            "name": name,
            "namespace_junction": namespace_junction,
            "resource_group_name": resource_group_name,
            "target_host_name": target_host_name,
            "usage_model": usage_model,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cache_name(self) -> builtins.str:
        result = self._values.get("cache_name")
        assert result is not None, "Required property 'cache_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_junction(self) -> typing.List["HpcCacheNfsTargetNamespaceJunction"]:
        """namespace_junction block."""
        result = self._values.get("namespace_junction")
        assert result is not None, "Required property 'namespace_junction' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def target_host_name(self) -> builtins.str:
        result = self._values.get("target_host_name")
        assert result is not None, "Required property 'target_host_name' is missing"
        return result

    @builtins.property
    def usage_model(self) -> builtins.str:
        result = self._values.get("usage_model")
        assert result is not None, "Required property 'usage_model' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["HpcCacheNfsTargetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HpcCacheNfsTargetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HpcCacheNfsTargetNamespaceJunction",
    jsii_struct_bases=[],
    name_mapping={
        "namespace_path": "namespacePath",
        "nfs_export": "nfsExport",
        "target_path": "targetPath",
    },
)
class HpcCacheNfsTargetNamespaceJunction:
    def __init__(
        self,
        *,
        namespace_path: builtins.str,
        nfs_export: builtins.str,
        target_path: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param namespace_path: -
        :param nfs_export: -
        :param target_path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "namespace_path": namespace_path,
            "nfs_export": nfs_export,
        }
        if target_path is not None:
            self._values["target_path"] = target_path

    @builtins.property
    def namespace_path(self) -> builtins.str:
        result = self._values.get("namespace_path")
        assert result is not None, "Required property 'namespace_path' is missing"
        return result

    @builtins.property
    def nfs_export(self) -> builtins.str:
        result = self._values.get("nfs_export")
        assert result is not None, "Required property 'nfs_export' is missing"
        return result

    @builtins.property
    def target_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_path")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HpcCacheNfsTargetNamespaceJunction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HpcCacheNfsTargetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HpcCacheNfsTargetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HpcCacheNfsTargetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.HpcCacheTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class HpcCacheTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "HpcCacheTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Image(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Image",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        data_disk: typing.Optional[typing.List["ImageDataDisk"]] = None,
        hyper_v_generation: typing.Optional[builtins.str] = None,
        os_disk: typing.Optional[typing.List["ImageOsDisk"]] = None,
        source_virtual_machine_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ImageTimeouts"] = None,
        zone_resilient: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param data_disk: data_disk block.
        :param hyper_v_generation: -
        :param os_disk: os_disk block.
        :param source_virtual_machine_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_resilient: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ImageConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            data_disk=data_disk,
            hyper_v_generation=hyper_v_generation,
            os_disk=os_disk,
            source_virtual_machine_id=source_virtual_machine_id,
            tags=tags,
            timeouts=timeouts,
            zone_resilient=zone_resilient,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Image, self, [scope, id, config])

    @jsii.member(jsii_name="resetDataDisk")
    def reset_data_disk(self) -> None:
        return jsii.invoke(self, "resetDataDisk", [])

    @jsii.member(jsii_name="resetHyperVGeneration")
    def reset_hyper_v_generation(self) -> None:
        return jsii.invoke(self, "resetHyperVGeneration", [])

    @jsii.member(jsii_name="resetOsDisk")
    def reset_os_disk(self) -> None:
        return jsii.invoke(self, "resetOsDisk", [])

    @jsii.member(jsii_name="resetSourceVirtualMachineId")
    def reset_source_virtual_machine_id(self) -> None:
        return jsii.invoke(self, "resetSourceVirtualMachineId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZoneResilient")
    def reset_zone_resilient(self) -> None:
        return jsii.invoke(self, "resetZoneResilient", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataDiskInput")
    def data_disk_input(self) -> typing.Optional[typing.List["ImageDataDisk"]]:
        return jsii.get(self, "dataDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hyperVGenerationInput")
    def hyper_v_generation_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "hyperVGenerationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskInput")
    def os_disk_input(self) -> typing.Optional[typing.List["ImageOsDisk"]]:
        return jsii.get(self, "osDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVirtualMachineIdInput")
    def source_virtual_machine_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceVirtualMachineIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ImageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneResilientInput")
    def zone_resilient_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneResilientInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataDisk")
    def data_disk(self) -> typing.List["ImageDataDisk"]:
        return jsii.get(self, "dataDisk")

    @data_disk.setter # type: ignore
    def data_disk(self, value: typing.List["ImageDataDisk"]) -> None:
        jsii.set(self, "dataDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hyperVGeneration")
    def hyper_v_generation(self) -> builtins.str:
        return jsii.get(self, "hyperVGeneration")

    @hyper_v_generation.setter # type: ignore
    def hyper_v_generation(self, value: builtins.str) -> None:
        jsii.set(self, "hyperVGeneration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDisk")
    def os_disk(self) -> typing.List["ImageOsDisk"]:
        return jsii.get(self, "osDisk")

    @os_disk.setter # type: ignore
    def os_disk(self, value: typing.List["ImageOsDisk"]) -> None:
        jsii.set(self, "osDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVirtualMachineId")
    def source_virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "sourceVirtualMachineId")

    @source_virtual_machine_id.setter # type: ignore
    def source_virtual_machine_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceVirtualMachineId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ImageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ImageTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneResilient")
    def zone_resilient(self) -> builtins.bool:
        return jsii.get(self, "zoneResilient")

    @zone_resilient.setter # type: ignore
    def zone_resilient(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneResilient", value)


@jsii.data_type(
    jsii_type="azurerm.ImageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "data_disk": "dataDisk",
        "hyper_v_generation": "hyperVGeneration",
        "os_disk": "osDisk",
        "source_virtual_machine_id": "sourceVirtualMachineId",
        "tags": "tags",
        "timeouts": "timeouts",
        "zone_resilient": "zoneResilient",
    },
)
class ImageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        data_disk: typing.Optional[typing.List["ImageDataDisk"]] = None,
        hyper_v_generation: typing.Optional[builtins.str] = None,
        os_disk: typing.Optional[typing.List["ImageOsDisk"]] = None,
        source_virtual_machine_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ImageTimeouts"] = None,
        zone_resilient: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param data_disk: data_disk block.
        :param hyper_v_generation: -
        :param os_disk: os_disk block.
        :param source_virtual_machine_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_resilient: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ImageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if data_disk is not None:
            self._values["data_disk"] = data_disk
        if hyper_v_generation is not None:
            self._values["hyper_v_generation"] = hyper_v_generation
        if os_disk is not None:
            self._values["os_disk"] = os_disk
        if source_virtual_machine_id is not None:
            self._values["source_virtual_machine_id"] = source_virtual_machine_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zone_resilient is not None:
            self._values["zone_resilient"] = zone_resilient

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def data_disk(self) -> typing.Optional[typing.List["ImageDataDisk"]]:
        """data_disk block."""
        result = self._values.get("data_disk")
        return result

    @builtins.property
    def hyper_v_generation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hyper_v_generation")
        return result

    @builtins.property
    def os_disk(self) -> typing.Optional[typing.List["ImageOsDisk"]]:
        """os_disk block."""
        result = self._values.get("os_disk")
        return result

    @builtins.property
    def source_virtual_machine_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_virtual_machine_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ImageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zone_resilient(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_resilient")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ImageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ImageDataDisk",
    jsii_struct_bases=[],
    name_mapping={
        "blob_uri": "blobUri",
        "caching": "caching",
        "lun": "lun",
        "managed_disk_id": "managedDiskId",
        "size_gb": "sizeGb",
    },
)
class ImageDataDisk:
    def __init__(
        self,
        *,
        blob_uri: typing.Optional[builtins.str] = None,
        caching: typing.Optional[builtins.str] = None,
        lun: typing.Optional[jsii.Number] = None,
        managed_disk_id: typing.Optional[builtins.str] = None,
        size_gb: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param blob_uri: -
        :param caching: -
        :param lun: -
        :param managed_disk_id: -
        :param size_gb: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if blob_uri is not None:
            self._values["blob_uri"] = blob_uri
        if caching is not None:
            self._values["caching"] = caching
        if lun is not None:
            self._values["lun"] = lun
        if managed_disk_id is not None:
            self._values["managed_disk_id"] = managed_disk_id
        if size_gb is not None:
            self._values["size_gb"] = size_gb

    @builtins.property
    def blob_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("blob_uri")
        return result

    @builtins.property
    def caching(self) -> typing.Optional[builtins.str]:
        result = self._values.get("caching")
        return result

    @builtins.property
    def lun(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("lun")
        return result

    @builtins.property
    def managed_disk_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_id")
        return result

    @builtins.property
    def size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("size_gb")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ImageDataDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ImageOsDisk",
    jsii_struct_bases=[],
    name_mapping={
        "blob_uri": "blobUri",
        "caching": "caching",
        "managed_disk_id": "managedDiskId",
        "os_state": "osState",
        "os_type": "osType",
        "size_gb": "sizeGb",
    },
)
class ImageOsDisk:
    def __init__(
        self,
        *,
        blob_uri: typing.Optional[builtins.str] = None,
        caching: typing.Optional[builtins.str] = None,
        managed_disk_id: typing.Optional[builtins.str] = None,
        os_state: typing.Optional[builtins.str] = None,
        os_type: typing.Optional[builtins.str] = None,
        size_gb: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param blob_uri: -
        :param caching: -
        :param managed_disk_id: -
        :param os_state: -
        :param os_type: -
        :param size_gb: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if blob_uri is not None:
            self._values["blob_uri"] = blob_uri
        if caching is not None:
            self._values["caching"] = caching
        if managed_disk_id is not None:
            self._values["managed_disk_id"] = managed_disk_id
        if os_state is not None:
            self._values["os_state"] = os_state
        if os_type is not None:
            self._values["os_type"] = os_type
        if size_gb is not None:
            self._values["size_gb"] = size_gb

    @builtins.property
    def blob_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("blob_uri")
        return result

    @builtins.property
    def caching(self) -> typing.Optional[builtins.str]:
        result = self._values.get("caching")
        return result

    @builtins.property
    def managed_disk_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_id")
        return result

    @builtins.property
    def os_state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_state")
        return result

    @builtins.property
    def os_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_type")
        return result

    @builtins.property
    def size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("size_gb")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ImageOsDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ImageTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ImageTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ImageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IntegrationServiceEnvironment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IntegrationServiceEnvironment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        access_endpoint_type: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_subnet_ids: typing.List[builtins.str],
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IntegrationServiceEnvironmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param access_endpoint_type: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param virtual_network_subnet_ids: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IntegrationServiceEnvironmentConfig(
            access_endpoint_type=access_endpoint_type,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            virtual_network_subnet_ids=virtual_network_subnet_ids,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IntegrationServiceEnvironment, self, [scope, id, config])

    @jsii.member(jsii_name="resetSkuName")
    def reset_sku_name(self) -> None:
        return jsii.invoke(self, "resetSkuName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessEndpointTypeInput")
    def access_endpoint_type_input(self) -> builtins.str:
        return jsii.get(self, "accessEndpointTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectorEndpointIpAddresses")
    def connector_endpoint_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "connectorEndpointIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectorOutboundIpAddresses")
    def connector_outbound_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "connectorOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetIdsInput")
    def virtual_network_subnet_ids_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "virtualNetworkSubnetIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowEndpointIpAddresses")
    def workflow_endpoint_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "workflowEndpointIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowOutboundIpAddresses")
    def workflow_outbound_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "workflowOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IntegrationServiceEnvironmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessEndpointType")
    def access_endpoint_type(self) -> builtins.str:
        return jsii.get(self, "accessEndpointType")

    @access_endpoint_type.setter # type: ignore
    def access_endpoint_type(self, value: builtins.str) -> None:
        jsii.set(self, "accessEndpointType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IntegrationServiceEnvironmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IntegrationServiceEnvironmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetIds")
    def virtual_network_subnet_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "virtualNetworkSubnetIds")

    @virtual_network_subnet_ids.setter # type: ignore
    def virtual_network_subnet_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "virtualNetworkSubnetIds", value)


@jsii.data_type(
    jsii_type="azurerm.IntegrationServiceEnvironmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "access_endpoint_type": "accessEndpointType",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "virtual_network_subnet_ids": "virtualNetworkSubnetIds",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class IntegrationServiceEnvironmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        access_endpoint_type: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_subnet_ids: typing.List[builtins.str],
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IntegrationServiceEnvironmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param access_endpoint_type: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param virtual_network_subnet_ids: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IntegrationServiceEnvironmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "access_endpoint_type": access_endpoint_type,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "virtual_network_subnet_ids": virtual_network_subnet_ids,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if sku_name is not None:
            self._values["sku_name"] = sku_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def access_endpoint_type(self) -> builtins.str:
        result = self._values.get("access_endpoint_type")
        assert result is not None, "Required property 'access_endpoint_type' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def virtual_network_subnet_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("virtual_network_subnet_ids")
        assert result is not None, "Required property 'virtual_network_subnet_ids' is missing"
        return result

    @builtins.property
    def sku_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IntegrationServiceEnvironmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IntegrationServiceEnvironmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IntegrationServiceEnvironmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IntegrationServiceEnvironmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IntegrationServiceEnvironmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IotTimeSeriesInsightsAccessPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IotTimeSeriesInsightsAccessPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        principal_object_id: builtins.str,
        roles: typing.List[builtins.str],
        time_series_insights_environment_id: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsAccessPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param principal_object_id: -
        :param roles: -
        :param time_series_insights_environment_id: -
        :param description: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IotTimeSeriesInsightsAccessPolicyConfig(
            name=name,
            principal_object_id=principal_object_id,
            roles=roles,
            time_series_insights_environment_id=time_series_insights_environment_id,
            description=description,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IotTimeSeriesInsightsAccessPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalObjectIdInput")
    def principal_object_id_input(self) -> builtins.str:
        return jsii.get(self, "principalObjectIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rolesInput")
    def roles_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "rolesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeSeriesInsightsEnvironmentIdInput")
    def time_series_insights_environment_id_input(self) -> builtins.str:
        return jsii.get(self, "timeSeriesInsightsEnvironmentIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IotTimeSeriesInsightsAccessPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalObjectId")
    def principal_object_id(self) -> builtins.str:
        return jsii.get(self, "principalObjectId")

    @principal_object_id.setter # type: ignore
    def principal_object_id(self, value: builtins.str) -> None:
        jsii.set(self, "principalObjectId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roles")
    def roles(self) -> typing.List[builtins.str]:
        return jsii.get(self, "roles")

    @roles.setter # type: ignore
    def roles(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "roles", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IotTimeSeriesInsightsAccessPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IotTimeSeriesInsightsAccessPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeSeriesInsightsEnvironmentId")
    def time_series_insights_environment_id(self) -> builtins.str:
        return jsii.get(self, "timeSeriesInsightsEnvironmentId")

    @time_series_insights_environment_id.setter # type: ignore
    def time_series_insights_environment_id(self, value: builtins.str) -> None:
        jsii.set(self, "timeSeriesInsightsEnvironmentId", value)


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsAccessPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "principal_object_id": "principalObjectId",
        "roles": "roles",
        "time_series_insights_environment_id": "timeSeriesInsightsEnvironmentId",
        "description": "description",
        "timeouts": "timeouts",
    },
)
class IotTimeSeriesInsightsAccessPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        principal_object_id: builtins.str,
        roles: typing.List[builtins.str],
        time_series_insights_environment_id: builtins.str,
        description: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsAccessPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param principal_object_id: -
        :param roles: -
        :param time_series_insights_environment_id: -
        :param description: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IotTimeSeriesInsightsAccessPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "principal_object_id": principal_object_id,
            "roles": roles,
            "time_series_insights_environment_id": time_series_insights_environment_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def principal_object_id(self) -> builtins.str:
        result = self._values.get("principal_object_id")
        assert result is not None, "Required property 'principal_object_id' is missing"
        return result

    @builtins.property
    def roles(self) -> typing.List[builtins.str]:
        result = self._values.get("roles")
        assert result is not None, "Required property 'roles' is missing"
        return result

    @builtins.property
    def time_series_insights_environment_id(self) -> builtins.str:
        result = self._values.get("time_series_insights_environment_id")
        assert result is not None, "Required property 'time_series_insights_environment_id' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IotTimeSeriesInsightsAccessPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsAccessPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsAccessPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IotTimeSeriesInsightsAccessPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsAccessPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IotTimeSeriesInsightsGen2Environment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IotTimeSeriesInsightsGen2Environment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        id_properties: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        storage: typing.List["IotTimeSeriesInsightsGen2EnvironmentStorage"],
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsGen2EnvironmentTimeouts"] = None,
        warm_store_data_retention_time: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param id_properties: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param storage: storage block.
        :param tags: -
        :param timeouts: timeouts block.
        :param warm_store_data_retention_time: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IotTimeSeriesInsightsGen2EnvironmentConfig(
            id_properties=id_properties,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            storage=storage,
            tags=tags,
            timeouts=timeouts,
            warm_store_data_retention_time=warm_store_data_retention_time,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IotTimeSeriesInsightsGen2Environment, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWarmStoreDataRetentionTime")
    def reset_warm_store_data_retention_time(self) -> None:
        return jsii.invoke(self, "resetWarmStoreDataRetentionTime", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idPropertiesInput")
    def id_properties_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "idPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageInput")
    def storage_input(
        self,
    ) -> typing.List["IotTimeSeriesInsightsGen2EnvironmentStorage"]:
        return jsii.get(self, "storageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IotTimeSeriesInsightsGen2EnvironmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="warmStoreDataRetentionTimeInput")
    def warm_store_data_retention_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "warmStoreDataRetentionTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idProperties")
    def id_properties(self) -> typing.List[builtins.str]:
        return jsii.get(self, "idProperties")

    @id_properties.setter # type: ignore
    def id_properties(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "idProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storage")
    def storage(self) -> typing.List["IotTimeSeriesInsightsGen2EnvironmentStorage"]:
        return jsii.get(self, "storage")

    @storage.setter # type: ignore
    def storage(
        self,
        value: typing.List["IotTimeSeriesInsightsGen2EnvironmentStorage"],
    ) -> None:
        jsii.set(self, "storage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IotTimeSeriesInsightsGen2EnvironmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IotTimeSeriesInsightsGen2EnvironmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="warmStoreDataRetentionTime")
    def warm_store_data_retention_time(self) -> builtins.str:
        return jsii.get(self, "warmStoreDataRetentionTime")

    @warm_store_data_retention_time.setter # type: ignore
    def warm_store_data_retention_time(self, value: builtins.str) -> None:
        jsii.set(self, "warmStoreDataRetentionTime", value)


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsGen2EnvironmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "id_properties": "idProperties",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "storage": "storage",
        "tags": "tags",
        "timeouts": "timeouts",
        "warm_store_data_retention_time": "warmStoreDataRetentionTime",
    },
)
class IotTimeSeriesInsightsGen2EnvironmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        id_properties: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        storage: typing.List["IotTimeSeriesInsightsGen2EnvironmentStorage"],
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsGen2EnvironmentTimeouts"] = None,
        warm_store_data_retention_time: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param id_properties: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param storage: storage block.
        :param tags: -
        :param timeouts: timeouts block.
        :param warm_store_data_retention_time: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IotTimeSeriesInsightsGen2EnvironmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "id_properties": id_properties,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "storage": storage,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if warm_store_data_retention_time is not None:
            self._values["warm_store_data_retention_time"] = warm_store_data_retention_time

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def id_properties(self) -> typing.List[builtins.str]:
        result = self._values.get("id_properties")
        assert result is not None, "Required property 'id_properties' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def storage(self) -> typing.List["IotTimeSeriesInsightsGen2EnvironmentStorage"]:
        """storage block."""
        result = self._values.get("storage")
        assert result is not None, "Required property 'storage' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["IotTimeSeriesInsightsGen2EnvironmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def warm_store_data_retention_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("warm_store_data_retention_time")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsGen2EnvironmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsGen2EnvironmentStorage",
    jsii_struct_bases=[],
    name_mapping={"key": "key", "name": "name"},
)
class IotTimeSeriesInsightsGen2EnvironmentStorage:
    def __init__(self, *, key: builtins.str, name: builtins.str) -> None:
        """
        :param key: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key": key,
            "name": name,
        }

    @builtins.property
    def key(self) -> builtins.str:
        result = self._values.get("key")
        assert result is not None, "Required property 'key' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsGen2EnvironmentStorage(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsGen2EnvironmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IotTimeSeriesInsightsGen2EnvironmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsGen2EnvironmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IotTimeSeriesInsightsReferenceDataSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IotTimeSeriesInsightsReferenceDataSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_property: typing.List["IotTimeSeriesInsightsReferenceDataSetKeyProperty"],
        location: builtins.str,
        name: builtins.str,
        time_series_insights_environment_id: builtins.str,
        data_string_comparison_behavior: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsReferenceDataSetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_property: key_property block.
        :param location: -
        :param name: -
        :param time_series_insights_environment_id: -
        :param data_string_comparison_behavior: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IotTimeSeriesInsightsReferenceDataSetConfig(
            key_property=key_property,
            location=location,
            name=name,
            time_series_insights_environment_id=time_series_insights_environment_id,
            data_string_comparison_behavior=data_string_comparison_behavior,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IotTimeSeriesInsightsReferenceDataSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetDataStringComparisonBehavior")
    def reset_data_string_comparison_behavior(self) -> None:
        return jsii.invoke(self, "resetDataStringComparisonBehavior", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyPropertyInput")
    def key_property_input(
        self,
    ) -> typing.List["IotTimeSeriesInsightsReferenceDataSetKeyProperty"]:
        return jsii.get(self, "keyPropertyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeSeriesInsightsEnvironmentIdInput")
    def time_series_insights_environment_id_input(self) -> builtins.str:
        return jsii.get(self, "timeSeriesInsightsEnvironmentIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataStringComparisonBehaviorInput")
    def data_string_comparison_behavior_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dataStringComparisonBehaviorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IotTimeSeriesInsightsReferenceDataSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataStringComparisonBehavior")
    def data_string_comparison_behavior(self) -> builtins.str:
        return jsii.get(self, "dataStringComparisonBehavior")

    @data_string_comparison_behavior.setter # type: ignore
    def data_string_comparison_behavior(self, value: builtins.str) -> None:
        jsii.set(self, "dataStringComparisonBehavior", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyProperty")
    def key_property(
        self,
    ) -> typing.List["IotTimeSeriesInsightsReferenceDataSetKeyProperty"]:
        return jsii.get(self, "keyProperty")

    @key_property.setter # type: ignore
    def key_property(
        self,
        value: typing.List["IotTimeSeriesInsightsReferenceDataSetKeyProperty"],
    ) -> None:
        jsii.set(self, "keyProperty", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IotTimeSeriesInsightsReferenceDataSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IotTimeSeriesInsightsReferenceDataSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeSeriesInsightsEnvironmentId")
    def time_series_insights_environment_id(self) -> builtins.str:
        return jsii.get(self, "timeSeriesInsightsEnvironmentId")

    @time_series_insights_environment_id.setter # type: ignore
    def time_series_insights_environment_id(self, value: builtins.str) -> None:
        jsii.set(self, "timeSeriesInsightsEnvironmentId", value)


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsReferenceDataSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_property": "keyProperty",
        "location": "location",
        "name": "name",
        "time_series_insights_environment_id": "timeSeriesInsightsEnvironmentId",
        "data_string_comparison_behavior": "dataStringComparisonBehavior",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class IotTimeSeriesInsightsReferenceDataSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_property: typing.List["IotTimeSeriesInsightsReferenceDataSetKeyProperty"],
        location: builtins.str,
        name: builtins.str,
        time_series_insights_environment_id: builtins.str,
        data_string_comparison_behavior: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsReferenceDataSetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_property: key_property block.
        :param location: -
        :param name: -
        :param time_series_insights_environment_id: -
        :param data_string_comparison_behavior: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IotTimeSeriesInsightsReferenceDataSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_property": key_property,
            "location": location,
            "name": name,
            "time_series_insights_environment_id": time_series_insights_environment_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if data_string_comparison_behavior is not None:
            self._values["data_string_comparison_behavior"] = data_string_comparison_behavior
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_property(
        self,
    ) -> typing.List["IotTimeSeriesInsightsReferenceDataSetKeyProperty"]:
        """key_property block."""
        result = self._values.get("key_property")
        assert result is not None, "Required property 'key_property' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def time_series_insights_environment_id(self) -> builtins.str:
        result = self._values.get("time_series_insights_environment_id")
        assert result is not None, "Required property 'time_series_insights_environment_id' is missing"
        return result

    @builtins.property
    def data_string_comparison_behavior(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data_string_comparison_behavior")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["IotTimeSeriesInsightsReferenceDataSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsReferenceDataSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsReferenceDataSetKeyProperty",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "type": "type"},
)
class IotTimeSeriesInsightsReferenceDataSetKeyProperty:
    def __init__(self, *, name: builtins.str, type: builtins.str) -> None:
        """
        :param name: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "type": type,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsReferenceDataSetKeyProperty(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsReferenceDataSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IotTimeSeriesInsightsReferenceDataSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsReferenceDataSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IotTimeSeriesInsightsStandardEnvironment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IotTimeSeriesInsightsStandardEnvironment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_retention_time: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        partition_key: typing.Optional[builtins.str] = None,
        storage_limit_exceeded_behavior: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsStandardEnvironmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_retention_time: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param partition_key: -
        :param storage_limit_exceeded_behavior: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IotTimeSeriesInsightsStandardEnvironmentConfig(
            data_retention_time=data_retention_time,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            partition_key=partition_key,
            storage_limit_exceeded_behavior=storage_limit_exceeded_behavior,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IotTimeSeriesInsightsStandardEnvironment, self, [scope, id, config])

    @jsii.member(jsii_name="resetPartitionKey")
    def reset_partition_key(self) -> None:
        return jsii.invoke(self, "resetPartitionKey", [])

    @jsii.member(jsii_name="resetStorageLimitExceededBehavior")
    def reset_storage_limit_exceeded_behavior(self) -> None:
        return jsii.invoke(self, "resetStorageLimitExceededBehavior", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataRetentionTimeInput")
    def data_retention_time_input(self) -> builtins.str:
        return jsii.get(self, "dataRetentionTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyInput")
    def partition_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "partitionKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageLimitExceededBehaviorInput")
    def storage_limit_exceeded_behavior_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageLimitExceededBehaviorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IotTimeSeriesInsightsStandardEnvironmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataRetentionTime")
    def data_retention_time(self) -> builtins.str:
        return jsii.get(self, "dataRetentionTime")

    @data_retention_time.setter # type: ignore
    def data_retention_time(self, value: builtins.str) -> None:
        jsii.set(self, "dataRetentionTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKey")
    def partition_key(self) -> builtins.str:
        return jsii.get(self, "partitionKey")

    @partition_key.setter # type: ignore
    def partition_key(self, value: builtins.str) -> None:
        jsii.set(self, "partitionKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageLimitExceededBehavior")
    def storage_limit_exceeded_behavior(self) -> builtins.str:
        return jsii.get(self, "storageLimitExceededBehavior")

    @storage_limit_exceeded_behavior.setter # type: ignore
    def storage_limit_exceeded_behavior(self, value: builtins.str) -> None:
        jsii.set(self, "storageLimitExceededBehavior", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IotTimeSeriesInsightsStandardEnvironmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "IotTimeSeriesInsightsStandardEnvironmentTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsStandardEnvironmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_retention_time": "dataRetentionTime",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "partition_key": "partitionKey",
        "storage_limit_exceeded_behavior": "storageLimitExceededBehavior",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class IotTimeSeriesInsightsStandardEnvironmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_retention_time: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        partition_key: typing.Optional[builtins.str] = None,
        storage_limit_exceeded_behavior: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IotTimeSeriesInsightsStandardEnvironmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_retention_time: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param partition_key: -
        :param storage_limit_exceeded_behavior: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IotTimeSeriesInsightsStandardEnvironmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_retention_time": data_retention_time,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if partition_key is not None:
            self._values["partition_key"] = partition_key
        if storage_limit_exceeded_behavior is not None:
            self._values["storage_limit_exceeded_behavior"] = storage_limit_exceeded_behavior
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_retention_time(self) -> builtins.str:
        result = self._values.get("data_retention_time")
        assert result is not None, "Required property 'data_retention_time' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def partition_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("partition_key")
        return result

    @builtins.property
    def storage_limit_exceeded_behavior(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_limit_exceeded_behavior")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["IotTimeSeriesInsightsStandardEnvironmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsStandardEnvironmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IotTimeSeriesInsightsStandardEnvironmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IotTimeSeriesInsightsStandardEnvironmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotTimeSeriesInsightsStandardEnvironmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IotcentralApplication(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IotcentralApplication",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sub_domain: builtins.str,
        display_name: typing.Optional[builtins.str] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        template: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IotcentralApplicationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sub_domain: -
        :param display_name: -
        :param sku: -
        :param tags: -
        :param template: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IotcentralApplicationConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sub_domain=sub_domain,
            display_name=display_name,
            sku=sku,
            tags=tags,
            template=template,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IotcentralApplication, self, [scope, id, config])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTemplate")
    def reset_template(self) -> None:
        return jsii.invoke(self, "resetTemplate", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subDomainInput")
    def sub_domain_input(self) -> builtins.str:
        return jsii.get(self, "subDomainInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateInput")
    def template_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "templateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IotcentralApplicationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subDomain")
    def sub_domain(self) -> builtins.str:
        return jsii.get(self, "subDomain")

    @sub_domain.setter # type: ignore
    def sub_domain(self, value: builtins.str) -> None:
        jsii.set(self, "subDomain", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="template")
    def template(self) -> builtins.str:
        return jsii.get(self, "template")

    @template.setter # type: ignore
    def template(self, value: builtins.str) -> None:
        jsii.set(self, "template", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IotcentralApplicationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IotcentralApplicationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IotcentralApplicationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sub_domain": "subDomain",
        "display_name": "displayName",
        "sku": "sku",
        "tags": "tags",
        "template": "template",
        "timeouts": "timeouts",
    },
)
class IotcentralApplicationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sub_domain: builtins.str,
        display_name: typing.Optional[builtins.str] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        template: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IotcentralApplicationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sub_domain: -
        :param display_name: -
        :param sku: -
        :param tags: -
        :param template: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IotcentralApplicationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sub_domain": sub_domain,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if display_name is not None:
            self._values["display_name"] = display_name
        if sku is not None:
            self._values["sku"] = sku
        if tags is not None:
            self._values["tags"] = tags
        if template is not None:
            self._values["template"] = template
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sub_domain(self) -> builtins.str:
        result = self._values.get("sub_domain")
        assert result is not None, "Required property 'sub_domain' is missing"
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def template(self) -> typing.Optional[builtins.str]:
        result = self._values.get("template")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IotcentralApplicationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotcentralApplicationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IotcentralApplicationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IotcentralApplicationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IotcentralApplicationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Iothub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Iothub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["IothubSku"],
        endpoint: typing.Optional[typing.List["IothubEndpoint"]] = None,
        event_hub_partition_count: typing.Optional[jsii.Number] = None,
        event_hub_retention_in_days: typing.Optional[jsii.Number] = None,
        fallback_route: typing.Optional[typing.List["IothubFallbackRoute"]] = None,
        file_upload: typing.Optional[typing.List["IothubFileUpload"]] = None,
        ip_filter_rule: typing.Optional[typing.List["IothubIpFilterRule"]] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        route: typing.Optional[typing.List["IothubRoute"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IothubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param endpoint: -
        :param event_hub_partition_count: -
        :param event_hub_retention_in_days: -
        :param fallback_route: fallback_route block.
        :param file_upload: file_upload block.
        :param ip_filter_rule: ip_filter_rule block.
        :param min_tls_version: -
        :param public_network_access_enabled: -
        :param route: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            endpoint=endpoint,
            event_hub_partition_count=event_hub_partition_count,
            event_hub_retention_in_days=event_hub_retention_in_days,
            fallback_route=fallback_route,
            file_upload=file_upload,
            ip_filter_rule=ip_filter_rule,
            min_tls_version=min_tls_version,
            public_network_access_enabled=public_network_access_enabled,
            route=route,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Iothub, self, [scope, id, config])

    @jsii.member(jsii_name="resetEndpoint")
    def reset_endpoint(self) -> None:
        return jsii.invoke(self, "resetEndpoint", [])

    @jsii.member(jsii_name="resetEventHubPartitionCount")
    def reset_event_hub_partition_count(self) -> None:
        return jsii.invoke(self, "resetEventHubPartitionCount", [])

    @jsii.member(jsii_name="resetEventHubRetentionInDays")
    def reset_event_hub_retention_in_days(self) -> None:
        return jsii.invoke(self, "resetEventHubRetentionInDays", [])

    @jsii.member(jsii_name="resetFallbackRoute")
    def reset_fallback_route(self) -> None:
        return jsii.invoke(self, "resetFallbackRoute", [])

    @jsii.member(jsii_name="resetFileUpload")
    def reset_file_upload(self) -> None:
        return jsii.invoke(self, "resetFileUpload", [])

    @jsii.member(jsii_name="resetIpFilterRule")
    def reset_ip_filter_rule(self) -> None:
        return jsii.invoke(self, "resetIpFilterRule", [])

    @jsii.member(jsii_name="resetMinTlsVersion")
    def reset_min_tls_version(self) -> None:
        return jsii.invoke(self, "resetMinTlsVersion", [])

    @jsii.member(jsii_name="resetPublicNetworkAccessEnabled")
    def reset_public_network_access_enabled(self) -> None:
        return jsii.invoke(self, "resetPublicNetworkAccessEnabled", [])

    @jsii.member(jsii_name="resetRoute")
    def reset_route(self) -> None:
        return jsii.invoke(self, "resetRoute", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="sharedAccessPolicy")
    def shared_access_policy(self, index: builtins.str) -> "IothubSharedAccessPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "sharedAccessPolicy", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubEventsEndpoint")
    def event_hub_events_endpoint(self) -> builtins.str:
        return jsii.get(self, "eventHubEventsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubEventsPath")
    def event_hub_events_path(self) -> builtins.str:
        return jsii.get(self, "eventHubEventsPath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubOperationsEndpoint")
    def event_hub_operations_endpoint(self) -> builtins.str:
        return jsii.get(self, "eventHubOperationsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubOperationsPath")
    def event_hub_operations_path(self) -> builtins.str:
        return jsii.get(self, "eventHubOperationsPath")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["IothubSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointInput")
    def endpoint_input(self) -> typing.Optional[typing.List["IothubEndpoint"]]:
        return jsii.get(self, "endpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubPartitionCountInput")
    def event_hub_partition_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "eventHubPartitionCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubRetentionInDaysInput")
    def event_hub_retention_in_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "eventHubRetentionInDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fallbackRouteInput")
    def fallback_route_input(
        self,
    ) -> typing.Optional[typing.List["IothubFallbackRoute"]]:
        return jsii.get(self, "fallbackRouteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileUploadInput")
    def file_upload_input(self) -> typing.Optional[typing.List["IothubFileUpload"]]:
        return jsii.get(self, "fileUploadInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipFilterRuleInput")
    def ip_filter_rule_input(
        self,
    ) -> typing.Optional[typing.List["IothubIpFilterRule"]]:
        return jsii.get(self, "ipFilterRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersionInput")
    def min_tls_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "minTlsVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabledInput")
    def public_network_access_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "publicNetworkAccessEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeInput")
    def route_input(self) -> typing.Optional[typing.List["IothubRoute"]]:
        return jsii.get(self, "routeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> typing.List["IothubEndpoint"]:
        return jsii.get(self, "endpoint")

    @endpoint.setter # type: ignore
    def endpoint(self, value: typing.List["IothubEndpoint"]) -> None:
        jsii.set(self, "endpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubPartitionCount")
    def event_hub_partition_count(self) -> jsii.Number:
        return jsii.get(self, "eventHubPartitionCount")

    @event_hub_partition_count.setter # type: ignore
    def event_hub_partition_count(self, value: jsii.Number) -> None:
        jsii.set(self, "eventHubPartitionCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventHubRetentionInDays")
    def event_hub_retention_in_days(self) -> jsii.Number:
        return jsii.get(self, "eventHubRetentionInDays")

    @event_hub_retention_in_days.setter # type: ignore
    def event_hub_retention_in_days(self, value: jsii.Number) -> None:
        jsii.set(self, "eventHubRetentionInDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fallbackRoute")
    def fallback_route(self) -> typing.List["IothubFallbackRoute"]:
        return jsii.get(self, "fallbackRoute")

    @fallback_route.setter # type: ignore
    def fallback_route(self, value: typing.List["IothubFallbackRoute"]) -> None:
        jsii.set(self, "fallbackRoute", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileUpload")
    def file_upload(self) -> typing.List["IothubFileUpload"]:
        return jsii.get(self, "fileUpload")

    @file_upload.setter # type: ignore
    def file_upload(self, value: typing.List["IothubFileUpload"]) -> None:
        jsii.set(self, "fileUpload", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipFilterRule")
    def ip_filter_rule(self) -> typing.List["IothubIpFilterRule"]:
        return jsii.get(self, "ipFilterRule")

    @ip_filter_rule.setter # type: ignore
    def ip_filter_rule(self, value: typing.List["IothubIpFilterRule"]) -> None:
        jsii.set(self, "ipFilterRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersion")
    def min_tls_version(self) -> builtins.str:
        return jsii.get(self, "minTlsVersion")

    @min_tls_version.setter # type: ignore
    def min_tls_version(self, value: builtins.str) -> None:
        jsii.set(self, "minTlsVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @public_network_access_enabled.setter # type: ignore
    def public_network_access_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "publicNetworkAccessEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="route")
    def route(self) -> typing.List["IothubRoute"]:
        return jsii.get(self, "route")

    @route.setter # type: ignore
    def route(self, value: typing.List["IothubRoute"]) -> None:
        jsii.set(self, "route", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["IothubSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["IothubSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "endpoint": "endpoint",
        "event_hub_partition_count": "eventHubPartitionCount",
        "event_hub_retention_in_days": "eventHubRetentionInDays",
        "fallback_route": "fallbackRoute",
        "file_upload": "fileUpload",
        "ip_filter_rule": "ipFilterRule",
        "min_tls_version": "minTlsVersion",
        "public_network_access_enabled": "publicNetworkAccessEnabled",
        "route": "route",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class IothubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["IothubSku"],
        endpoint: typing.Optional[typing.List["IothubEndpoint"]] = None,
        event_hub_partition_count: typing.Optional[jsii.Number] = None,
        event_hub_retention_in_days: typing.Optional[jsii.Number] = None,
        fallback_route: typing.Optional[typing.List["IothubFallbackRoute"]] = None,
        file_upload: typing.Optional[typing.List["IothubFileUpload"]] = None,
        ip_filter_rule: typing.Optional[typing.List["IothubIpFilterRule"]] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        route: typing.Optional[typing.List["IothubRoute"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IothubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param endpoint: -
        :param event_hub_partition_count: -
        :param event_hub_retention_in_days: -
        :param fallback_route: fallback_route block.
        :param file_upload: file_upload block.
        :param ip_filter_rule: ip_filter_rule block.
        :param min_tls_version: -
        :param public_network_access_enabled: -
        :param route: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if endpoint is not None:
            self._values["endpoint"] = endpoint
        if event_hub_partition_count is not None:
            self._values["event_hub_partition_count"] = event_hub_partition_count
        if event_hub_retention_in_days is not None:
            self._values["event_hub_retention_in_days"] = event_hub_retention_in_days
        if fallback_route is not None:
            self._values["fallback_route"] = fallback_route
        if file_upload is not None:
            self._values["file_upload"] = file_upload
        if ip_filter_rule is not None:
            self._values["ip_filter_rule"] = ip_filter_rule
        if min_tls_version is not None:
            self._values["min_tls_version"] = min_tls_version
        if public_network_access_enabled is not None:
            self._values["public_network_access_enabled"] = public_network_access_enabled
        if route is not None:
            self._values["route"] = route
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["IothubSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def endpoint(self) -> typing.Optional[typing.List["IothubEndpoint"]]:
        result = self._values.get("endpoint")
        return result

    @builtins.property
    def event_hub_partition_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("event_hub_partition_count")
        return result

    @builtins.property
    def event_hub_retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("event_hub_retention_in_days")
        return result

    @builtins.property
    def fallback_route(self) -> typing.Optional[typing.List["IothubFallbackRoute"]]:
        """fallback_route block."""
        result = self._values.get("fallback_route")
        return result

    @builtins.property
    def file_upload(self) -> typing.Optional[typing.List["IothubFileUpload"]]:
        """file_upload block."""
        result = self._values.get("file_upload")
        return result

    @builtins.property
    def ip_filter_rule(self) -> typing.Optional[typing.List["IothubIpFilterRule"]]:
        """ip_filter_rule block."""
        result = self._values.get("ip_filter_rule")
        return result

    @builtins.property
    def min_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_tls_version")
        return result

    @builtins.property
    def public_network_access_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("public_network_access_enabled")
        return result

    @builtins.property
    def route(self) -> typing.Optional[typing.List["IothubRoute"]]:
        result = self._values.get("route")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubConsumerGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubConsumerGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        eventhub_endpoint_name: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubConsumerGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param eventhub_endpoint_name: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubConsumerGroupConfig(
            eventhub_endpoint_name=eventhub_endpoint_name,
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubConsumerGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubEndpointNameInput")
    def eventhub_endpoint_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubEndpointNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubConsumerGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubEndpointName")
    def eventhub_endpoint_name(self) -> builtins.str:
        return jsii.get(self, "eventhubEndpointName")

    @eventhub_endpoint_name.setter # type: ignore
    def eventhub_endpoint_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubEndpointName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubConsumerGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubConsumerGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubConsumerGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "eventhub_endpoint_name": "eventhubEndpointName",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class IothubConsumerGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        eventhub_endpoint_name: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubConsumerGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param eventhub_endpoint_name: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubConsumerGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "eventhub_endpoint_name": eventhub_endpoint_name,
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def eventhub_endpoint_name(self) -> builtins.str:
        result = self._values.get("eventhub_endpoint_name")
        assert result is not None, "Required property 'eventhub_endpoint_name' is missing"
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubConsumerGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubConsumerGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubConsumerGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubConsumerGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubConsumerGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubDps(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubDps",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["IothubDpsSku"],
        linked_hub: typing.Optional[typing.List["IothubDpsLinkedHub"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IothubDpsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param linked_hub: linked_hub block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubDpsConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            linked_hub=linked_hub,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubDps, self, [scope, id, config])

    @jsii.member(jsii_name="resetLinkedHub")
    def reset_linked_hub(self) -> None:
        return jsii.invoke(self, "resetLinkedHub", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocationPolicy")
    def allocation_policy(self) -> builtins.str:
        return jsii.get(self, "allocationPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceProvisioningHostName")
    def device_provisioning_host_name(self) -> builtins.str:
        return jsii.get(self, "deviceProvisioningHostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idScope")
    def id_scope(self) -> builtins.str:
        return jsii.get(self, "idScope")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceOperationsHostName")
    def service_operations_host_name(self) -> builtins.str:
        return jsii.get(self, "serviceOperationsHostName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["IothubDpsSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedHubInput")
    def linked_hub_input(self) -> typing.Optional[typing.List["IothubDpsLinkedHub"]]:
        return jsii.get(self, "linkedHubInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubDpsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedHub")
    def linked_hub(self) -> typing.List["IothubDpsLinkedHub"]:
        return jsii.get(self, "linkedHub")

    @linked_hub.setter # type: ignore
    def linked_hub(self, value: typing.List["IothubDpsLinkedHub"]) -> None:
        jsii.set(self, "linkedHub", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["IothubDpsSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["IothubDpsSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubDpsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubDpsTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class IothubDpsCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubDpsCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        certificate_content: builtins.str,
        iot_dps_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubDpsCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param certificate_content: -
        :param iot_dps_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubDpsCertificateConfig(
            certificate_content=certificate_content,
            iot_dps_name=iot_dps_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubDpsCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateContentInput")
    def certificate_content_input(self) -> builtins.str:
        return jsii.get(self, "certificateContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iotDpsNameInput")
    def iot_dps_name_input(self) -> builtins.str:
        return jsii.get(self, "iotDpsNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubDpsCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateContent")
    def certificate_content(self) -> builtins.str:
        return jsii.get(self, "certificateContent")

    @certificate_content.setter # type: ignore
    def certificate_content(self, value: builtins.str) -> None:
        jsii.set(self, "certificateContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iotDpsName")
    def iot_dps_name(self) -> builtins.str:
        return jsii.get(self, "iotDpsName")

    @iot_dps_name.setter # type: ignore
    def iot_dps_name(self, value: builtins.str) -> None:
        jsii.set(self, "iotDpsName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubDpsCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubDpsCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubDpsCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "certificate_content": "certificateContent",
        "iot_dps_name": "iotDpsName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class IothubDpsCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        certificate_content: builtins.str,
        iot_dps_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubDpsCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param certificate_content: -
        :param iot_dps_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubDpsCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "certificate_content": certificate_content,
            "iot_dps_name": iot_dps_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def certificate_content(self) -> builtins.str:
        result = self._values.get("certificate_content")
        assert result is not None, "Required property 'certificate_content' is missing"
        return result

    @builtins.property
    def iot_dps_name(self) -> builtins.str:
        result = self._values.get("iot_dps_name")
        assert result is not None, "Required property 'iot_dps_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubDpsCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubDpsCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubDpsCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubDpsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "linked_hub": "linkedHub",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class IothubDpsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["IothubDpsSku"],
        linked_hub: typing.Optional[typing.List["IothubDpsLinkedHub"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IothubDpsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param linked_hub: linked_hub block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubDpsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if linked_hub is not None:
            self._values["linked_hub"] = linked_hub
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["IothubDpsSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def linked_hub(self) -> typing.Optional[typing.List["IothubDpsLinkedHub"]]:
        """linked_hub block."""
        result = self._values.get("linked_hub")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubDpsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubDpsLinkedHub",
    jsii_struct_bases=[],
    name_mapping={
        "connection_string": "connectionString",
        "location": "location",
        "allocation_weight": "allocationWeight",
        "apply_allocation_policy": "applyAllocationPolicy",
    },
)
class IothubDpsLinkedHub:
    def __init__(
        self,
        *,
        connection_string: builtins.str,
        location: builtins.str,
        allocation_weight: typing.Optional[jsii.Number] = None,
        apply_allocation_policy: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param connection_string: -
        :param location: -
        :param allocation_weight: -
        :param apply_allocation_policy: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "location": location,
        }
        if allocation_weight is not None:
            self._values["allocation_weight"] = allocation_weight
        if apply_allocation_policy is not None:
            self._values["apply_allocation_policy"] = apply_allocation_policy

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def allocation_weight(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("allocation_weight")
        return result

    @builtins.property
    def apply_allocation_policy(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("apply_allocation_policy")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsLinkedHub(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubDpsSharedAccessPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubDpsSharedAccessPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        iothub_dps_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        enrollment_read: typing.Optional[builtins.bool] = None,
        enrollment_write: typing.Optional[builtins.bool] = None,
        registration_read: typing.Optional[builtins.bool] = None,
        registration_write: typing.Optional[builtins.bool] = None,
        service_config: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["IothubDpsSharedAccessPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param iothub_dps_name: -
        :param name: -
        :param resource_group_name: -
        :param enrollment_read: -
        :param enrollment_write: -
        :param registration_read: -
        :param registration_write: -
        :param service_config: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubDpsSharedAccessPolicyConfig(
            iothub_dps_name=iothub_dps_name,
            name=name,
            resource_group_name=resource_group_name,
            enrollment_read=enrollment_read,
            enrollment_write=enrollment_write,
            registration_read=registration_read,
            registration_write=registration_write,
            service_config=service_config,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubDpsSharedAccessPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnrollmentRead")
    def reset_enrollment_read(self) -> None:
        return jsii.invoke(self, "resetEnrollmentRead", [])

    @jsii.member(jsii_name="resetEnrollmentWrite")
    def reset_enrollment_write(self) -> None:
        return jsii.invoke(self, "resetEnrollmentWrite", [])

    @jsii.member(jsii_name="resetRegistrationRead")
    def reset_registration_read(self) -> None:
        return jsii.invoke(self, "resetRegistrationRead", [])

    @jsii.member(jsii_name="resetRegistrationWrite")
    def reset_registration_write(self) -> None:
        return jsii.invoke(self, "resetRegistrationWrite", [])

    @jsii.member(jsii_name="resetServiceConfig")
    def reset_service_config(self) -> None:
        return jsii.invoke(self, "resetServiceConfig", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubDpsNameInput")
    def iothub_dps_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubDpsNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enrollmentReadInput")
    def enrollment_read_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enrollmentReadInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enrollmentWriteInput")
    def enrollment_write_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enrollmentWriteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationReadInput")
    def registration_read_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "registrationReadInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationWriteInput")
    def registration_write_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "registrationWriteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceConfigInput")
    def service_config_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "serviceConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubDpsSharedAccessPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enrollmentRead")
    def enrollment_read(self) -> builtins.bool:
        return jsii.get(self, "enrollmentRead")

    @enrollment_read.setter # type: ignore
    def enrollment_read(self, value: builtins.bool) -> None:
        jsii.set(self, "enrollmentRead", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enrollmentWrite")
    def enrollment_write(self) -> builtins.bool:
        return jsii.get(self, "enrollmentWrite")

    @enrollment_write.setter # type: ignore
    def enrollment_write(self, value: builtins.bool) -> None:
        jsii.set(self, "enrollmentWrite", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubDpsName")
    def iothub_dps_name(self) -> builtins.str:
        return jsii.get(self, "iothubDpsName")

    @iothub_dps_name.setter # type: ignore
    def iothub_dps_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubDpsName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationRead")
    def registration_read(self) -> builtins.bool:
        return jsii.get(self, "registrationRead")

    @registration_read.setter # type: ignore
    def registration_read(self, value: builtins.bool) -> None:
        jsii.set(self, "registrationRead", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationWrite")
    def registration_write(self) -> builtins.bool:
        return jsii.get(self, "registrationWrite")

    @registration_write.setter # type: ignore
    def registration_write(self, value: builtins.bool) -> None:
        jsii.set(self, "registrationWrite", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceConfig")
    def service_config(self) -> builtins.bool:
        return jsii.get(self, "serviceConfig")

    @service_config.setter # type: ignore
    def service_config(self, value: builtins.bool) -> None:
        jsii.set(self, "serviceConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubDpsSharedAccessPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubDpsSharedAccessPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubDpsSharedAccessPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "iothub_dps_name": "iothubDpsName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "enrollment_read": "enrollmentRead",
        "enrollment_write": "enrollmentWrite",
        "registration_read": "registrationRead",
        "registration_write": "registrationWrite",
        "service_config": "serviceConfig",
        "timeouts": "timeouts",
    },
)
class IothubDpsSharedAccessPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        iothub_dps_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        enrollment_read: typing.Optional[builtins.bool] = None,
        enrollment_write: typing.Optional[builtins.bool] = None,
        registration_read: typing.Optional[builtins.bool] = None,
        registration_write: typing.Optional[builtins.bool] = None,
        service_config: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["IothubDpsSharedAccessPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param iothub_dps_name: -
        :param name: -
        :param resource_group_name: -
        :param enrollment_read: -
        :param enrollment_write: -
        :param registration_read: -
        :param registration_write: -
        :param service_config: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubDpsSharedAccessPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "iothub_dps_name": iothub_dps_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enrollment_read is not None:
            self._values["enrollment_read"] = enrollment_read
        if enrollment_write is not None:
            self._values["enrollment_write"] = enrollment_write
        if registration_read is not None:
            self._values["registration_read"] = registration_read
        if registration_write is not None:
            self._values["registration_write"] = registration_write
        if service_config is not None:
            self._values["service_config"] = service_config
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def iothub_dps_name(self) -> builtins.str:
        result = self._values.get("iothub_dps_name")
        assert result is not None, "Required property 'iothub_dps_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def enrollment_read(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enrollment_read")
        return result

    @builtins.property
    def enrollment_write(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enrollment_write")
        return result

    @builtins.property
    def registration_read(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("registration_read")
        return result

    @builtins.property
    def registration_write(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("registration_write")
        return result

    @builtins.property
    def service_config(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("service_config")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubDpsSharedAccessPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsSharedAccessPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubDpsSharedAccessPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubDpsSharedAccessPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsSharedAccessPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubDpsSku",
    jsii_struct_bases=[],
    name_mapping={"capacity": "capacity", "name": "name"},
)
class IothubDpsSku:
    def __init__(self, *, capacity: jsii.Number, name: builtins.str) -> None:
        """
        :param capacity: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "capacity": capacity,
            "name": name,
        }

    @builtins.property
    def capacity(self) -> jsii.Number:
        result = self._values.get("capacity")
        assert result is not None, "Required property 'capacity' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubDpsTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubDpsTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubDpsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubEndpoint",
    jsii_struct_bases=[],
    name_mapping={
        "batch_frequency_in_seconds": "batchFrequencyInSeconds",
        "connection_string": "connectionString",
        "container_name": "containerName",
        "encoding": "encoding",
        "file_name_format": "fileNameFormat",
        "max_chunk_size_in_bytes": "maxChunkSizeInBytes",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "type": "type",
    },
)
class IothubEndpoint:
    def __init__(
        self,
        *,
        batch_frequency_in_seconds: typing.Optional[jsii.Number] = None,
        connection_string: typing.Optional[builtins.str] = None,
        container_name: typing.Optional[builtins.str] = None,
        encoding: typing.Optional[builtins.str] = None,
        file_name_format: typing.Optional[builtins.str] = None,
        max_chunk_size_in_bytes: typing.Optional[jsii.Number] = None,
        name: typing.Optional[builtins.str] = None,
        resource_group_name: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param batch_frequency_in_seconds: -
        :param connection_string: -
        :param container_name: -
        :param encoding: -
        :param file_name_format: -
        :param max_chunk_size_in_bytes: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if batch_frequency_in_seconds is not None:
            self._values["batch_frequency_in_seconds"] = batch_frequency_in_seconds
        if connection_string is not None:
            self._values["connection_string"] = connection_string
        if container_name is not None:
            self._values["container_name"] = container_name
        if encoding is not None:
            self._values["encoding"] = encoding
        if file_name_format is not None:
            self._values["file_name_format"] = file_name_format
        if max_chunk_size_in_bytes is not None:
            self._values["max_chunk_size_in_bytes"] = max_chunk_size_in_bytes
        if name is not None:
            self._values["name"] = name
        if resource_group_name is not None:
            self._values["resource_group_name"] = resource_group_name
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def batch_frequency_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("batch_frequency_in_seconds")
        return result

    @builtins.property
    def connection_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("connection_string")
        return result

    @builtins.property
    def container_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("container_name")
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def file_name_format(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_name_format")
        return result

    @builtins.property
    def max_chunk_size_in_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_chunk_size_in_bytes")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def resource_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_group_name")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubEndpointEventhub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubEndpointEventhub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubEndpointEventhubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubEndpointEventhubConfig(
            connection_string=connection_string,
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubEndpointEventhub, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubEndpointEventhubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubEndpointEventhubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubEndpointEventhubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointEventhubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class IothubEndpointEventhubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubEndpointEventhubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubEndpointEventhubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubEndpointEventhubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointEventhubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointEventhubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubEndpointEventhubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointEventhubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubEndpointServicebusQueue(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubEndpointServicebusQueue",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubEndpointServicebusQueueTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubEndpointServicebusQueueConfig(
            connection_string=connection_string,
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubEndpointServicebusQueue, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IothubEndpointServicebusQueueTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubEndpointServicebusQueueTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubEndpointServicebusQueueTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointServicebusQueueConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class IothubEndpointServicebusQueueConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubEndpointServicebusQueueTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubEndpointServicebusQueueTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubEndpointServicebusQueueTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointServicebusQueueConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointServicebusQueueTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubEndpointServicebusQueueTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointServicebusQueueTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubEndpointServicebusTopic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubEndpointServicebusTopic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubEndpointServicebusTopicTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubEndpointServicebusTopicConfig(
            connection_string=connection_string,
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubEndpointServicebusTopic, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IothubEndpointServicebusTopicTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubEndpointServicebusTopicTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubEndpointServicebusTopicTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointServicebusTopicConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class IothubEndpointServicebusTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["IothubEndpointServicebusTopicTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubEndpointServicebusTopicTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubEndpointServicebusTopicTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointServicebusTopicConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointServicebusTopicTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubEndpointServicebusTopicTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointServicebusTopicTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubEndpointStorageContainer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubEndpointStorageContainer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_string: builtins.str,
        container_name: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        batch_frequency_in_seconds: typing.Optional[jsii.Number] = None,
        encoding: typing.Optional[builtins.str] = None,
        file_name_format: typing.Optional[builtins.str] = None,
        max_chunk_size_in_bytes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["IothubEndpointStorageContainerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_string: -
        :param container_name: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param batch_frequency_in_seconds: -
        :param encoding: -
        :param file_name_format: -
        :param max_chunk_size_in_bytes: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubEndpointStorageContainerConfig(
            connection_string=connection_string,
            container_name=container_name,
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            batch_frequency_in_seconds=batch_frequency_in_seconds,
            encoding=encoding,
            file_name_format=file_name_format,
            max_chunk_size_in_bytes=max_chunk_size_in_bytes,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubEndpointStorageContainer, self, [scope, id, config])

    @jsii.member(jsii_name="resetBatchFrequencyInSeconds")
    def reset_batch_frequency_in_seconds(self) -> None:
        return jsii.invoke(self, "resetBatchFrequencyInSeconds", [])

    @jsii.member(jsii_name="resetEncoding")
    def reset_encoding(self) -> None:
        return jsii.invoke(self, "resetEncoding", [])

    @jsii.member(jsii_name="resetFileNameFormat")
    def reset_file_name_format(self) -> None:
        return jsii.invoke(self, "resetFileNameFormat", [])

    @jsii.member(jsii_name="resetMaxChunkSizeInBytes")
    def reset_max_chunk_size_in_bytes(self) -> None:
        return jsii.invoke(self, "resetMaxChunkSizeInBytes", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionStringInput")
    def connection_string_input(self) -> builtins.str:
        return jsii.get(self, "connectionStringInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerNameInput")
    def container_name_input(self) -> builtins.str:
        return jsii.get(self, "containerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="batchFrequencyInSecondsInput")
    def batch_frequency_in_seconds_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "batchFrequencyInSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encodingInput")
    def encoding_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "encodingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileNameFormatInput")
    def file_name_format_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "fileNameFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxChunkSizeInBytesInput")
    def max_chunk_size_in_bytes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxChunkSizeInBytesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["IothubEndpointStorageContainerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="batchFrequencyInSeconds")
    def batch_frequency_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "batchFrequencyInSeconds")

    @batch_frequency_in_seconds.setter # type: ignore
    def batch_frequency_in_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "batchFrequencyInSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionString")
    def connection_string(self) -> builtins.str:
        return jsii.get(self, "connectionString")

    @connection_string.setter # type: ignore
    def connection_string(self, value: builtins.str) -> None:
        jsii.set(self, "connectionString", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerName")
    def container_name(self) -> builtins.str:
        return jsii.get(self, "containerName")

    @container_name.setter # type: ignore
    def container_name(self, value: builtins.str) -> None:
        jsii.set(self, "containerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encoding")
    def encoding(self) -> builtins.str:
        return jsii.get(self, "encoding")

    @encoding.setter # type: ignore
    def encoding(self, value: builtins.str) -> None:
        jsii.set(self, "encoding", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileNameFormat")
    def file_name_format(self) -> builtins.str:
        return jsii.get(self, "fileNameFormat")

    @file_name_format.setter # type: ignore
    def file_name_format(self, value: builtins.str) -> None:
        jsii.set(self, "fileNameFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxChunkSizeInBytes")
    def max_chunk_size_in_bytes(self) -> jsii.Number:
        return jsii.get(self, "maxChunkSizeInBytes")

    @max_chunk_size_in_bytes.setter # type: ignore
    def max_chunk_size_in_bytes(self, value: jsii.Number) -> None:
        jsii.set(self, "maxChunkSizeInBytes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubEndpointStorageContainerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubEndpointStorageContainerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointStorageContainerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_string": "connectionString",
        "container_name": "containerName",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "batch_frequency_in_seconds": "batchFrequencyInSeconds",
        "encoding": "encoding",
        "file_name_format": "fileNameFormat",
        "max_chunk_size_in_bytes": "maxChunkSizeInBytes",
        "timeouts": "timeouts",
    },
)
class IothubEndpointStorageContainerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_string: builtins.str,
        container_name: builtins.str,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        batch_frequency_in_seconds: typing.Optional[jsii.Number] = None,
        encoding: typing.Optional[builtins.str] = None,
        file_name_format: typing.Optional[builtins.str] = None,
        max_chunk_size_in_bytes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["IothubEndpointStorageContainerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_string: -
        :param container_name: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param batch_frequency_in_seconds: -
        :param encoding: -
        :param file_name_format: -
        :param max_chunk_size_in_bytes: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubEndpointStorageContainerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "container_name": container_name,
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if batch_frequency_in_seconds is not None:
            self._values["batch_frequency_in_seconds"] = batch_frequency_in_seconds
        if encoding is not None:
            self._values["encoding"] = encoding
        if file_name_format is not None:
            self._values["file_name_format"] = file_name_format
        if max_chunk_size_in_bytes is not None:
            self._values["max_chunk_size_in_bytes"] = max_chunk_size_in_bytes
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def container_name(self) -> builtins.str:
        result = self._values.get("container_name")
        assert result is not None, "Required property 'container_name' is missing"
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def batch_frequency_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("batch_frequency_in_seconds")
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def file_name_format(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_name_format")
        return result

    @builtins.property
    def max_chunk_size_in_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_chunk_size_in_bytes")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubEndpointStorageContainerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointStorageContainerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubEndpointStorageContainerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubEndpointStorageContainerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubEndpointStorageContainerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubFallbackRoute",
    jsii_struct_bases=[],
    name_mapping={
        "condition": "condition",
        "enabled": "enabled",
        "endpoint_names": "endpointNames",
        "source": "source",
    },
)
class IothubFallbackRoute:
    def __init__(
        self,
        *,
        condition: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        endpoint_names: typing.Optional[typing.List[builtins.str]] = None,
        source: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param condition: -
        :param enabled: -
        :param endpoint_names: -
        :param source: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if condition is not None:
            self._values["condition"] = condition
        if enabled is not None:
            self._values["enabled"] = enabled
        if endpoint_names is not None:
            self._values["endpoint_names"] = endpoint_names
        if source is not None:
            self._values["source"] = source

    @builtins.property
    def condition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("condition")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def endpoint_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("endpoint_names")
        return result

    @builtins.property
    def source(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubFallbackRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubFallbackRouteA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubFallbackRouteA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        enabled: builtins.bool,
        endpoint_names: typing.List[builtins.str],
        iothub_name: builtins.str,
        resource_group_name: builtins.str,
        condition: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IothubFallbackRouteTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param enabled: -
        :param endpoint_names: -
        :param iothub_name: -
        :param resource_group_name: -
        :param condition: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubFallbackRouteAConfig(
            enabled=enabled,
            endpoint_names=endpoint_names,
            iothub_name=iothub_name,
            resource_group_name=resource_group_name,
            condition=condition,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubFallbackRouteA, self, [scope, id, config])

    @jsii.member(jsii_name="resetCondition")
    def reset_condition(self) -> None:
        return jsii.invoke(self, "resetCondition", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> builtins.bool:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointNamesInput")
    def endpoint_names_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "endpointNamesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="conditionInput")
    def condition_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "conditionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubFallbackRouteTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="condition")
    def condition(self) -> builtins.str:
        return jsii.get(self, "condition")

    @condition.setter # type: ignore
    def condition(self, value: builtins.str) -> None:
        jsii.set(self, "condition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointNames")
    def endpoint_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "endpointNames")

    @endpoint_names.setter # type: ignore
    def endpoint_names(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "endpointNames", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubFallbackRouteTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubFallbackRouteTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubFallbackRouteAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "enabled": "enabled",
        "endpoint_names": "endpointNames",
        "iothub_name": "iothubName",
        "resource_group_name": "resourceGroupName",
        "condition": "condition",
        "timeouts": "timeouts",
    },
)
class IothubFallbackRouteAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        enabled: builtins.bool,
        endpoint_names: typing.List[builtins.str],
        iothub_name: builtins.str,
        resource_group_name: builtins.str,
        condition: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IothubFallbackRouteTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param enabled: -
        :param endpoint_names: -
        :param iothub_name: -
        :param resource_group_name: -
        :param condition: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubFallbackRouteTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "endpoint_names": endpoint_names,
            "iothub_name": iothub_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if condition is not None:
            self._values["condition"] = condition
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def endpoint_names(self) -> typing.List[builtins.str]:
        result = self._values.get("endpoint_names")
        assert result is not None, "Required property 'endpoint_names' is missing"
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def condition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("condition")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubFallbackRouteTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubFallbackRouteAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubFallbackRouteTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubFallbackRouteTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubFallbackRouteTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubFileUpload",
    jsii_struct_bases=[],
    name_mapping={
        "connection_string": "connectionString",
        "container_name": "containerName",
        "default_ttl": "defaultTtl",
        "lock_duration": "lockDuration",
        "max_delivery_count": "maxDeliveryCount",
        "notifications": "notifications",
        "sas_ttl": "sasTtl",
    },
)
class IothubFileUpload:
    def __init__(
        self,
        *,
        connection_string: builtins.str,
        container_name: builtins.str,
        default_ttl: typing.Optional[builtins.str] = None,
        lock_duration: typing.Optional[builtins.str] = None,
        max_delivery_count: typing.Optional[jsii.Number] = None,
        notifications: typing.Optional[builtins.bool] = None,
        sas_ttl: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param connection_string: -
        :param container_name: -
        :param default_ttl: -
        :param lock_duration: -
        :param max_delivery_count: -
        :param notifications: -
        :param sas_ttl: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "connection_string": connection_string,
            "container_name": container_name,
        }
        if default_ttl is not None:
            self._values["default_ttl"] = default_ttl
        if lock_duration is not None:
            self._values["lock_duration"] = lock_duration
        if max_delivery_count is not None:
            self._values["max_delivery_count"] = max_delivery_count
        if notifications is not None:
            self._values["notifications"] = notifications
        if sas_ttl is not None:
            self._values["sas_ttl"] = sas_ttl

    @builtins.property
    def connection_string(self) -> builtins.str:
        result = self._values.get("connection_string")
        assert result is not None, "Required property 'connection_string' is missing"
        return result

    @builtins.property
    def container_name(self) -> builtins.str:
        result = self._values.get("container_name")
        assert result is not None, "Required property 'container_name' is missing"
        return result

    @builtins.property
    def default_ttl(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_ttl")
        return result

    @builtins.property
    def lock_duration(self) -> typing.Optional[builtins.str]:
        result = self._values.get("lock_duration")
        return result

    @builtins.property
    def max_delivery_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_delivery_count")
        return result

    @builtins.property
    def notifications(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("notifications")
        return result

    @builtins.property
    def sas_ttl(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sas_ttl")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubFileUpload(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubIpFilterRule",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "ip_mask": "ipMask", "name": "name"},
)
class IothubIpFilterRule:
    def __init__(
        self,
        *,
        action: builtins.str,
        ip_mask: builtins.str,
        name: builtins.str,
    ) -> None:
        """
        :param action: -
        :param ip_mask: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "ip_mask": ip_mask,
            "name": name,
        }

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def ip_mask(self) -> builtins.str:
        result = self._values.get("ip_mask")
        assert result is not None, "Required property 'ip_mask' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubIpFilterRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubRoute",
    jsii_struct_bases=[],
    name_mapping={
        "condition": "condition",
        "enabled": "enabled",
        "endpoint_names": "endpointNames",
        "name": "name",
        "source": "source",
    },
)
class IothubRoute:
    def __init__(
        self,
        *,
        condition: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        endpoint_names: typing.Optional[typing.List[builtins.str]] = None,
        name: typing.Optional[builtins.str] = None,
        source: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param condition: -
        :param enabled: -
        :param endpoint_names: -
        :param name: -
        :param source: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if condition is not None:
            self._values["condition"] = condition
        if enabled is not None:
            self._values["enabled"] = enabled
        if endpoint_names is not None:
            self._values["endpoint_names"] = endpoint_names
        if name is not None:
            self._values["name"] = name
        if source is not None:
            self._values["source"] = source

    @builtins.property
    def condition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("condition")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def endpoint_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("endpoint_names")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def source(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubRouteA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubRouteA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        enabled: builtins.bool,
        endpoint_names: typing.List[builtins.str],
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        source: builtins.str,
        condition: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IothubRouteTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param enabled: -
        :param endpoint_names: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param source: -
        :param condition: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubRouteAConfig(
            enabled=enabled,
            endpoint_names=endpoint_names,
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            source=source,
            condition=condition,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubRouteA, self, [scope, id, config])

    @jsii.member(jsii_name="resetCondition")
    def reset_condition(self) -> None:
        return jsii.invoke(self, "resetCondition", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> builtins.bool:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointNamesInput")
    def endpoint_names_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "endpointNamesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceInput")
    def source_input(self) -> builtins.str:
        return jsii.get(self, "sourceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="conditionInput")
    def condition_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "conditionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubRouteTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="condition")
    def condition(self) -> builtins.str:
        return jsii.get(self, "condition")

    @condition.setter # type: ignore
    def condition(self, value: builtins.str) -> None:
        jsii.set(self, "condition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointNames")
    def endpoint_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "endpointNames")

    @endpoint_names.setter # type: ignore
    def endpoint_names(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "endpointNames", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="source")
    def source(self) -> builtins.str:
        return jsii.get(self, "source")

    @source.setter # type: ignore
    def source(self, value: builtins.str) -> None:
        jsii.set(self, "source", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubRouteTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubRouteTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubRouteAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "enabled": "enabled",
        "endpoint_names": "endpointNames",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "source": "source",
        "condition": "condition",
        "timeouts": "timeouts",
    },
)
class IothubRouteAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        enabled: builtins.bool,
        endpoint_names: typing.List[builtins.str],
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        source: builtins.str,
        condition: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["IothubRouteTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param enabled: -
        :param endpoint_names: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param source: -
        :param condition: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubRouteTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "endpoint_names": endpoint_names,
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "source": source,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if condition is not None:
            self._values["condition"] = condition
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def endpoint_names(self) -> typing.List[builtins.str]:
        result = self._values.get("endpoint_names")
        assert result is not None, "Required property 'endpoint_names' is missing"
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def source(self) -> builtins.str:
        result = self._values.get("source")
        assert result is not None, "Required property 'source' is missing"
        return result

    @builtins.property
    def condition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("condition")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubRouteTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubRouteAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubRouteTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubRouteTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubRouteTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IothubSharedAccessPolicy(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubSharedAccessPolicy",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(IothubSharedAccessPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyName")
    def key_name(self) -> builtins.str:
        return jsii.get(self, "keyName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="permissions")
    def permissions(self) -> builtins.str:
        return jsii.get(self, "permissions")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")


class IothubSharedAccessPolicyA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IothubSharedAccessPolicyA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        device_connect: typing.Optional[builtins.bool] = None,
        registry_read: typing.Optional[builtins.bool] = None,
        registry_write: typing.Optional[builtins.bool] = None,
        service_connect: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["IothubSharedAccessPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param device_connect: -
        :param registry_read: -
        :param registry_write: -
        :param service_connect: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IothubSharedAccessPolicyAConfig(
            iothub_name=iothub_name,
            name=name,
            resource_group_name=resource_group_name,
            device_connect=device_connect,
            registry_read=registry_read,
            registry_write=registry_write,
            service_connect=service_connect,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IothubSharedAccessPolicyA, self, [scope, id, config])

    @jsii.member(jsii_name="resetDeviceConnect")
    def reset_device_connect(self) -> None:
        return jsii.invoke(self, "resetDeviceConnect", [])

    @jsii.member(jsii_name="resetRegistryRead")
    def reset_registry_read(self) -> None:
        return jsii.invoke(self, "resetRegistryRead", [])

    @jsii.member(jsii_name="resetRegistryWrite")
    def reset_registry_write(self) -> None:
        return jsii.invoke(self, "resetRegistryWrite", [])

    @jsii.member(jsii_name="resetServiceConnect")
    def reset_service_connect(self) -> None:
        return jsii.invoke(self, "resetServiceConnect", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNameInput")
    def iothub_name_input(self) -> builtins.str:
        return jsii.get(self, "iothubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceConnectInput")
    def device_connect_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "deviceConnectInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registryReadInput")
    def registry_read_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "registryReadInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registryWriteInput")
    def registry_write_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "registryWriteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceConnectInput")
    def service_connect_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "serviceConnectInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IothubSharedAccessPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceConnect")
    def device_connect(self) -> builtins.bool:
        return jsii.get(self, "deviceConnect")

    @device_connect.setter # type: ignore
    def device_connect(self, value: builtins.bool) -> None:
        jsii.set(self, "deviceConnect", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubName")
    def iothub_name(self) -> builtins.str:
        return jsii.get(self, "iothubName")

    @iothub_name.setter # type: ignore
    def iothub_name(self, value: builtins.str) -> None:
        jsii.set(self, "iothubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registryRead")
    def registry_read(self) -> builtins.bool:
        return jsii.get(self, "registryRead")

    @registry_read.setter # type: ignore
    def registry_read(self, value: builtins.bool) -> None:
        jsii.set(self, "registryRead", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registryWrite")
    def registry_write(self) -> builtins.bool:
        return jsii.get(self, "registryWrite")

    @registry_write.setter # type: ignore
    def registry_write(self, value: builtins.bool) -> None:
        jsii.set(self, "registryWrite", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceConnect")
    def service_connect(self) -> builtins.bool:
        return jsii.get(self, "serviceConnect")

    @service_connect.setter # type: ignore
    def service_connect(self, value: builtins.bool) -> None:
        jsii.set(self, "serviceConnect", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IothubSharedAccessPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IothubSharedAccessPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IothubSharedAccessPolicyAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "iothub_name": "iothubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "device_connect": "deviceConnect",
        "registry_read": "registryRead",
        "registry_write": "registryWrite",
        "service_connect": "serviceConnect",
        "timeouts": "timeouts",
    },
)
class IothubSharedAccessPolicyAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        iothub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        device_connect: typing.Optional[builtins.bool] = None,
        registry_read: typing.Optional[builtins.bool] = None,
        registry_write: typing.Optional[builtins.bool] = None,
        service_connect: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["IothubSharedAccessPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param iothub_name: -
        :param name: -
        :param resource_group_name: -
        :param device_connect: -
        :param registry_read: -
        :param registry_write: -
        :param service_connect: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IothubSharedAccessPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "iothub_name": iothub_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if device_connect is not None:
            self._values["device_connect"] = device_connect
        if registry_read is not None:
            self._values["registry_read"] = registry_read
        if registry_write is not None:
            self._values["registry_write"] = registry_write
        if service_connect is not None:
            self._values["service_connect"] = service_connect
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def iothub_name(self) -> builtins.str:
        result = self._values.get("iothub_name")
        assert result is not None, "Required property 'iothub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def device_connect(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("device_connect")
        return result

    @builtins.property
    def registry_read(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("registry_read")
        return result

    @builtins.property
    def registry_write(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("registry_write")
        return result

    @builtins.property
    def service_connect(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("service_connect")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IothubSharedAccessPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubSharedAccessPolicyAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubSharedAccessPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubSharedAccessPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubSharedAccessPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubSku",
    jsii_struct_bases=[],
    name_mapping={"capacity": "capacity", "name": "name"},
)
class IothubSku:
    def __init__(self, *, capacity: jsii.Number, name: builtins.str) -> None:
        """
        :param capacity: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "capacity": capacity,
            "name": name,
        }

    @builtins.property
    def capacity(self) -> jsii.Number:
        result = self._values.get("capacity")
        assert result is not None, "Required property 'capacity' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IothubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IothubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IothubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class IpGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.IpGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        cidrs: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IpGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param cidrs: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IpGroupConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            cidrs=cidrs,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(IpGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetCidrs")
    def reset_cidrs(self) -> None:
        return jsii.invoke(self, "resetCidrs", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cidrsInput")
    def cidrs_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "cidrsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["IpGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cidrs")
    def cidrs(self) -> typing.List[builtins.str]:
        return jsii.get(self, "cidrs")

    @cidrs.setter # type: ignore
    def cidrs(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "cidrs", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "IpGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "IpGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.IpGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "cidrs": "cidrs",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class IpGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        cidrs: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["IpGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param cidrs: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = IpGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if cidrs is not None:
            self._values["cidrs"] = cidrs
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def cidrs(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("cidrs")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["IpGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IpGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.IpGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class IpGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "IpGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KeyVault(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KeyVault",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tenant_id: builtins.str,
        access_policy: typing.Optional[typing.List["KeyVaultAccessPolicy"]] = None,
        contact: typing.Optional[typing.List["KeyVaultContact"]] = None,
        enabled_for_deployment: typing.Optional[builtins.bool] = None,
        enabled_for_disk_encryption: typing.Optional[builtins.bool] = None,
        enabled_for_template_deployment: typing.Optional[builtins.bool] = None,
        enable_rbac_authorization: typing.Optional[builtins.bool] = None,
        network_acls: typing.Optional[typing.List["KeyVaultNetworkAcls"]] = None,
        purge_protection_enabled: typing.Optional[builtins.bool] = None,
        soft_delete_enabled: typing.Optional[builtins.bool] = None,
        soft_delete_retention_days: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tenant_id: -
        :param access_policy: -
        :param contact: contact block.
        :param enabled_for_deployment: -
        :param enabled_for_disk_encryption: -
        :param enabled_for_template_deployment: -
        :param enable_rbac_authorization: -
        :param network_acls: network_acls block.
        :param purge_protection_enabled: -
        :param soft_delete_enabled: -
        :param soft_delete_retention_days: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KeyVaultConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            tenant_id=tenant_id,
            access_policy=access_policy,
            contact=contact,
            enabled_for_deployment=enabled_for_deployment,
            enabled_for_disk_encryption=enabled_for_disk_encryption,
            enabled_for_template_deployment=enabled_for_template_deployment,
            enable_rbac_authorization=enable_rbac_authorization,
            network_acls=network_acls,
            purge_protection_enabled=purge_protection_enabled,
            soft_delete_enabled=soft_delete_enabled,
            soft_delete_retention_days=soft_delete_retention_days,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KeyVault, self, [scope, id, config])

    @jsii.member(jsii_name="resetAccessPolicy")
    def reset_access_policy(self) -> None:
        return jsii.invoke(self, "resetAccessPolicy", [])

    @jsii.member(jsii_name="resetContact")
    def reset_contact(self) -> None:
        return jsii.invoke(self, "resetContact", [])

    @jsii.member(jsii_name="resetEnabledForDeployment")
    def reset_enabled_for_deployment(self) -> None:
        return jsii.invoke(self, "resetEnabledForDeployment", [])

    @jsii.member(jsii_name="resetEnabledForDiskEncryption")
    def reset_enabled_for_disk_encryption(self) -> None:
        return jsii.invoke(self, "resetEnabledForDiskEncryption", [])

    @jsii.member(jsii_name="resetEnabledForTemplateDeployment")
    def reset_enabled_for_template_deployment(self) -> None:
        return jsii.invoke(self, "resetEnabledForTemplateDeployment", [])

    @jsii.member(jsii_name="resetEnableRbacAuthorization")
    def reset_enable_rbac_authorization(self) -> None:
        return jsii.invoke(self, "resetEnableRbacAuthorization", [])

    @jsii.member(jsii_name="resetNetworkAcls")
    def reset_network_acls(self) -> None:
        return jsii.invoke(self, "resetNetworkAcls", [])

    @jsii.member(jsii_name="resetPurgeProtectionEnabled")
    def reset_purge_protection_enabled(self) -> None:
        return jsii.invoke(self, "resetPurgeProtectionEnabled", [])

    @jsii.member(jsii_name="resetSoftDeleteEnabled")
    def reset_soft_delete_enabled(self) -> None:
        return jsii.invoke(self, "resetSoftDeleteEnabled", [])

    @jsii.member(jsii_name="resetSoftDeleteRetentionDays")
    def reset_soft_delete_retention_days(self) -> None:
        return jsii.invoke(self, "resetSoftDeleteRetentionDays", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vaultUri")
    def vault_uri(self) -> builtins.str:
        return jsii.get(self, "vaultUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessPolicyInput")
    def access_policy_input(
        self,
    ) -> typing.Optional[typing.List["KeyVaultAccessPolicy"]]:
        return jsii.get(self, "accessPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contactInput")
    def contact_input(self) -> typing.Optional[typing.List["KeyVaultContact"]]:
        return jsii.get(self, "contactInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForDeploymentInput")
    def enabled_for_deployment_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledForDeploymentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForDiskEncryptionInput")
    def enabled_for_disk_encryption_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledForDiskEncryptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForTemplateDeploymentInput")
    def enabled_for_template_deployment_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledForTemplateDeploymentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableRbacAuthorizationInput")
    def enable_rbac_authorization_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableRbacAuthorizationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkAclsInput")
    def network_acls_input(self) -> typing.Optional[typing.List["KeyVaultNetworkAcls"]]:
        return jsii.get(self, "networkAclsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="purgeProtectionEnabledInput")
    def purge_protection_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "purgeProtectionEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeleteEnabledInput")
    def soft_delete_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "softDeleteEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeleteRetentionDaysInput")
    def soft_delete_retention_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "softDeleteRetentionDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KeyVaultTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessPolicy")
    def access_policy(self) -> typing.List["KeyVaultAccessPolicy"]:
        return jsii.get(self, "accessPolicy")

    @access_policy.setter # type: ignore
    def access_policy(self, value: typing.List["KeyVaultAccessPolicy"]) -> None:
        jsii.set(self, "accessPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contact")
    def contact(self) -> typing.List["KeyVaultContact"]:
        return jsii.get(self, "contact")

    @contact.setter # type: ignore
    def contact(self, value: typing.List["KeyVaultContact"]) -> None:
        jsii.set(self, "contact", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForDeployment")
    def enabled_for_deployment(self) -> builtins.bool:
        return jsii.get(self, "enabledForDeployment")

    @enabled_for_deployment.setter # type: ignore
    def enabled_for_deployment(self, value: builtins.bool) -> None:
        jsii.set(self, "enabledForDeployment", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForDiskEncryption")
    def enabled_for_disk_encryption(self) -> builtins.bool:
        return jsii.get(self, "enabledForDiskEncryption")

    @enabled_for_disk_encryption.setter # type: ignore
    def enabled_for_disk_encryption(self, value: builtins.bool) -> None:
        jsii.set(self, "enabledForDiskEncryption", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledForTemplateDeployment")
    def enabled_for_template_deployment(self) -> builtins.bool:
        return jsii.get(self, "enabledForTemplateDeployment")

    @enabled_for_template_deployment.setter # type: ignore
    def enabled_for_template_deployment(self, value: builtins.bool) -> None:
        jsii.set(self, "enabledForTemplateDeployment", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableRbacAuthorization")
    def enable_rbac_authorization(self) -> builtins.bool:
        return jsii.get(self, "enableRbacAuthorization")

    @enable_rbac_authorization.setter # type: ignore
    def enable_rbac_authorization(self, value: builtins.bool) -> None:
        jsii.set(self, "enableRbacAuthorization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkAcls")
    def network_acls(self) -> typing.List["KeyVaultNetworkAcls"]:
        return jsii.get(self, "networkAcls")

    @network_acls.setter # type: ignore
    def network_acls(self, value: typing.List["KeyVaultNetworkAcls"]) -> None:
        jsii.set(self, "networkAcls", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="purgeProtectionEnabled")
    def purge_protection_enabled(self) -> builtins.bool:
        return jsii.get(self, "purgeProtectionEnabled")

    @purge_protection_enabled.setter # type: ignore
    def purge_protection_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "purgeProtectionEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeleteEnabled")
    def soft_delete_enabled(self) -> builtins.bool:
        return jsii.get(self, "softDeleteEnabled")

    @soft_delete_enabled.setter # type: ignore
    def soft_delete_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "softDeleteEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeleteRetentionDays")
    def soft_delete_retention_days(self) -> jsii.Number:
        return jsii.get(self, "softDeleteRetentionDays")

    @soft_delete_retention_days.setter # type: ignore
    def soft_delete_retention_days(self, value: jsii.Number) -> None:
        jsii.set(self, "softDeleteRetentionDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KeyVaultTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KeyVaultTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KeyVaultAccessPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "application_id": "applicationId",
        "certificate_permissions": "certificatePermissions",
        "key_permissions": "keyPermissions",
        "object_id": "objectId",
        "secret_permissions": "secretPermissions",
        "storage_permissions": "storagePermissions",
        "tenant_id": "tenantId",
    },
)
class KeyVaultAccessPolicy:
    def __init__(
        self,
        *,
        application_id: typing.Optional[builtins.str] = None,
        certificate_permissions: typing.Optional[typing.List[builtins.str]] = None,
        key_permissions: typing.Optional[typing.List[builtins.str]] = None,
        object_id: typing.Optional[builtins.str] = None,
        secret_permissions: typing.Optional[typing.List[builtins.str]] = None,
        storage_permissions: typing.Optional[typing.List[builtins.str]] = None,
        tenant_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param application_id: -
        :param certificate_permissions: -
        :param key_permissions: -
        :param object_id: -
        :param secret_permissions: -
        :param storage_permissions: -
        :param tenant_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if application_id is not None:
            self._values["application_id"] = application_id
        if certificate_permissions is not None:
            self._values["certificate_permissions"] = certificate_permissions
        if key_permissions is not None:
            self._values["key_permissions"] = key_permissions
        if object_id is not None:
            self._values["object_id"] = object_id
        if secret_permissions is not None:
            self._values["secret_permissions"] = secret_permissions
        if storage_permissions is not None:
            self._values["storage_permissions"] = storage_permissions
        if tenant_id is not None:
            self._values["tenant_id"] = tenant_id

    @builtins.property
    def application_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("application_id")
        return result

    @builtins.property
    def certificate_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("certificate_permissions")
        return result

    @builtins.property
    def key_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("key_permissions")
        return result

    @builtins.property
    def object_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("object_id")
        return result

    @builtins.property
    def secret_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("secret_permissions")
        return result

    @builtins.property
    def storage_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("storage_permissions")
        return result

    @builtins.property
    def tenant_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tenant_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultAccessPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KeyVaultAccessPolicyA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KeyVaultAccessPolicyA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_id: builtins.str,
        object_id: builtins.str,
        tenant_id: builtins.str,
        application_id: typing.Optional[builtins.str] = None,
        certificate_permissions: typing.Optional[typing.List[builtins.str]] = None,
        key_permissions: typing.Optional[typing.List[builtins.str]] = None,
        secret_permissions: typing.Optional[typing.List[builtins.str]] = None,
        storage_permissions: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultAccessPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_id: -
        :param object_id: -
        :param tenant_id: -
        :param application_id: -
        :param certificate_permissions: -
        :param key_permissions: -
        :param secret_permissions: -
        :param storage_permissions: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KeyVaultAccessPolicyAConfig(
            key_vault_id=key_vault_id,
            object_id=object_id,
            tenant_id=tenant_id,
            application_id=application_id,
            certificate_permissions=certificate_permissions,
            key_permissions=key_permissions,
            secret_permissions=secret_permissions,
            storage_permissions=storage_permissions,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KeyVaultAccessPolicyA, self, [scope, id, config])

    @jsii.member(jsii_name="resetApplicationId")
    def reset_application_id(self) -> None:
        return jsii.invoke(self, "resetApplicationId", [])

    @jsii.member(jsii_name="resetCertificatePermissions")
    def reset_certificate_permissions(self) -> None:
        return jsii.invoke(self, "resetCertificatePermissions", [])

    @jsii.member(jsii_name="resetKeyPermissions")
    def reset_key_permissions(self) -> None:
        return jsii.invoke(self, "resetKeyPermissions", [])

    @jsii.member(jsii_name="resetSecretPermissions")
    def reset_secret_permissions(self) -> None:
        return jsii.invoke(self, "resetSecretPermissions", [])

    @jsii.member(jsii_name="resetStoragePermissions")
    def reset_storage_permissions(self) -> None:
        return jsii.invoke(self, "resetStoragePermissions", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectIdInput")
    def object_id_input(self) -> builtins.str:
        return jsii.get(self, "objectIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationIdInput")
    def application_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "applicationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificatePermissionsInput")
    def certificate_permissions_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "certificatePermissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyPermissionsInput")
    def key_permissions_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "keyPermissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretPermissionsInput")
    def secret_permissions_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "secretPermissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storagePermissionsInput")
    def storage_permissions_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "storagePermissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KeyVaultAccessPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationId")
    def application_id(self) -> builtins.str:
        return jsii.get(self, "applicationId")

    @application_id.setter # type: ignore
    def application_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificatePermissions")
    def certificate_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "certificatePermissions")

    @certificate_permissions.setter # type: ignore
    def certificate_permissions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "certificatePermissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyPermissions")
    def key_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keyPermissions")

    @key_permissions.setter # type: ignore
    def key_permissions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "keyPermissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @object_id.setter # type: ignore
    def object_id(self, value: builtins.str) -> None:
        jsii.set(self, "objectId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretPermissions")
    def secret_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "secretPermissions")

    @secret_permissions.setter # type: ignore
    def secret_permissions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "secretPermissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storagePermissions")
    def storage_permissions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "storagePermissions")

    @storage_permissions.setter # type: ignore
    def storage_permissions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "storagePermissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KeyVaultAccessPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KeyVaultAccessPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KeyVaultAccessPolicyAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_id": "keyVaultId",
        "object_id": "objectId",
        "tenant_id": "tenantId",
        "application_id": "applicationId",
        "certificate_permissions": "certificatePermissions",
        "key_permissions": "keyPermissions",
        "secret_permissions": "secretPermissions",
        "storage_permissions": "storagePermissions",
        "timeouts": "timeouts",
    },
)
class KeyVaultAccessPolicyAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_id: builtins.str,
        object_id: builtins.str,
        tenant_id: builtins.str,
        application_id: typing.Optional[builtins.str] = None,
        certificate_permissions: typing.Optional[typing.List[builtins.str]] = None,
        key_permissions: typing.Optional[typing.List[builtins.str]] = None,
        secret_permissions: typing.Optional[typing.List[builtins.str]] = None,
        storage_permissions: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultAccessPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_id: -
        :param object_id: -
        :param tenant_id: -
        :param application_id: -
        :param certificate_permissions: -
        :param key_permissions: -
        :param secret_permissions: -
        :param storage_permissions: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KeyVaultAccessPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_id": key_vault_id,
            "object_id": object_id,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if application_id is not None:
            self._values["application_id"] = application_id
        if certificate_permissions is not None:
            self._values["certificate_permissions"] = certificate_permissions
        if key_permissions is not None:
            self._values["key_permissions"] = key_permissions
        if secret_permissions is not None:
            self._values["secret_permissions"] = secret_permissions
        if storage_permissions is not None:
            self._values["storage_permissions"] = storage_permissions
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def object_id(self) -> builtins.str:
        result = self._values.get("object_id")
        assert result is not None, "Required property 'object_id' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def application_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("application_id")
        return result

    @builtins.property
    def certificate_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("certificate_permissions")
        return result

    @builtins.property
    def key_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("key_permissions")
        return result

    @builtins.property
    def secret_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("secret_permissions")
        return result

    @builtins.property
    def storage_permissions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("storage_permissions")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KeyVaultAccessPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultAccessPolicyAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultAccessPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KeyVaultAccessPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultAccessPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KeyVaultCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KeyVaultCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        certificate_policy: typing.List["KeyVaultCertificateCertificatePolicy"],
        key_vault_id: builtins.str,
        name: builtins.str,
        certificate: typing.Optional[typing.List["KeyVaultCertificateCertificate"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param certificate_policy: certificate_policy block.
        :param key_vault_id: -
        :param name: -
        :param certificate: certificate block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KeyVaultCertificateConfig(
            certificate_policy=certificate_policy,
            key_vault_id=key_vault_id,
            name=name,
            certificate=certificate,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KeyVaultCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="certificateAttribute")
    def certificate_attribute(
        self,
        index: builtins.str,
    ) -> "KeyVaultCertificateCertificateAttribute":
        """
        :param index: -
        """
        return jsii.invoke(self, "certificateAttribute", [index])

    @jsii.member(jsii_name="resetCertificate")
    def reset_certificate(self) -> None:
        return jsii.invoke(self, "resetCertificate", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateData")
    def certificate_data(self) -> builtins.str:
        return jsii.get(self, "certificateData")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificatePolicyInput")
    def certificate_policy_input(
        self,
    ) -> typing.List["KeyVaultCertificateCertificatePolicy"]:
        return jsii.get(self, "certificatePolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretId")
    def secret_id(self) -> builtins.str:
        return jsii.get(self, "secretId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="thumbprint")
    def thumbprint(self) -> builtins.str:
        return jsii.get(self, "thumbprint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateInput")
    def certificate_input(
        self,
    ) -> typing.Optional[typing.List["KeyVaultCertificateCertificate"]]:
        return jsii.get(self, "certificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KeyVaultCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> typing.List["KeyVaultCertificateCertificate"]:
        return jsii.get(self, "certificate")

    @certificate.setter # type: ignore
    def certificate(self, value: typing.List["KeyVaultCertificateCertificate"]) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificatePolicy")
    def certificate_policy(self) -> typing.List["KeyVaultCertificateCertificatePolicy"]:
        return jsii.get(self, "certificatePolicy")

    @certificate_policy.setter # type: ignore
    def certificate_policy(
        self,
        value: typing.List["KeyVaultCertificateCertificatePolicy"],
    ) -> None:
        jsii.set(self, "certificatePolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KeyVaultCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KeyVaultCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificate",
    jsii_struct_bases=[],
    name_mapping={"contents": "contents", "password": "password"},
)
class KeyVaultCertificateCertificate:
    def __init__(
        self,
        *,
        contents: builtins.str,
        password: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param contents: -
        :param password: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "contents": contents,
        }
        if password is not None:
            self._values["password"] = password

    @builtins.property
    def contents(self) -> builtins.str:
        result = self._values.get("contents")
        assert result is not None, "Required property 'contents' is missing"
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KeyVaultCertificateCertificateAttribute(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KeyVaultCertificateCertificateAttribute",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(KeyVaultCertificateCertificateAttribute, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="created")
    def created(self) -> builtins.str:
        return jsii.get(self, "created")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expires")
    def expires(self) -> builtins.str:
        return jsii.get(self, "expires")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notBefore")
    def not_before(self) -> builtins.str:
        return jsii.get(self, "notBefore")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryLevel")
    def recovery_level(self) -> builtins.str:
        return jsii.get(self, "recoveryLevel")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="updated")
    def updated(self) -> builtins.str:
        return jsii.get(self, "updated")


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicy",
    jsii_struct_bases=[],
    name_mapping={
        "issuer_parameters": "issuerParameters",
        "key_properties": "keyProperties",
        "secret_properties": "secretProperties",
        "lifetime_action": "lifetimeAction",
        "x509_certificate_properties": "x509CertificateProperties",
    },
)
class KeyVaultCertificateCertificatePolicy:
    def __init__(
        self,
        *,
        issuer_parameters: typing.List["KeyVaultCertificateCertificatePolicyIssuerParameters"],
        key_properties: typing.List["KeyVaultCertificateCertificatePolicyKeyProperties"],
        secret_properties: typing.List["KeyVaultCertificateCertificatePolicySecretProperties"],
        lifetime_action: typing.Optional[typing.List["KeyVaultCertificateCertificatePolicyLifetimeAction"]] = None,
        x509_certificate_properties: typing.Optional[typing.List["KeyVaultCertificateCertificatePolicyX509CertificateProperties"]] = None,
    ) -> None:
        """
        :param issuer_parameters: issuer_parameters block.
        :param key_properties: key_properties block.
        :param secret_properties: secret_properties block.
        :param lifetime_action: lifetime_action block.
        :param x509_certificate_properties: x509_certificate_properties block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "issuer_parameters": issuer_parameters,
            "key_properties": key_properties,
            "secret_properties": secret_properties,
        }
        if lifetime_action is not None:
            self._values["lifetime_action"] = lifetime_action
        if x509_certificate_properties is not None:
            self._values["x509_certificate_properties"] = x509_certificate_properties

    @builtins.property
    def issuer_parameters(
        self,
    ) -> typing.List["KeyVaultCertificateCertificatePolicyIssuerParameters"]:
        """issuer_parameters block."""
        result = self._values.get("issuer_parameters")
        assert result is not None, "Required property 'issuer_parameters' is missing"
        return result

    @builtins.property
    def key_properties(
        self,
    ) -> typing.List["KeyVaultCertificateCertificatePolicyKeyProperties"]:
        """key_properties block."""
        result = self._values.get("key_properties")
        assert result is not None, "Required property 'key_properties' is missing"
        return result

    @builtins.property
    def secret_properties(
        self,
    ) -> typing.List["KeyVaultCertificateCertificatePolicySecretProperties"]:
        """secret_properties block."""
        result = self._values.get("secret_properties")
        assert result is not None, "Required property 'secret_properties' is missing"
        return result

    @builtins.property
    def lifetime_action(
        self,
    ) -> typing.Optional[typing.List["KeyVaultCertificateCertificatePolicyLifetimeAction"]]:
        """lifetime_action block."""
        result = self._values.get("lifetime_action")
        return result

    @builtins.property
    def x509_certificate_properties(
        self,
    ) -> typing.Optional[typing.List["KeyVaultCertificateCertificatePolicyX509CertificateProperties"]]:
        """x509_certificate_properties block."""
        result = self._values.get("x509_certificate_properties")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicyIssuerParameters",
    jsii_struct_bases=[],
    name_mapping={"name": "name"},
)
class KeyVaultCertificateCertificatePolicyIssuerParameters:
    def __init__(self, *, name: builtins.str) -> None:
        """
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicyIssuerParameters(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicyKeyProperties",
    jsii_struct_bases=[],
    name_mapping={
        "exportable": "exportable",
        "key_size": "keySize",
        "key_type": "keyType",
        "reuse_key": "reuseKey",
    },
)
class KeyVaultCertificateCertificatePolicyKeyProperties:
    def __init__(
        self,
        *,
        exportable: builtins.bool,
        key_size: jsii.Number,
        key_type: builtins.str,
        reuse_key: builtins.bool,
    ) -> None:
        """
        :param exportable: -
        :param key_size: -
        :param key_type: -
        :param reuse_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "exportable": exportable,
            "key_size": key_size,
            "key_type": key_type,
            "reuse_key": reuse_key,
        }

    @builtins.property
    def exportable(self) -> builtins.bool:
        result = self._values.get("exportable")
        assert result is not None, "Required property 'exportable' is missing"
        return result

    @builtins.property
    def key_size(self) -> jsii.Number:
        result = self._values.get("key_size")
        assert result is not None, "Required property 'key_size' is missing"
        return result

    @builtins.property
    def key_type(self) -> builtins.str:
        result = self._values.get("key_type")
        assert result is not None, "Required property 'key_type' is missing"
        return result

    @builtins.property
    def reuse_key(self) -> builtins.bool:
        result = self._values.get("reuse_key")
        assert result is not None, "Required property 'reuse_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicyKeyProperties(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicyLifetimeAction",
    jsii_struct_bases=[],
    name_mapping={"action": "action", "trigger": "trigger"},
)
class KeyVaultCertificateCertificatePolicyLifetimeAction:
    def __init__(
        self,
        *,
        action: typing.List["KeyVaultCertificateCertificatePolicyLifetimeActionAction"],
        trigger: typing.List["KeyVaultCertificateCertificatePolicyLifetimeActionTrigger"],
    ) -> None:
        """
        :param action: action block.
        :param trigger: trigger block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "trigger": trigger,
        }

    @builtins.property
    def action(
        self,
    ) -> typing.List["KeyVaultCertificateCertificatePolicyLifetimeActionAction"]:
        """action block."""
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def trigger(
        self,
    ) -> typing.List["KeyVaultCertificateCertificatePolicyLifetimeActionTrigger"]:
        """trigger block."""
        result = self._values.get("trigger")
        assert result is not None, "Required property 'trigger' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicyLifetimeAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicyLifetimeActionAction",
    jsii_struct_bases=[],
    name_mapping={"action_type": "actionType"},
)
class KeyVaultCertificateCertificatePolicyLifetimeActionAction:
    def __init__(self, *, action_type: builtins.str) -> None:
        """
        :param action_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action_type": action_type,
        }

    @builtins.property
    def action_type(self) -> builtins.str:
        result = self._values.get("action_type")
        assert result is not None, "Required property 'action_type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicyLifetimeActionAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicyLifetimeActionTrigger",
    jsii_struct_bases=[],
    name_mapping={
        "days_before_expiry": "daysBeforeExpiry",
        "lifetime_percentage": "lifetimePercentage",
    },
)
class KeyVaultCertificateCertificatePolicyLifetimeActionTrigger:
    def __init__(
        self,
        *,
        days_before_expiry: typing.Optional[jsii.Number] = None,
        lifetime_percentage: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param days_before_expiry: -
        :param lifetime_percentage: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if days_before_expiry is not None:
            self._values["days_before_expiry"] = days_before_expiry
        if lifetime_percentage is not None:
            self._values["lifetime_percentage"] = lifetime_percentage

    @builtins.property
    def days_before_expiry(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("days_before_expiry")
        return result

    @builtins.property
    def lifetime_percentage(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("lifetime_percentage")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicyLifetimeActionTrigger(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicySecretProperties",
    jsii_struct_bases=[],
    name_mapping={"content_type": "contentType"},
)
class KeyVaultCertificateCertificatePolicySecretProperties:
    def __init__(self, *, content_type: builtins.str) -> None:
        """
        :param content_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "content_type": content_type,
        }

    @builtins.property
    def content_type(self) -> builtins.str:
        result = self._values.get("content_type")
        assert result is not None, "Required property 'content_type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicySecretProperties(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicyX509CertificateProperties",
    jsii_struct_bases=[],
    name_mapping={
        "key_usage": "keyUsage",
        "subject": "subject",
        "validity_in_months": "validityInMonths",
        "extended_key_usage": "extendedKeyUsage",
        "subject_alternative_names": "subjectAlternativeNames",
    },
)
class KeyVaultCertificateCertificatePolicyX509CertificateProperties:
    def __init__(
        self,
        *,
        key_usage: typing.List[builtins.str],
        subject: builtins.str,
        validity_in_months: jsii.Number,
        extended_key_usage: typing.Optional[typing.List[builtins.str]] = None,
        subject_alternative_names: typing.Optional[typing.List["KeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames"]] = None,
    ) -> None:
        """
        :param key_usage: -
        :param subject: -
        :param validity_in_months: -
        :param extended_key_usage: -
        :param subject_alternative_names: subject_alternative_names block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key_usage": key_usage,
            "subject": subject,
            "validity_in_months": validity_in_months,
        }
        if extended_key_usage is not None:
            self._values["extended_key_usage"] = extended_key_usage
        if subject_alternative_names is not None:
            self._values["subject_alternative_names"] = subject_alternative_names

    @builtins.property
    def key_usage(self) -> typing.List[builtins.str]:
        result = self._values.get("key_usage")
        assert result is not None, "Required property 'key_usage' is missing"
        return result

    @builtins.property
    def subject(self) -> builtins.str:
        result = self._values.get("subject")
        assert result is not None, "Required property 'subject' is missing"
        return result

    @builtins.property
    def validity_in_months(self) -> jsii.Number:
        result = self._values.get("validity_in_months")
        assert result is not None, "Required property 'validity_in_months' is missing"
        return result

    @builtins.property
    def extended_key_usage(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("extended_key_usage")
        return result

    @builtins.property
    def subject_alternative_names(
        self,
    ) -> typing.Optional[typing.List["KeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames"]]:
        """subject_alternative_names block."""
        result = self._values.get("subject_alternative_names")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicyX509CertificateProperties(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames",
    jsii_struct_bases=[],
    name_mapping={"dns_names": "dnsNames", "emails": "emails", "upns": "upns"},
)
class KeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames:
    def __init__(
        self,
        *,
        dns_names: typing.Optional[typing.List[builtins.str]] = None,
        emails: typing.Optional[typing.List[builtins.str]] = None,
        upns: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param dns_names: -
        :param emails: -
        :param upns: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if dns_names is not None:
            self._values["dns_names"] = dns_names
        if emails is not None:
            self._values["emails"] = emails
        if upns is not None:
            self._values["upns"] = upns

    @builtins.property
    def dns_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("dns_names")
        return result

    @builtins.property
    def emails(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("emails")
        return result

    @builtins.property
    def upns(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("upns")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "certificate_policy": "certificatePolicy",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "certificate": "certificate",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class KeyVaultCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        certificate_policy: typing.List[KeyVaultCertificateCertificatePolicy],
        key_vault_id: builtins.str,
        name: builtins.str,
        certificate: typing.Optional[typing.List[KeyVaultCertificateCertificate]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param certificate_policy: certificate_policy block.
        :param key_vault_id: -
        :param name: -
        :param certificate: certificate block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KeyVaultCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "certificate_policy": certificate_policy,
            "key_vault_id": key_vault_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if certificate is not None:
            self._values["certificate"] = certificate
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def certificate_policy(self) -> typing.List[KeyVaultCertificateCertificatePolicy]:
        """certificate_policy block."""
        result = self._values.get("certificate_policy")
        assert result is not None, "Required property 'certificate_policy' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def certificate(
        self,
    ) -> typing.Optional[typing.List[KeyVaultCertificateCertificate]]:
        """certificate block."""
        result = self._values.get("certificate")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KeyVaultCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KeyVaultCertificateIssuer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KeyVaultCertificateIssuer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_id: builtins.str,
        name: builtins.str,
        provider_name: builtins.str,
        account_id: typing.Optional[builtins.str] = None,
        admin: typing.Optional[typing.List["KeyVaultCertificateIssuerAdmin"]] = None,
        org_id: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KeyVaultCertificateIssuerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_id: -
        :param name: -
        :param provider_name: -
        :param account_id: -
        :param admin: admin block.
        :param org_id: -
        :param password: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KeyVaultCertificateIssuerConfig(
            key_vault_id=key_vault_id,
            name=name,
            provider_name=provider_name,
            account_id=account_id,
            admin=admin,
            org_id=org_id,
            password=password,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KeyVaultCertificateIssuer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAccountId")
    def reset_account_id(self) -> None:
        return jsii.invoke(self, "resetAccountId", [])

    @jsii.member(jsii_name="resetAdmin")
    def reset_admin(self) -> None:
        return jsii.invoke(self, "resetAdmin", [])

    @jsii.member(jsii_name="resetOrgId")
    def reset_org_id(self) -> None:
        return jsii.invoke(self, "resetOrgId", [])

    @jsii.member(jsii_name="resetPassword")
    def reset_password(self) -> None:
        return jsii.invoke(self, "resetPassword", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="providerNameInput")
    def provider_name_input(self) -> builtins.str:
        return jsii.get(self, "providerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountIdInput")
    def account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "accountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminInput")
    def admin_input(
        self,
    ) -> typing.Optional[typing.List["KeyVaultCertificateIssuerAdmin"]]:
        return jsii.get(self, "adminInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="orgIdInput")
    def org_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "orgIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KeyVaultCertificateIssuerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountId")
    def account_id(self) -> builtins.str:
        return jsii.get(self, "accountId")

    @account_id.setter # type: ignore
    def account_id(self, value: builtins.str) -> None:
        jsii.set(self, "accountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="admin")
    def admin(self) -> typing.List["KeyVaultCertificateIssuerAdmin"]:
        return jsii.get(self, "admin")

    @admin.setter # type: ignore
    def admin(self, value: typing.List["KeyVaultCertificateIssuerAdmin"]) -> None:
        jsii.set(self, "admin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> builtins.str:
        return jsii.get(self, "orgId")

    @org_id.setter # type: ignore
    def org_id(self, value: builtins.str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="providerName")
    def provider_name(self) -> builtins.str:
        return jsii.get(self, "providerName")

    @provider_name.setter # type: ignore
    def provider_name(self, value: builtins.str) -> None:
        jsii.set(self, "providerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KeyVaultCertificateIssuerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KeyVaultCertificateIssuerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateIssuerAdmin",
    jsii_struct_bases=[],
    name_mapping={
        "email_address": "emailAddress",
        "first_name": "firstName",
        "last_name": "lastName",
        "phone": "phone",
    },
)
class KeyVaultCertificateIssuerAdmin:
    def __init__(
        self,
        *,
        email_address: builtins.str,
        first_name: typing.Optional[builtins.str] = None,
        last_name: typing.Optional[builtins.str] = None,
        phone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param email_address: -
        :param first_name: -
        :param last_name: -
        :param phone: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "email_address": email_address,
        }
        if first_name is not None:
            self._values["first_name"] = first_name
        if last_name is not None:
            self._values["last_name"] = last_name
        if phone is not None:
            self._values["phone"] = phone

    @builtins.property
    def email_address(self) -> builtins.str:
        result = self._values.get("email_address")
        assert result is not None, "Required property 'email_address' is missing"
        return result

    @builtins.property
    def first_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("first_name")
        return result

    @builtins.property
    def last_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("last_name")
        return result

    @builtins.property
    def phone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("phone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateIssuerAdmin(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateIssuerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "provider_name": "providerName",
        "account_id": "accountId",
        "admin": "admin",
        "org_id": "orgId",
        "password": "password",
        "timeouts": "timeouts",
    },
)
class KeyVaultCertificateIssuerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_id: builtins.str,
        name: builtins.str,
        provider_name: builtins.str,
        account_id: typing.Optional[builtins.str] = None,
        admin: typing.Optional[typing.List[KeyVaultCertificateIssuerAdmin]] = None,
        org_id: typing.Optional[builtins.str] = None,
        password: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KeyVaultCertificateIssuerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_id: -
        :param name: -
        :param provider_name: -
        :param account_id: -
        :param admin: admin block.
        :param org_id: -
        :param password: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KeyVaultCertificateIssuerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_id": key_vault_id,
            "name": name,
            "provider_name": provider_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if account_id is not None:
            self._values["account_id"] = account_id
        if admin is not None:
            self._values["admin"] = admin
        if org_id is not None:
            self._values["org_id"] = org_id
        if password is not None:
            self._values["password"] = password
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def provider_name(self) -> builtins.str:
        result = self._values.get("provider_name")
        assert result is not None, "Required property 'provider_name' is missing"
        return result

    @builtins.property
    def account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("account_id")
        return result

    @builtins.property
    def admin(self) -> typing.Optional[typing.List[KeyVaultCertificateIssuerAdmin]]:
        """admin block."""
        result = self._values.get("admin")
        return result

    @builtins.property
    def org_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("org_id")
        return result

    @builtins.property
    def password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("password")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KeyVaultCertificateIssuerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateIssuerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateIssuerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KeyVaultCertificateIssuerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateIssuerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class KeyVaultCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "tenant_id": "tenantId",
        "access_policy": "accessPolicy",
        "contact": "contact",
        "enabled_for_deployment": "enabledForDeployment",
        "enabled_for_disk_encryption": "enabledForDiskEncryption",
        "enabled_for_template_deployment": "enabledForTemplateDeployment",
        "enable_rbac_authorization": "enableRbacAuthorization",
        "network_acls": "networkAcls",
        "purge_protection_enabled": "purgeProtectionEnabled",
        "soft_delete_enabled": "softDeleteEnabled",
        "soft_delete_retention_days": "softDeleteRetentionDays",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class KeyVaultConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tenant_id: builtins.str,
        access_policy: typing.Optional[typing.List[KeyVaultAccessPolicy]] = None,
        contact: typing.Optional[typing.List["KeyVaultContact"]] = None,
        enabled_for_deployment: typing.Optional[builtins.bool] = None,
        enabled_for_disk_encryption: typing.Optional[builtins.bool] = None,
        enabled_for_template_deployment: typing.Optional[builtins.bool] = None,
        enable_rbac_authorization: typing.Optional[builtins.bool] = None,
        network_acls: typing.Optional[typing.List["KeyVaultNetworkAcls"]] = None,
        purge_protection_enabled: typing.Optional[builtins.bool] = None,
        soft_delete_enabled: typing.Optional[builtins.bool] = None,
        soft_delete_retention_days: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tenant_id: -
        :param access_policy: -
        :param contact: contact block.
        :param enabled_for_deployment: -
        :param enabled_for_disk_encryption: -
        :param enabled_for_template_deployment: -
        :param enable_rbac_authorization: -
        :param network_acls: network_acls block.
        :param purge_protection_enabled: -
        :param soft_delete_enabled: -
        :param soft_delete_retention_days: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KeyVaultTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if access_policy is not None:
            self._values["access_policy"] = access_policy
        if contact is not None:
            self._values["contact"] = contact
        if enabled_for_deployment is not None:
            self._values["enabled_for_deployment"] = enabled_for_deployment
        if enabled_for_disk_encryption is not None:
            self._values["enabled_for_disk_encryption"] = enabled_for_disk_encryption
        if enabled_for_template_deployment is not None:
            self._values["enabled_for_template_deployment"] = enabled_for_template_deployment
        if enable_rbac_authorization is not None:
            self._values["enable_rbac_authorization"] = enable_rbac_authorization
        if network_acls is not None:
            self._values["network_acls"] = network_acls
        if purge_protection_enabled is not None:
            self._values["purge_protection_enabled"] = purge_protection_enabled
        if soft_delete_enabled is not None:
            self._values["soft_delete_enabled"] = soft_delete_enabled
        if soft_delete_retention_days is not None:
            self._values["soft_delete_retention_days"] = soft_delete_retention_days
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def access_policy(self) -> typing.Optional[typing.List[KeyVaultAccessPolicy]]:
        result = self._values.get("access_policy")
        return result

    @builtins.property
    def contact(self) -> typing.Optional[typing.List["KeyVaultContact"]]:
        """contact block."""
        result = self._values.get("contact")
        return result

    @builtins.property
    def enabled_for_deployment(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled_for_deployment")
        return result

    @builtins.property
    def enabled_for_disk_encryption(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled_for_disk_encryption")
        return result

    @builtins.property
    def enabled_for_template_deployment(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled_for_template_deployment")
        return result

    @builtins.property
    def enable_rbac_authorization(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_rbac_authorization")
        return result

    @builtins.property
    def network_acls(self) -> typing.Optional[typing.List["KeyVaultNetworkAcls"]]:
        """network_acls block."""
        result = self._values.get("network_acls")
        return result

    @builtins.property
    def purge_protection_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("purge_protection_enabled")
        return result

    @builtins.property
    def soft_delete_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("soft_delete_enabled")
        return result

    @builtins.property
    def soft_delete_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("soft_delete_retention_days")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KeyVaultTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultContact",
    jsii_struct_bases=[],
    name_mapping={"email": "email", "name": "name", "phone": "phone"},
)
class KeyVaultContact:
    def __init__(
        self,
        *,
        email: builtins.str,
        name: typing.Optional[builtins.str] = None,
        phone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param email: -
        :param name: -
        :param phone: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "email": email,
        }
        if name is not None:
            self._values["name"] = name
        if phone is not None:
            self._values["phone"] = phone

    @builtins.property
    def email(self) -> builtins.str:
        result = self._values.get("email")
        assert result is not None, "Required property 'email' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def phone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("phone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultContact(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KeyVaultKey(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KeyVaultKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_opts: typing.List[builtins.str],
        key_type: builtins.str,
        key_vault_id: builtins.str,
        name: builtins.str,
        curve: typing.Optional[builtins.str] = None,
        expiration_date: typing.Optional[builtins.str] = None,
        key_size: typing.Optional[jsii.Number] = None,
        not_before_date: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultKeyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_opts: -
        :param key_type: -
        :param key_vault_id: -
        :param name: -
        :param curve: -
        :param expiration_date: -
        :param key_size: -
        :param not_before_date: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KeyVaultKeyConfig(
            key_opts=key_opts,
            key_type=key_type,
            key_vault_id=key_vault_id,
            name=name,
            curve=curve,
            expiration_date=expiration_date,
            key_size=key_size,
            not_before_date=not_before_date,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KeyVaultKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetCurve")
    def reset_curve(self) -> None:
        return jsii.invoke(self, "resetCurve", [])

    @jsii.member(jsii_name="resetExpirationDate")
    def reset_expiration_date(self) -> None:
        return jsii.invoke(self, "resetExpirationDate", [])

    @jsii.member(jsii_name="resetKeySize")
    def reset_key_size(self) -> None:
        return jsii.invoke(self, "resetKeySize", [])

    @jsii.member(jsii_name="resetNotBeforeDate")
    def reset_not_before_date(self) -> None:
        return jsii.invoke(self, "resetNotBeforeDate", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="e")
    def e(self) -> builtins.str:
        return jsii.get(self, "e")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyOptsInput")
    def key_opts_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keyOptsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyTypeInput")
    def key_type_input(self) -> builtins.str:
        return jsii.get(self, "keyTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="n")
    def n(self) -> builtins.str:
        return jsii.get(self, "n")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="x")
    def x(self) -> builtins.str:
        return jsii.get(self, "x")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="y")
    def y(self) -> builtins.str:
        return jsii.get(self, "y")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="curveInput")
    def curve_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "curveInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationDateInput")
    def expiration_date_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "expirationDateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keySizeInput")
    def key_size_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "keySizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notBeforeDateInput")
    def not_before_date_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "notBeforeDateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KeyVaultKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="curve")
    def curve(self) -> builtins.str:
        return jsii.get(self, "curve")

    @curve.setter # type: ignore
    def curve(self, value: builtins.str) -> None:
        jsii.set(self, "curve", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationDate")
    def expiration_date(self) -> builtins.str:
        return jsii.get(self, "expirationDate")

    @expiration_date.setter # type: ignore
    def expiration_date(self, value: builtins.str) -> None:
        jsii.set(self, "expirationDate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyOpts")
    def key_opts(self) -> typing.List[builtins.str]:
        return jsii.get(self, "keyOpts")

    @key_opts.setter # type: ignore
    def key_opts(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "keyOpts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keySize")
    def key_size(self) -> jsii.Number:
        return jsii.get(self, "keySize")

    @key_size.setter # type: ignore
    def key_size(self, value: jsii.Number) -> None:
        jsii.set(self, "keySize", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyType")
    def key_type(self) -> builtins.str:
        return jsii.get(self, "keyType")

    @key_type.setter # type: ignore
    def key_type(self, value: builtins.str) -> None:
        jsii.set(self, "keyType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notBeforeDate")
    def not_before_date(self) -> builtins.str:
        return jsii.get(self, "notBeforeDate")

    @not_before_date.setter # type: ignore
    def not_before_date(self, value: builtins.str) -> None:
        jsii.set(self, "notBeforeDate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KeyVaultKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KeyVaultKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KeyVaultKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_opts": "keyOpts",
        "key_type": "keyType",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "curve": "curve",
        "expiration_date": "expirationDate",
        "key_size": "keySize",
        "not_before_date": "notBeforeDate",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class KeyVaultKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_opts: typing.List[builtins.str],
        key_type: builtins.str,
        key_vault_id: builtins.str,
        name: builtins.str,
        curve: typing.Optional[builtins.str] = None,
        expiration_date: typing.Optional[builtins.str] = None,
        key_size: typing.Optional[jsii.Number] = None,
        not_before_date: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultKeyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_opts: -
        :param key_type: -
        :param key_vault_id: -
        :param name: -
        :param curve: -
        :param expiration_date: -
        :param key_size: -
        :param not_before_date: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KeyVaultKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_opts": key_opts,
            "key_type": key_type,
            "key_vault_id": key_vault_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if curve is not None:
            self._values["curve"] = curve
        if expiration_date is not None:
            self._values["expiration_date"] = expiration_date
        if key_size is not None:
            self._values["key_size"] = key_size
        if not_before_date is not None:
            self._values["not_before_date"] = not_before_date
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_opts(self) -> typing.List[builtins.str]:
        result = self._values.get("key_opts")
        assert result is not None, "Required property 'key_opts' is missing"
        return result

    @builtins.property
    def key_type(self) -> builtins.str:
        result = self._values.get("key_type")
        assert result is not None, "Required property 'key_type' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def curve(self) -> typing.Optional[builtins.str]:
        result = self._values.get("curve")
        return result

    @builtins.property
    def expiration_date(self) -> typing.Optional[builtins.str]:
        result = self._values.get("expiration_date")
        return result

    @builtins.property
    def key_size(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("key_size")
        return result

    @builtins.property
    def not_before_date(self) -> typing.Optional[builtins.str]:
        result = self._values.get("not_before_date")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KeyVaultKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KeyVaultKeyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultNetworkAcls",
    jsii_struct_bases=[],
    name_mapping={
        "bypass": "bypass",
        "default_action": "defaultAction",
        "ip_rules": "ipRules",
        "virtual_network_subnet_ids": "virtualNetworkSubnetIds",
    },
)
class KeyVaultNetworkAcls:
    def __init__(
        self,
        *,
        bypass: builtins.str,
        default_action: builtins.str,
        ip_rules: typing.Optional[typing.List[builtins.str]] = None,
        virtual_network_subnet_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param bypass: -
        :param default_action: -
        :param ip_rules: -
        :param virtual_network_subnet_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "bypass": bypass,
            "default_action": default_action,
        }
        if ip_rules is not None:
            self._values["ip_rules"] = ip_rules
        if virtual_network_subnet_ids is not None:
            self._values["virtual_network_subnet_ids"] = virtual_network_subnet_ids

    @builtins.property
    def bypass(self) -> builtins.str:
        result = self._values.get("bypass")
        assert result is not None, "Required property 'bypass' is missing"
        return result

    @builtins.property
    def default_action(self) -> builtins.str:
        result = self._values.get("default_action")
        assert result is not None, "Required property 'default_action' is missing"
        return result

    @builtins.property
    def ip_rules(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ip_rules")
        return result

    @builtins.property
    def virtual_network_subnet_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("virtual_network_subnet_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultNetworkAcls(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KeyVaultSecret(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KeyVaultSecret",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_id: builtins.str,
        name: builtins.str,
        value: builtins.str,
        content_type: typing.Optional[builtins.str] = None,
        expiration_date: typing.Optional[builtins.str] = None,
        not_before_date: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultSecretTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_id: -
        :param name: -
        :param value: -
        :param content_type: -
        :param expiration_date: -
        :param not_before_date: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KeyVaultSecretConfig(
            key_vault_id=key_vault_id,
            name=name,
            value=value,
            content_type=content_type,
            expiration_date=expiration_date,
            not_before_date=not_before_date,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KeyVaultSecret, self, [scope, id, config])

    @jsii.member(jsii_name="resetContentType")
    def reset_content_type(self) -> None:
        return jsii.invoke(self, "resetContentType", [])

    @jsii.member(jsii_name="resetExpirationDate")
    def reset_expiration_date(self) -> None:
        return jsii.invoke(self, "resetExpirationDate", [])

    @jsii.member(jsii_name="resetNotBeforeDate")
    def reset_not_before_date(self) -> None:
        return jsii.invoke(self, "resetNotBeforeDate", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypeInput")
    def content_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationDateInput")
    def expiration_date_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "expirationDateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notBeforeDateInput")
    def not_before_date_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "notBeforeDateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KeyVaultSecretTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")

    @content_type.setter # type: ignore
    def content_type(self, value: builtins.str) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expirationDate")
    def expiration_date(self) -> builtins.str:
        return jsii.get(self, "expirationDate")

    @expiration_date.setter # type: ignore
    def expiration_date(self, value: builtins.str) -> None:
        jsii.set(self, "expirationDate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notBeforeDate")
    def not_before_date(self) -> builtins.str:
        return jsii.get(self, "notBeforeDate")

    @not_before_date.setter # type: ignore
    def not_before_date(self, value: builtins.str) -> None:
        jsii.set(self, "notBeforeDate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KeyVaultSecretTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KeyVaultSecretTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.KeyVaultSecretConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_id": "keyVaultId",
        "name": "name",
        "value": "value",
        "content_type": "contentType",
        "expiration_date": "expirationDate",
        "not_before_date": "notBeforeDate",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class KeyVaultSecretConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_id: builtins.str,
        name: builtins.str,
        value: builtins.str,
        content_type: typing.Optional[builtins.str] = None,
        expiration_date: typing.Optional[builtins.str] = None,
        not_before_date: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KeyVaultSecretTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_id: -
        :param name: -
        :param value: -
        :param content_type: -
        :param expiration_date: -
        :param not_before_date: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KeyVaultSecretTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_id": key_vault_id,
            "name": name,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if content_type is not None:
            self._values["content_type"] = content_type
        if expiration_date is not None:
            self._values["expiration_date"] = expiration_date
        if not_before_date is not None:
            self._values["not_before_date"] = not_before_date
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def content_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_type")
        return result

    @builtins.property
    def expiration_date(self) -> typing.Optional[builtins.str]:
        result = self._values.get("expiration_date")
        return result

    @builtins.property
    def not_before_date(self) -> typing.Optional[builtins.str]:
        result = self._values.get("not_before_date")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KeyVaultSecretTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultSecretConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultSecretTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KeyVaultSecretTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultSecretTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KeyVaultTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KeyVaultTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KeyVaultTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KubernetesCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KubernetesCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        default_node_pool: typing.List["KubernetesClusterDefaultNodePool"],
        dns_prefix: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        addon_profile: typing.Optional[typing.List["KubernetesClusterAddonProfile"]] = None,
        api_server_authorized_ip_ranges: typing.Optional[typing.List[builtins.str]] = None,
        auto_scaler_profile: typing.Optional[typing.List["KubernetesClusterAutoScalerProfile"]] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        enable_pod_security_policy: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["KubernetesClusterIdentity"]] = None,
        kubernetes_version: typing.Optional[builtins.str] = None,
        linux_profile: typing.Optional[typing.List["KubernetesClusterLinuxProfile"]] = None,
        network_profile: typing.Optional[typing.List["KubernetesClusterNetworkProfile"]] = None,
        node_resource_group: typing.Optional[builtins.str] = None,
        private_cluster_enabled: typing.Optional[builtins.bool] = None,
        private_link_enabled: typing.Optional[builtins.bool] = None,
        role_based_access_control: typing.Optional[typing.List["KubernetesClusterRoleBasedAccessControl"]] = None,
        service_principal: typing.Optional[typing.List["KubernetesClusterServicePrincipal"]] = None,
        sku_tier: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KubernetesClusterTimeouts"] = None,
        windows_profile: typing.Optional[typing.List["KubernetesClusterWindowsProfile"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param default_node_pool: default_node_pool block.
        :param dns_prefix: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param addon_profile: addon_profile block.
        :param api_server_authorized_ip_ranges: -
        :param auto_scaler_profile: auto_scaler_profile block.
        :param disk_encryption_set_id: -
        :param enable_pod_security_policy: -
        :param identity: identity block.
        :param kubernetes_version: -
        :param linux_profile: linux_profile block.
        :param network_profile: network_profile block.
        :param node_resource_group: -
        :param private_cluster_enabled: -
        :param private_link_enabled: -
        :param role_based_access_control: role_based_access_control block.
        :param service_principal: service_principal block.
        :param sku_tier: -
        :param tags: -
        :param timeouts: timeouts block.
        :param windows_profile: windows_profile block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KubernetesClusterConfig(
            default_node_pool=default_node_pool,
            dns_prefix=dns_prefix,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            addon_profile=addon_profile,
            api_server_authorized_ip_ranges=api_server_authorized_ip_ranges,
            auto_scaler_profile=auto_scaler_profile,
            disk_encryption_set_id=disk_encryption_set_id,
            enable_pod_security_policy=enable_pod_security_policy,
            identity=identity,
            kubernetes_version=kubernetes_version,
            linux_profile=linux_profile,
            network_profile=network_profile,
            node_resource_group=node_resource_group,
            private_cluster_enabled=private_cluster_enabled,
            private_link_enabled=private_link_enabled,
            role_based_access_control=role_based_access_control,
            service_principal=service_principal,
            sku_tier=sku_tier,
            tags=tags,
            timeouts=timeouts,
            windows_profile=windows_profile,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KubernetesCluster, self, [scope, id, config])

    @jsii.member(jsii_name="kubeAdminConfig")
    def kube_admin_config(
        self,
        index: builtins.str,
    ) -> "KubernetesClusterKubeAdminConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "kubeAdminConfig", [index])

    @jsii.member(jsii_name="kubeConfig")
    def kube_config(self, index: builtins.str) -> "KubernetesClusterKubeConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "kubeConfig", [index])

    @jsii.member(jsii_name="kubeletIdentity")
    def kubelet_identity(
        self,
        index: builtins.str,
    ) -> "KubernetesClusterKubeletIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "kubeletIdentity", [index])

    @jsii.member(jsii_name="resetAddonProfile")
    def reset_addon_profile(self) -> None:
        return jsii.invoke(self, "resetAddonProfile", [])

    @jsii.member(jsii_name="resetApiServerAuthorizedIpRanges")
    def reset_api_server_authorized_ip_ranges(self) -> None:
        return jsii.invoke(self, "resetApiServerAuthorizedIpRanges", [])

    @jsii.member(jsii_name="resetAutoScalerProfile")
    def reset_auto_scaler_profile(self) -> None:
        return jsii.invoke(self, "resetAutoScalerProfile", [])

    @jsii.member(jsii_name="resetDiskEncryptionSetId")
    def reset_disk_encryption_set_id(self) -> None:
        return jsii.invoke(self, "resetDiskEncryptionSetId", [])

    @jsii.member(jsii_name="resetEnablePodSecurityPolicy")
    def reset_enable_pod_security_policy(self) -> None:
        return jsii.invoke(self, "resetEnablePodSecurityPolicy", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetKubernetesVersion")
    def reset_kubernetes_version(self) -> None:
        return jsii.invoke(self, "resetKubernetesVersion", [])

    @jsii.member(jsii_name="resetLinuxProfile")
    def reset_linux_profile(self) -> None:
        return jsii.invoke(self, "resetLinuxProfile", [])

    @jsii.member(jsii_name="resetNetworkProfile")
    def reset_network_profile(self) -> None:
        return jsii.invoke(self, "resetNetworkProfile", [])

    @jsii.member(jsii_name="resetNodeResourceGroup")
    def reset_node_resource_group(self) -> None:
        return jsii.invoke(self, "resetNodeResourceGroup", [])

    @jsii.member(jsii_name="resetPrivateClusterEnabled")
    def reset_private_cluster_enabled(self) -> None:
        return jsii.invoke(self, "resetPrivateClusterEnabled", [])

    @jsii.member(jsii_name="resetPrivateLinkEnabled")
    def reset_private_link_enabled(self) -> None:
        return jsii.invoke(self, "resetPrivateLinkEnabled", [])

    @jsii.member(jsii_name="resetRoleBasedAccessControl")
    def reset_role_based_access_control(self) -> None:
        return jsii.invoke(self, "resetRoleBasedAccessControl", [])

    @jsii.member(jsii_name="resetServicePrincipal")
    def reset_service_principal(self) -> None:
        return jsii.invoke(self, "resetServicePrincipal", [])

    @jsii.member(jsii_name="resetSkuTier")
    def reset_sku_tier(self) -> None:
        return jsii.invoke(self, "resetSkuTier", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWindowsProfile")
    def reset_windows_profile(self) -> None:
        return jsii.invoke(self, "resetWindowsProfile", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultNodePoolInput")
    def default_node_pool_input(
        self,
    ) -> typing.List["KubernetesClusterDefaultNodePool"]:
        return jsii.get(self, "defaultNodePoolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsPrefixInput")
    def dns_prefix_input(self) -> builtins.str:
        return jsii.get(self, "dnsPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubeAdminConfigRaw")
    def kube_admin_config_raw(self) -> builtins.str:
        return jsii.get(self, "kubeAdminConfigRaw")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubeConfigRaw")
    def kube_config_raw(self) -> builtins.str:
        return jsii.get(self, "kubeConfigRaw")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateFqdn")
    def private_fqdn(self) -> builtins.str:
        return jsii.get(self, "privateFqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addonProfileInput")
    def addon_profile_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterAddonProfile"]]:
        return jsii.get(self, "addonProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiServerAuthorizedIpRangesInput")
    def api_server_authorized_ip_ranges_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "apiServerAuthorizedIpRangesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoScalerProfileInput")
    def auto_scaler_profile_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterAutoScalerProfile"]]:
        return jsii.get(self, "autoScalerProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskEncryptionSetIdInput")
    def disk_encryption_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "diskEncryptionSetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePodSecurityPolicyInput")
    def enable_pod_security_policy_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enablePodSecurityPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubernetesVersionInput")
    def kubernetes_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "kubernetesVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linuxProfileInput")
    def linux_profile_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterLinuxProfile"]]:
        return jsii.get(self, "linuxProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfileInput")
    def network_profile_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterNetworkProfile"]]:
        return jsii.get(self, "networkProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeResourceGroupInput")
    def node_resource_group_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nodeResourceGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateClusterEnabledInput")
    def private_cluster_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "privateClusterEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateLinkEnabledInput")
    def private_link_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "privateLinkEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleBasedAccessControlInput")
    def role_based_access_control_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterRoleBasedAccessControl"]]:
        return jsii.get(self, "roleBasedAccessControlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicePrincipalInput")
    def service_principal_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterServicePrincipal"]]:
        return jsii.get(self, "servicePrincipalInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuTierInput")
    def sku_tier_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuTierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KubernetesClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="windowsProfileInput")
    def windows_profile_input(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterWindowsProfile"]]:
        return jsii.get(self, "windowsProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addonProfile")
    def addon_profile(self) -> typing.List["KubernetesClusterAddonProfile"]:
        return jsii.get(self, "addonProfile")

    @addon_profile.setter # type: ignore
    def addon_profile(
        self,
        value: typing.List["KubernetesClusterAddonProfile"],
    ) -> None:
        jsii.set(self, "addonProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apiServerAuthorizedIpRanges")
    def api_server_authorized_ip_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "apiServerAuthorizedIpRanges")

    @api_server_authorized_ip_ranges.setter # type: ignore
    def api_server_authorized_ip_ranges(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "apiServerAuthorizedIpRanges", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoScalerProfile")
    def auto_scaler_profile(self) -> typing.List["KubernetesClusterAutoScalerProfile"]:
        return jsii.get(self, "autoScalerProfile")

    @auto_scaler_profile.setter # type: ignore
    def auto_scaler_profile(
        self,
        value: typing.List["KubernetesClusterAutoScalerProfile"],
    ) -> None:
        jsii.set(self, "autoScalerProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultNodePool")
    def default_node_pool(self) -> typing.List["KubernetesClusterDefaultNodePool"]:
        return jsii.get(self, "defaultNodePool")

    @default_node_pool.setter # type: ignore
    def default_node_pool(
        self,
        value: typing.List["KubernetesClusterDefaultNodePool"],
    ) -> None:
        jsii.set(self, "defaultNodePool", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskEncryptionSetId")
    def disk_encryption_set_id(self) -> builtins.str:
        return jsii.get(self, "diskEncryptionSetId")

    @disk_encryption_set_id.setter # type: ignore
    def disk_encryption_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "diskEncryptionSetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsPrefix")
    def dns_prefix(self) -> builtins.str:
        return jsii.get(self, "dnsPrefix")

    @dns_prefix.setter # type: ignore
    def dns_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "dnsPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePodSecurityPolicy")
    def enable_pod_security_policy(self) -> builtins.bool:
        return jsii.get(self, "enablePodSecurityPolicy")

    @enable_pod_security_policy.setter # type: ignore
    def enable_pod_security_policy(self, value: builtins.bool) -> None:
        jsii.set(self, "enablePodSecurityPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["KubernetesClusterIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["KubernetesClusterIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubernetesVersion")
    def kubernetes_version(self) -> builtins.str:
        return jsii.get(self, "kubernetesVersion")

    @kubernetes_version.setter # type: ignore
    def kubernetes_version(self, value: builtins.str) -> None:
        jsii.set(self, "kubernetesVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linuxProfile")
    def linux_profile(self) -> typing.List["KubernetesClusterLinuxProfile"]:
        return jsii.get(self, "linuxProfile")

    @linux_profile.setter # type: ignore
    def linux_profile(
        self,
        value: typing.List["KubernetesClusterLinuxProfile"],
    ) -> None:
        jsii.set(self, "linuxProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfile")
    def network_profile(self) -> typing.List["KubernetesClusterNetworkProfile"]:
        return jsii.get(self, "networkProfile")

    @network_profile.setter # type: ignore
    def network_profile(
        self,
        value: typing.List["KubernetesClusterNetworkProfile"],
    ) -> None:
        jsii.set(self, "networkProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeResourceGroup")
    def node_resource_group(self) -> builtins.str:
        return jsii.get(self, "nodeResourceGroup")

    @node_resource_group.setter # type: ignore
    def node_resource_group(self, value: builtins.str) -> None:
        jsii.set(self, "nodeResourceGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateClusterEnabled")
    def private_cluster_enabled(self) -> builtins.bool:
        return jsii.get(self, "privateClusterEnabled")

    @private_cluster_enabled.setter # type: ignore
    def private_cluster_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "privateClusterEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateLinkEnabled")
    def private_link_enabled(self) -> builtins.bool:
        return jsii.get(self, "privateLinkEnabled")

    @private_link_enabled.setter # type: ignore
    def private_link_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "privateLinkEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleBasedAccessControl")
    def role_based_access_control(
        self,
    ) -> typing.List["KubernetesClusterRoleBasedAccessControl"]:
        return jsii.get(self, "roleBasedAccessControl")

    @role_based_access_control.setter # type: ignore
    def role_based_access_control(
        self,
        value: typing.List["KubernetesClusterRoleBasedAccessControl"],
    ) -> None:
        jsii.set(self, "roleBasedAccessControl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicePrincipal")
    def service_principal(self) -> typing.List["KubernetesClusterServicePrincipal"]:
        return jsii.get(self, "servicePrincipal")

    @service_principal.setter # type: ignore
    def service_principal(
        self,
        value: typing.List["KubernetesClusterServicePrincipal"],
    ) -> None:
        jsii.set(self, "servicePrincipal", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuTier")
    def sku_tier(self) -> builtins.str:
        return jsii.get(self, "skuTier")

    @sku_tier.setter # type: ignore
    def sku_tier(self, value: builtins.str) -> None:
        jsii.set(self, "skuTier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KubernetesClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KubernetesClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="windowsProfile")
    def windows_profile(self) -> typing.List["KubernetesClusterWindowsProfile"]:
        return jsii.get(self, "windowsProfile")

    @windows_profile.setter # type: ignore
    def windows_profile(
        self,
        value: typing.List["KubernetesClusterWindowsProfile"],
    ) -> None:
        jsii.set(self, "windowsProfile", value)


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterAddonProfile",
    jsii_struct_bases=[],
    name_mapping={
        "aci_connector_linux": "aciConnectorLinux",
        "azure_policy": "azurePolicy",
        "http_application_routing": "httpApplicationRouting",
        "kube_dashboard": "kubeDashboard",
        "oms_agent": "omsAgent",
    },
)
class KubernetesClusterAddonProfile:
    def __init__(
        self,
        *,
        aci_connector_linux: typing.Optional[typing.List["KubernetesClusterAddonProfileAciConnectorLinux"]] = None,
        azure_policy: typing.Optional[typing.List["KubernetesClusterAddonProfileAzurePolicy"]] = None,
        http_application_routing: typing.Optional[typing.List["KubernetesClusterAddonProfileHttpApplicationRouting"]] = None,
        kube_dashboard: typing.Optional[typing.List["KubernetesClusterAddonProfileKubeDashboard"]] = None,
        oms_agent: typing.Optional[typing.List["KubernetesClusterAddonProfileOmsAgent"]] = None,
    ) -> None:
        """
        :param aci_connector_linux: aci_connector_linux block.
        :param azure_policy: azure_policy block.
        :param http_application_routing: http_application_routing block.
        :param kube_dashboard: kube_dashboard block.
        :param oms_agent: oms_agent block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if aci_connector_linux is not None:
            self._values["aci_connector_linux"] = aci_connector_linux
        if azure_policy is not None:
            self._values["azure_policy"] = azure_policy
        if http_application_routing is not None:
            self._values["http_application_routing"] = http_application_routing
        if kube_dashboard is not None:
            self._values["kube_dashboard"] = kube_dashboard
        if oms_agent is not None:
            self._values["oms_agent"] = oms_agent

    @builtins.property
    def aci_connector_linux(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterAddonProfileAciConnectorLinux"]]:
        """aci_connector_linux block."""
        result = self._values.get("aci_connector_linux")
        return result

    @builtins.property
    def azure_policy(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterAddonProfileAzurePolicy"]]:
        """azure_policy block."""
        result = self._values.get("azure_policy")
        return result

    @builtins.property
    def http_application_routing(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterAddonProfileHttpApplicationRouting"]]:
        """http_application_routing block."""
        result = self._values.get("http_application_routing")
        return result

    @builtins.property
    def kube_dashboard(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterAddonProfileKubeDashboard"]]:
        """kube_dashboard block."""
        result = self._values.get("kube_dashboard")
        return result

    @builtins.property
    def oms_agent(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterAddonProfileOmsAgent"]]:
        """oms_agent block."""
        result = self._values.get("oms_agent")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterAddonProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterAddonProfileAciConnectorLinux",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "subnet_name": "subnetName"},
)
class KubernetesClusterAddonProfileAciConnectorLinux:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        subnet_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param subnet_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if subnet_name is not None:
            self._values["subnet_name"] = subnet_name

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def subnet_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterAddonProfileAciConnectorLinux(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterAddonProfileAzurePolicy",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled"},
)
class KubernetesClusterAddonProfileAzurePolicy:
    def __init__(self, *, enabled: builtins.bool) -> None:
        """
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterAddonProfileAzurePolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterAddonProfileHttpApplicationRouting",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled"},
)
class KubernetesClusterAddonProfileHttpApplicationRouting:
    def __init__(self, *, enabled: builtins.bool) -> None:
        """
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterAddonProfileHttpApplicationRouting(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterAddonProfileKubeDashboard",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled"},
)
class KubernetesClusterAddonProfileKubeDashboard:
    def __init__(self, *, enabled: builtins.bool) -> None:
        """
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterAddonProfileKubeDashboard(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterAddonProfileOmsAgent",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
    },
)
class KubernetesClusterAddonProfileOmsAgent:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        log_analytics_workspace_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param log_analytics_workspace_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if log_analytics_workspace_id is not None:
            self._values["log_analytics_workspace_id"] = log_analytics_workspace_id

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def log_analytics_workspace_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("log_analytics_workspace_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterAddonProfileOmsAgent(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterAutoScalerProfile",
    jsii_struct_bases=[],
    name_mapping={
        "balance_similar_node_groups": "balanceSimilarNodeGroups",
        "max_graceful_termination_sec": "maxGracefulTerminationSec",
        "scale_down_delay_after_add": "scaleDownDelayAfterAdd",
        "scale_down_delay_after_delete": "scaleDownDelayAfterDelete",
        "scale_down_delay_after_failure": "scaleDownDelayAfterFailure",
        "scale_down_unneeded": "scaleDownUnneeded",
        "scale_down_unready": "scaleDownUnready",
        "scale_down_utilization_threshold": "scaleDownUtilizationThreshold",
        "scan_interval": "scanInterval",
    },
)
class KubernetesClusterAutoScalerProfile:
    def __init__(
        self,
        *,
        balance_similar_node_groups: typing.Optional[builtins.bool] = None,
        max_graceful_termination_sec: typing.Optional[builtins.str] = None,
        scale_down_delay_after_add: typing.Optional[builtins.str] = None,
        scale_down_delay_after_delete: typing.Optional[builtins.str] = None,
        scale_down_delay_after_failure: typing.Optional[builtins.str] = None,
        scale_down_unneeded: typing.Optional[builtins.str] = None,
        scale_down_unready: typing.Optional[builtins.str] = None,
        scale_down_utilization_threshold: typing.Optional[builtins.str] = None,
        scan_interval: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param balance_similar_node_groups: -
        :param max_graceful_termination_sec: -
        :param scale_down_delay_after_add: -
        :param scale_down_delay_after_delete: -
        :param scale_down_delay_after_failure: -
        :param scale_down_unneeded: -
        :param scale_down_unready: -
        :param scale_down_utilization_threshold: -
        :param scan_interval: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if balance_similar_node_groups is not None:
            self._values["balance_similar_node_groups"] = balance_similar_node_groups
        if max_graceful_termination_sec is not None:
            self._values["max_graceful_termination_sec"] = max_graceful_termination_sec
        if scale_down_delay_after_add is not None:
            self._values["scale_down_delay_after_add"] = scale_down_delay_after_add
        if scale_down_delay_after_delete is not None:
            self._values["scale_down_delay_after_delete"] = scale_down_delay_after_delete
        if scale_down_delay_after_failure is not None:
            self._values["scale_down_delay_after_failure"] = scale_down_delay_after_failure
        if scale_down_unneeded is not None:
            self._values["scale_down_unneeded"] = scale_down_unneeded
        if scale_down_unready is not None:
            self._values["scale_down_unready"] = scale_down_unready
        if scale_down_utilization_threshold is not None:
            self._values["scale_down_utilization_threshold"] = scale_down_utilization_threshold
        if scan_interval is not None:
            self._values["scan_interval"] = scan_interval

    @builtins.property
    def balance_similar_node_groups(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("balance_similar_node_groups")
        return result

    @builtins.property
    def max_graceful_termination_sec(self) -> typing.Optional[builtins.str]:
        result = self._values.get("max_graceful_termination_sec")
        return result

    @builtins.property
    def scale_down_delay_after_add(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_down_delay_after_add")
        return result

    @builtins.property
    def scale_down_delay_after_delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_down_delay_after_delete")
        return result

    @builtins.property
    def scale_down_delay_after_failure(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_down_delay_after_failure")
        return result

    @builtins.property
    def scale_down_unneeded(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_down_unneeded")
        return result

    @builtins.property
    def scale_down_unready(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_down_unready")
        return result

    @builtins.property
    def scale_down_utilization_threshold(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_down_utilization_threshold")
        return result

    @builtins.property
    def scan_interval(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scan_interval")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterAutoScalerProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "default_node_pool": "defaultNodePool",
        "dns_prefix": "dnsPrefix",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "addon_profile": "addonProfile",
        "api_server_authorized_ip_ranges": "apiServerAuthorizedIpRanges",
        "auto_scaler_profile": "autoScalerProfile",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "enable_pod_security_policy": "enablePodSecurityPolicy",
        "identity": "identity",
        "kubernetes_version": "kubernetesVersion",
        "linux_profile": "linuxProfile",
        "network_profile": "networkProfile",
        "node_resource_group": "nodeResourceGroup",
        "private_cluster_enabled": "privateClusterEnabled",
        "private_link_enabled": "privateLinkEnabled",
        "role_based_access_control": "roleBasedAccessControl",
        "service_principal": "servicePrincipal",
        "sku_tier": "skuTier",
        "tags": "tags",
        "timeouts": "timeouts",
        "windows_profile": "windowsProfile",
    },
)
class KubernetesClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        default_node_pool: typing.List["KubernetesClusterDefaultNodePool"],
        dns_prefix: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        addon_profile: typing.Optional[typing.List[KubernetesClusterAddonProfile]] = None,
        api_server_authorized_ip_ranges: typing.Optional[typing.List[builtins.str]] = None,
        auto_scaler_profile: typing.Optional[typing.List[KubernetesClusterAutoScalerProfile]] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        enable_pod_security_policy: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["KubernetesClusterIdentity"]] = None,
        kubernetes_version: typing.Optional[builtins.str] = None,
        linux_profile: typing.Optional[typing.List["KubernetesClusterLinuxProfile"]] = None,
        network_profile: typing.Optional[typing.List["KubernetesClusterNetworkProfile"]] = None,
        node_resource_group: typing.Optional[builtins.str] = None,
        private_cluster_enabled: typing.Optional[builtins.bool] = None,
        private_link_enabled: typing.Optional[builtins.bool] = None,
        role_based_access_control: typing.Optional[typing.List["KubernetesClusterRoleBasedAccessControl"]] = None,
        service_principal: typing.Optional[typing.List["KubernetesClusterServicePrincipal"]] = None,
        sku_tier: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KubernetesClusterTimeouts"] = None,
        windows_profile: typing.Optional[typing.List["KubernetesClusterWindowsProfile"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param default_node_pool: default_node_pool block.
        :param dns_prefix: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param addon_profile: addon_profile block.
        :param api_server_authorized_ip_ranges: -
        :param auto_scaler_profile: auto_scaler_profile block.
        :param disk_encryption_set_id: -
        :param enable_pod_security_policy: -
        :param identity: identity block.
        :param kubernetes_version: -
        :param linux_profile: linux_profile block.
        :param network_profile: network_profile block.
        :param node_resource_group: -
        :param private_cluster_enabled: -
        :param private_link_enabled: -
        :param role_based_access_control: role_based_access_control block.
        :param service_principal: service_principal block.
        :param sku_tier: -
        :param tags: -
        :param timeouts: timeouts block.
        :param windows_profile: windows_profile block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KubernetesClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "default_node_pool": default_node_pool,
            "dns_prefix": dns_prefix,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if addon_profile is not None:
            self._values["addon_profile"] = addon_profile
        if api_server_authorized_ip_ranges is not None:
            self._values["api_server_authorized_ip_ranges"] = api_server_authorized_ip_ranges
        if auto_scaler_profile is not None:
            self._values["auto_scaler_profile"] = auto_scaler_profile
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if enable_pod_security_policy is not None:
            self._values["enable_pod_security_policy"] = enable_pod_security_policy
        if identity is not None:
            self._values["identity"] = identity
        if kubernetes_version is not None:
            self._values["kubernetes_version"] = kubernetes_version
        if linux_profile is not None:
            self._values["linux_profile"] = linux_profile
        if network_profile is not None:
            self._values["network_profile"] = network_profile
        if node_resource_group is not None:
            self._values["node_resource_group"] = node_resource_group
        if private_cluster_enabled is not None:
            self._values["private_cluster_enabled"] = private_cluster_enabled
        if private_link_enabled is not None:
            self._values["private_link_enabled"] = private_link_enabled
        if role_based_access_control is not None:
            self._values["role_based_access_control"] = role_based_access_control
        if service_principal is not None:
            self._values["service_principal"] = service_principal
        if sku_tier is not None:
            self._values["sku_tier"] = sku_tier
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if windows_profile is not None:
            self._values["windows_profile"] = windows_profile

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def default_node_pool(self) -> typing.List["KubernetesClusterDefaultNodePool"]:
        """default_node_pool block."""
        result = self._values.get("default_node_pool")
        assert result is not None, "Required property 'default_node_pool' is missing"
        return result

    @builtins.property
    def dns_prefix(self) -> builtins.str:
        result = self._values.get("dns_prefix")
        assert result is not None, "Required property 'dns_prefix' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def addon_profile(
        self,
    ) -> typing.Optional[typing.List[KubernetesClusterAddonProfile]]:
        """addon_profile block."""
        result = self._values.get("addon_profile")
        return result

    @builtins.property
    def api_server_authorized_ip_ranges(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("api_server_authorized_ip_ranges")
        return result

    @builtins.property
    def auto_scaler_profile(
        self,
    ) -> typing.Optional[typing.List[KubernetesClusterAutoScalerProfile]]:
        """auto_scaler_profile block."""
        result = self._values.get("auto_scaler_profile")
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def enable_pod_security_policy(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_pod_security_policy")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["KubernetesClusterIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def kubernetes_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("kubernetes_version")
        return result

    @builtins.property
    def linux_profile(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterLinuxProfile"]]:
        """linux_profile block."""
        result = self._values.get("linux_profile")
        return result

    @builtins.property
    def network_profile(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterNetworkProfile"]]:
        """network_profile block."""
        result = self._values.get("network_profile")
        return result

    @builtins.property
    def node_resource_group(self) -> typing.Optional[builtins.str]:
        result = self._values.get("node_resource_group")
        return result

    @builtins.property
    def private_cluster_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("private_cluster_enabled")
        return result

    @builtins.property
    def private_link_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("private_link_enabled")
        return result

    @builtins.property
    def role_based_access_control(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterRoleBasedAccessControl"]]:
        """role_based_access_control block."""
        result = self._values.get("role_based_access_control")
        return result

    @builtins.property
    def service_principal(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterServicePrincipal"]]:
        """service_principal block."""
        result = self._values.get("service_principal")
        return result

    @builtins.property
    def sku_tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_tier")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KubernetesClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def windows_profile(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterWindowsProfile"]]:
        """windows_profile block."""
        result = self._values.get("windows_profile")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterDefaultNodePool",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "vm_size": "vmSize",
        "availability_zones": "availabilityZones",
        "enable_auto_scaling": "enableAutoScaling",
        "enable_node_public_ip": "enableNodePublicIp",
        "max_count": "maxCount",
        "max_pods": "maxPods",
        "min_count": "minCount",
        "node_count": "nodeCount",
        "node_labels": "nodeLabels",
        "node_taints": "nodeTaints",
        "orchestrator_version": "orchestratorVersion",
        "os_disk_size_gb": "osDiskSizeGb",
        "os_disk_type": "osDiskType",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "tags": "tags",
        "type": "type",
        "vnet_subnet_id": "vnetSubnetId",
    },
)
class KubernetesClusterDefaultNodePool:
    def __init__(
        self,
        *,
        name: builtins.str,
        vm_size: builtins.str,
        availability_zones: typing.Optional[typing.List[builtins.str]] = None,
        enable_auto_scaling: typing.Optional[builtins.bool] = None,
        enable_node_public_ip: typing.Optional[builtins.bool] = None,
        max_count: typing.Optional[jsii.Number] = None,
        max_pods: typing.Optional[jsii.Number] = None,
        min_count: typing.Optional[jsii.Number] = None,
        node_count: typing.Optional[jsii.Number] = None,
        node_labels: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        node_taints: typing.Optional[typing.List[builtins.str]] = None,
        orchestrator_version: typing.Optional[builtins.str] = None,
        os_disk_size_gb: typing.Optional[jsii.Number] = None,
        os_disk_type: typing.Optional[builtins.str] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        type: typing.Optional[builtins.str] = None,
        vnet_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param vm_size: -
        :param availability_zones: -
        :param enable_auto_scaling: -
        :param enable_node_public_ip: -
        :param max_count: -
        :param max_pods: -
        :param min_count: -
        :param node_count: -
        :param node_labels: -
        :param node_taints: -
        :param orchestrator_version: -
        :param os_disk_size_gb: -
        :param os_disk_type: -
        :param proximity_placement_group_id: -
        :param tags: -
        :param type: -
        :param vnet_subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "vm_size": vm_size,
        }
        if availability_zones is not None:
            self._values["availability_zones"] = availability_zones
        if enable_auto_scaling is not None:
            self._values["enable_auto_scaling"] = enable_auto_scaling
        if enable_node_public_ip is not None:
            self._values["enable_node_public_ip"] = enable_node_public_ip
        if max_count is not None:
            self._values["max_count"] = max_count
        if max_pods is not None:
            self._values["max_pods"] = max_pods
        if min_count is not None:
            self._values["min_count"] = min_count
        if node_count is not None:
            self._values["node_count"] = node_count
        if node_labels is not None:
            self._values["node_labels"] = node_labels
        if node_taints is not None:
            self._values["node_taints"] = node_taints
        if orchestrator_version is not None:
            self._values["orchestrator_version"] = orchestrator_version
        if os_disk_size_gb is not None:
            self._values["os_disk_size_gb"] = os_disk_size_gb
        if os_disk_type is not None:
            self._values["os_disk_type"] = os_disk_type
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if tags is not None:
            self._values["tags"] = tags
        if type is not None:
            self._values["type"] = type
        if vnet_subnet_id is not None:
            self._values["vnet_subnet_id"] = vnet_subnet_id

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def availability_zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("availability_zones")
        return result

    @builtins.property
    def enable_auto_scaling(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_auto_scaling")
        return result

    @builtins.property
    def enable_node_public_ip(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_node_public_ip")
        return result

    @builtins.property
    def max_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_count")
        return result

    @builtins.property
    def max_pods(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_pods")
        return result

    @builtins.property
    def min_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_count")
        return result

    @builtins.property
    def node_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("node_count")
        return result

    @builtins.property
    def node_labels(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("node_labels")
        return result

    @builtins.property
    def node_taints(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("node_taints")
        return result

    @builtins.property
    def orchestrator_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("orchestrator_version")
        return result

    @builtins.property
    def os_disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("os_disk_size_gb")
        return result

    @builtins.property
    def os_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_disk_type")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    @builtins.property
    def vnet_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("vnet_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterDefaultNodePool(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class KubernetesClusterIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KubernetesClusterKubeAdminConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KubernetesClusterKubeAdminConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(KubernetesClusterKubeAdminConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificate")
    def client_certificate(self) -> builtins.str:
        return jsii.get(self, "clientCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientKey")
    def client_key(self) -> builtins.str:
        return jsii.get(self, "clientKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterCaCertificate")
    def cluster_ca_certificate(self) -> builtins.str:
        return jsii.get(self, "clusterCaCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="host")
    def host(self) -> builtins.str:
        return jsii.get(self, "host")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class KubernetesClusterKubeConfig(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KubernetesClusterKubeConfig",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(KubernetesClusterKubeConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificate")
    def client_certificate(self) -> builtins.str:
        return jsii.get(self, "clientCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientKey")
    def client_key(self) -> builtins.str:
        return jsii.get(self, "clientKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterCaCertificate")
    def cluster_ca_certificate(self) -> builtins.str:
        return jsii.get(self, "clusterCaCertificate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="host")
    def host(self) -> builtins.str:
        return jsii.get(self, "host")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="username")
    def username(self) -> builtins.str:
        return jsii.get(self, "username")


class KubernetesClusterKubeletIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KubernetesClusterKubeletIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(KubernetesClusterKubeletIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userAssignedIdentityId")
    def user_assigned_identity_id(self) -> builtins.str:
        return jsii.get(self, "userAssignedIdentityId")


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterLinuxProfile",
    jsii_struct_bases=[],
    name_mapping={"admin_username": "adminUsername", "ssh_key": "sshKey"},
)
class KubernetesClusterLinuxProfile:
    def __init__(
        self,
        *,
        admin_username: builtins.str,
        ssh_key: typing.List["KubernetesClusterLinuxProfileSshKey"],
    ) -> None:
        """
        :param admin_username: -
        :param ssh_key: ssh_key block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "admin_username": admin_username,
            "ssh_key": ssh_key,
        }

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def ssh_key(self) -> typing.List["KubernetesClusterLinuxProfileSshKey"]:
        """ssh_key block."""
        result = self._values.get("ssh_key")
        assert result is not None, "Required property 'ssh_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterLinuxProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterLinuxProfileSshKey",
    jsii_struct_bases=[],
    name_mapping={"key_data": "keyData"},
)
class KubernetesClusterLinuxProfileSshKey:
    def __init__(self, *, key_data: builtins.str) -> None:
        """
        :param key_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key_data": key_data,
        }

    @builtins.property
    def key_data(self) -> builtins.str:
        result = self._values.get("key_data")
        assert result is not None, "Required property 'key_data' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterLinuxProfileSshKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterNetworkProfile",
    jsii_struct_bases=[],
    name_mapping={
        "network_plugin": "networkPlugin",
        "dns_service_ip": "dnsServiceIp",
        "docker_bridge_cidr": "dockerBridgeCidr",
        "load_balancer_profile": "loadBalancerProfile",
        "load_balancer_sku": "loadBalancerSku",
        "network_policy": "networkPolicy",
        "outbound_type": "outboundType",
        "pod_cidr": "podCidr",
        "service_cidr": "serviceCidr",
    },
)
class KubernetesClusterNetworkProfile:
    def __init__(
        self,
        *,
        network_plugin: builtins.str,
        dns_service_ip: typing.Optional[builtins.str] = None,
        docker_bridge_cidr: typing.Optional[builtins.str] = None,
        load_balancer_profile: typing.Optional[typing.List["KubernetesClusterNetworkProfileLoadBalancerProfile"]] = None,
        load_balancer_sku: typing.Optional[builtins.str] = None,
        network_policy: typing.Optional[builtins.str] = None,
        outbound_type: typing.Optional[builtins.str] = None,
        pod_cidr: typing.Optional[builtins.str] = None,
        service_cidr: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param network_plugin: -
        :param dns_service_ip: -
        :param docker_bridge_cidr: -
        :param load_balancer_profile: load_balancer_profile block.
        :param load_balancer_sku: -
        :param network_policy: -
        :param outbound_type: -
        :param pod_cidr: -
        :param service_cidr: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "network_plugin": network_plugin,
        }
        if dns_service_ip is not None:
            self._values["dns_service_ip"] = dns_service_ip
        if docker_bridge_cidr is not None:
            self._values["docker_bridge_cidr"] = docker_bridge_cidr
        if load_balancer_profile is not None:
            self._values["load_balancer_profile"] = load_balancer_profile
        if load_balancer_sku is not None:
            self._values["load_balancer_sku"] = load_balancer_sku
        if network_policy is not None:
            self._values["network_policy"] = network_policy
        if outbound_type is not None:
            self._values["outbound_type"] = outbound_type
        if pod_cidr is not None:
            self._values["pod_cidr"] = pod_cidr
        if service_cidr is not None:
            self._values["service_cidr"] = service_cidr

    @builtins.property
    def network_plugin(self) -> builtins.str:
        result = self._values.get("network_plugin")
        assert result is not None, "Required property 'network_plugin' is missing"
        return result

    @builtins.property
    def dns_service_ip(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dns_service_ip")
        return result

    @builtins.property
    def docker_bridge_cidr(self) -> typing.Optional[builtins.str]:
        result = self._values.get("docker_bridge_cidr")
        return result

    @builtins.property
    def load_balancer_profile(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterNetworkProfileLoadBalancerProfile"]]:
        """load_balancer_profile block."""
        result = self._values.get("load_balancer_profile")
        return result

    @builtins.property
    def load_balancer_sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("load_balancer_sku")
        return result

    @builtins.property
    def network_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("network_policy")
        return result

    @builtins.property
    def outbound_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("outbound_type")
        return result

    @builtins.property
    def pod_cidr(self) -> typing.Optional[builtins.str]:
        result = self._values.get("pod_cidr")
        return result

    @builtins.property
    def service_cidr(self) -> typing.Optional[builtins.str]:
        result = self._values.get("service_cidr")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterNetworkProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterNetworkProfileLoadBalancerProfile",
    jsii_struct_bases=[],
    name_mapping={
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "managed_outbound_ip_count": "managedOutboundIpCount",
        "outbound_ip_address_ids": "outboundIpAddressIds",
        "outbound_ip_prefix_ids": "outboundIpPrefixIds",
        "outbound_ports_allocated": "outboundPortsAllocated",
    },
)
class KubernetesClusterNetworkProfileLoadBalancerProfile:
    def __init__(
        self,
        *,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        managed_outbound_ip_count: typing.Optional[jsii.Number] = None,
        outbound_ip_address_ids: typing.Optional[typing.List[builtins.str]] = None,
        outbound_ip_prefix_ids: typing.Optional[typing.List[builtins.str]] = None,
        outbound_ports_allocated: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param idle_timeout_in_minutes: -
        :param managed_outbound_ip_count: -
        :param outbound_ip_address_ids: -
        :param outbound_ip_prefix_ids: -
        :param outbound_ports_allocated: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if managed_outbound_ip_count is not None:
            self._values["managed_outbound_ip_count"] = managed_outbound_ip_count
        if outbound_ip_address_ids is not None:
            self._values["outbound_ip_address_ids"] = outbound_ip_address_ids
        if outbound_ip_prefix_ids is not None:
            self._values["outbound_ip_prefix_ids"] = outbound_ip_prefix_ids
        if outbound_ports_allocated is not None:
            self._values["outbound_ports_allocated"] = outbound_ports_allocated

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def managed_outbound_ip_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("managed_outbound_ip_count")
        return result

    @builtins.property
    def outbound_ip_address_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("outbound_ip_address_ids")
        return result

    @builtins.property
    def outbound_ip_prefix_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("outbound_ip_prefix_ids")
        return result

    @builtins.property
    def outbound_ports_allocated(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("outbound_ports_allocated")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterNetworkProfileLoadBalancerProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KubernetesClusterNodePool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KubernetesClusterNodePool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        kubernetes_cluster_id: builtins.str,
        name: builtins.str,
        vm_size: builtins.str,
        availability_zones: typing.Optional[typing.List[builtins.str]] = None,
        enable_auto_scaling: typing.Optional[builtins.bool] = None,
        enable_node_public_ip: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        max_count: typing.Optional[jsii.Number] = None,
        max_pods: typing.Optional[jsii.Number] = None,
        min_count: typing.Optional[jsii.Number] = None,
        mode: typing.Optional[builtins.str] = None,
        node_count: typing.Optional[jsii.Number] = None,
        node_labels: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        node_taints: typing.Optional[typing.List[builtins.str]] = None,
        orchestrator_version: typing.Optional[builtins.str] = None,
        os_disk_size_gb: typing.Optional[jsii.Number] = None,
        os_disk_type: typing.Optional[builtins.str] = None,
        os_type: typing.Optional[builtins.str] = None,
        priority: typing.Optional[builtins.str] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        spot_max_price: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KubernetesClusterNodePoolTimeouts"] = None,
        vnet_subnet_id: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param kubernetes_cluster_id: -
        :param name: -
        :param vm_size: -
        :param availability_zones: -
        :param enable_auto_scaling: -
        :param enable_node_public_ip: -
        :param eviction_policy: -
        :param max_count: -
        :param max_pods: -
        :param min_count: -
        :param mode: -
        :param node_count: -
        :param node_labels: -
        :param node_taints: -
        :param orchestrator_version: -
        :param os_disk_size_gb: -
        :param os_disk_type: -
        :param os_type: -
        :param priority: -
        :param proximity_placement_group_id: -
        :param spot_max_price: -
        :param tags: -
        :param timeouts: timeouts block.
        :param vnet_subnet_id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KubernetesClusterNodePoolConfig(
            kubernetes_cluster_id=kubernetes_cluster_id,
            name=name,
            vm_size=vm_size,
            availability_zones=availability_zones,
            enable_auto_scaling=enable_auto_scaling,
            enable_node_public_ip=enable_node_public_ip,
            eviction_policy=eviction_policy,
            max_count=max_count,
            max_pods=max_pods,
            min_count=min_count,
            mode=mode,
            node_count=node_count,
            node_labels=node_labels,
            node_taints=node_taints,
            orchestrator_version=orchestrator_version,
            os_disk_size_gb=os_disk_size_gb,
            os_disk_type=os_disk_type,
            os_type=os_type,
            priority=priority,
            proximity_placement_group_id=proximity_placement_group_id,
            spot_max_price=spot_max_price,
            tags=tags,
            timeouts=timeouts,
            vnet_subnet_id=vnet_subnet_id,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KubernetesClusterNodePool, self, [scope, id, config])

    @jsii.member(jsii_name="resetAvailabilityZones")
    def reset_availability_zones(self) -> None:
        return jsii.invoke(self, "resetAvailabilityZones", [])

    @jsii.member(jsii_name="resetEnableAutoScaling")
    def reset_enable_auto_scaling(self) -> None:
        return jsii.invoke(self, "resetEnableAutoScaling", [])

    @jsii.member(jsii_name="resetEnableNodePublicIp")
    def reset_enable_node_public_ip(self) -> None:
        return jsii.invoke(self, "resetEnableNodePublicIp", [])

    @jsii.member(jsii_name="resetEvictionPolicy")
    def reset_eviction_policy(self) -> None:
        return jsii.invoke(self, "resetEvictionPolicy", [])

    @jsii.member(jsii_name="resetMaxCount")
    def reset_max_count(self) -> None:
        return jsii.invoke(self, "resetMaxCount", [])

    @jsii.member(jsii_name="resetMaxPods")
    def reset_max_pods(self) -> None:
        return jsii.invoke(self, "resetMaxPods", [])

    @jsii.member(jsii_name="resetMinCount")
    def reset_min_count(self) -> None:
        return jsii.invoke(self, "resetMinCount", [])

    @jsii.member(jsii_name="resetMode")
    def reset_mode(self) -> None:
        return jsii.invoke(self, "resetMode", [])

    @jsii.member(jsii_name="resetNodeCount")
    def reset_node_count(self) -> None:
        return jsii.invoke(self, "resetNodeCount", [])

    @jsii.member(jsii_name="resetNodeLabels")
    def reset_node_labels(self) -> None:
        return jsii.invoke(self, "resetNodeLabels", [])

    @jsii.member(jsii_name="resetNodeTaints")
    def reset_node_taints(self) -> None:
        return jsii.invoke(self, "resetNodeTaints", [])

    @jsii.member(jsii_name="resetOrchestratorVersion")
    def reset_orchestrator_version(self) -> None:
        return jsii.invoke(self, "resetOrchestratorVersion", [])

    @jsii.member(jsii_name="resetOsDiskSizeGb")
    def reset_os_disk_size_gb(self) -> None:
        return jsii.invoke(self, "resetOsDiskSizeGb", [])

    @jsii.member(jsii_name="resetOsDiskType")
    def reset_os_disk_type(self) -> None:
        return jsii.invoke(self, "resetOsDiskType", [])

    @jsii.member(jsii_name="resetOsType")
    def reset_os_type(self) -> None:
        return jsii.invoke(self, "resetOsType", [])

    @jsii.member(jsii_name="resetPriority")
    def reset_priority(self) -> None:
        return jsii.invoke(self, "resetPriority", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetSpotMaxPrice")
    def reset_spot_max_price(self) -> None:
        return jsii.invoke(self, "resetSpotMaxPrice", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVnetSubnetId")
    def reset_vnet_subnet_id(self) -> None:
        return jsii.invoke(self, "resetVnetSubnetId", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubernetesClusterIdInput")
    def kubernetes_cluster_id_input(self) -> builtins.str:
        return jsii.get(self, "kubernetesClusterIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSizeInput")
    def vm_size_input(self) -> builtins.str:
        return jsii.get(self, "vmSizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilityZonesInput")
    def availability_zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "availabilityZonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutoScalingInput")
    def enable_auto_scaling_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableAutoScalingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableNodePublicIpInput")
    def enable_node_public_ip_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableNodePublicIpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicyInput")
    def eviction_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "evictionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxCountInput")
    def max_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxPodsInput")
    def max_pods_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxPodsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minCountInput")
    def min_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "minCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="modeInput")
    def mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "modeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeCountInput")
    def node_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "nodeCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeLabelsInput")
    def node_labels_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "nodeLabelsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeTaintsInput")
    def node_taints_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "nodeTaintsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="orchestratorVersionInput")
    def orchestrator_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "orchestratorVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskSizeGbInput")
    def os_disk_size_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "osDiskSizeGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskTypeInput")
    def os_disk_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "osDiskTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osTypeInput")
    def os_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "osTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="spotMaxPriceInput")
    def spot_max_price_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "spotMaxPriceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KubernetesClusterNodePoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vnetSubnetIdInput")
    def vnet_subnet_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "vnetSubnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilityZones")
    def availability_zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "availabilityZones")

    @availability_zones.setter # type: ignore
    def availability_zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "availabilityZones", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutoScaling")
    def enable_auto_scaling(self) -> builtins.bool:
        return jsii.get(self, "enableAutoScaling")

    @enable_auto_scaling.setter # type: ignore
    def enable_auto_scaling(self, value: builtins.bool) -> None:
        jsii.set(self, "enableAutoScaling", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableNodePublicIp")
    def enable_node_public_ip(self) -> builtins.bool:
        return jsii.get(self, "enableNodePublicIp")

    @enable_node_public_ip.setter # type: ignore
    def enable_node_public_ip(self, value: builtins.bool) -> None:
        jsii.set(self, "enableNodePublicIp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicy")
    def eviction_policy(self) -> builtins.str:
        return jsii.get(self, "evictionPolicy")

    @eviction_policy.setter # type: ignore
    def eviction_policy(self, value: builtins.str) -> None:
        jsii.set(self, "evictionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kubernetesClusterId")
    def kubernetes_cluster_id(self) -> builtins.str:
        return jsii.get(self, "kubernetesClusterId")

    @kubernetes_cluster_id.setter # type: ignore
    def kubernetes_cluster_id(self, value: builtins.str) -> None:
        jsii.set(self, "kubernetesClusterId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxCount")
    def max_count(self) -> jsii.Number:
        return jsii.get(self, "maxCount")

    @max_count.setter # type: ignore
    def max_count(self, value: jsii.Number) -> None:
        jsii.set(self, "maxCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxPods")
    def max_pods(self) -> jsii.Number:
        return jsii.get(self, "maxPods")

    @max_pods.setter # type: ignore
    def max_pods(self, value: jsii.Number) -> None:
        jsii.set(self, "maxPods", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minCount")
    def min_count(self) -> jsii.Number:
        return jsii.get(self, "minCount")

    @min_count.setter # type: ignore
    def min_count(self, value: jsii.Number) -> None:
        jsii.set(self, "minCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mode")
    def mode(self) -> builtins.str:
        return jsii.get(self, "mode")

    @mode.setter # type: ignore
    def mode(self, value: builtins.str) -> None:
        jsii.set(self, "mode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeCount")
    def node_count(self) -> jsii.Number:
        return jsii.get(self, "nodeCount")

    @node_count.setter # type: ignore
    def node_count(self, value: jsii.Number) -> None:
        jsii.set(self, "nodeCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeLabels")
    def node_labels(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "nodeLabels")

    @node_labels.setter # type: ignore
    def node_labels(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "nodeLabels", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeTaints")
    def node_taints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "nodeTaints")

    @node_taints.setter # type: ignore
    def node_taints(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "nodeTaints", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="orchestratorVersion")
    def orchestrator_version(self) -> builtins.str:
        return jsii.get(self, "orchestratorVersion")

    @orchestrator_version.setter # type: ignore
    def orchestrator_version(self, value: builtins.str) -> None:
        jsii.set(self, "orchestratorVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskSizeGb")
    def os_disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "osDiskSizeGb")

    @os_disk_size_gb.setter # type: ignore
    def os_disk_size_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "osDiskSizeGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskType")
    def os_disk_type(self) -> builtins.str:
        return jsii.get(self, "osDiskType")

    @os_disk_type.setter # type: ignore
    def os_disk_type(self, value: builtins.str) -> None:
        jsii.set(self, "osDiskType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @os_type.setter # type: ignore
    def os_type(self, value: builtins.str) -> None:
        jsii.set(self, "osType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> builtins.str:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: builtins.str) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="spotMaxPrice")
    def spot_max_price(self) -> jsii.Number:
        return jsii.get(self, "spotMaxPrice")

    @spot_max_price.setter # type: ignore
    def spot_max_price(self, value: jsii.Number) -> None:
        jsii.set(self, "spotMaxPrice", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KubernetesClusterNodePoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KubernetesClusterNodePoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSize")
    def vm_size(self) -> builtins.str:
        return jsii.get(self, "vmSize")

    @vm_size.setter # type: ignore
    def vm_size(self, value: builtins.str) -> None:
        jsii.set(self, "vmSize", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vnetSubnetId")
    def vnet_subnet_id(self) -> builtins.str:
        return jsii.get(self, "vnetSubnetId")

    @vnet_subnet_id.setter # type: ignore
    def vnet_subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "vnetSubnetId", value)


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterNodePoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "kubernetes_cluster_id": "kubernetesClusterId",
        "name": "name",
        "vm_size": "vmSize",
        "availability_zones": "availabilityZones",
        "enable_auto_scaling": "enableAutoScaling",
        "enable_node_public_ip": "enableNodePublicIp",
        "eviction_policy": "evictionPolicy",
        "max_count": "maxCount",
        "max_pods": "maxPods",
        "min_count": "minCount",
        "mode": "mode",
        "node_count": "nodeCount",
        "node_labels": "nodeLabels",
        "node_taints": "nodeTaints",
        "orchestrator_version": "orchestratorVersion",
        "os_disk_size_gb": "osDiskSizeGb",
        "os_disk_type": "osDiskType",
        "os_type": "osType",
        "priority": "priority",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "spot_max_price": "spotMaxPrice",
        "tags": "tags",
        "timeouts": "timeouts",
        "vnet_subnet_id": "vnetSubnetId",
    },
)
class KubernetesClusterNodePoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        kubernetes_cluster_id: builtins.str,
        name: builtins.str,
        vm_size: builtins.str,
        availability_zones: typing.Optional[typing.List[builtins.str]] = None,
        enable_auto_scaling: typing.Optional[builtins.bool] = None,
        enable_node_public_ip: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        max_count: typing.Optional[jsii.Number] = None,
        max_pods: typing.Optional[jsii.Number] = None,
        min_count: typing.Optional[jsii.Number] = None,
        mode: typing.Optional[builtins.str] = None,
        node_count: typing.Optional[jsii.Number] = None,
        node_labels: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        node_taints: typing.Optional[typing.List[builtins.str]] = None,
        orchestrator_version: typing.Optional[builtins.str] = None,
        os_disk_size_gb: typing.Optional[jsii.Number] = None,
        os_disk_type: typing.Optional[builtins.str] = None,
        os_type: typing.Optional[builtins.str] = None,
        priority: typing.Optional[builtins.str] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        spot_max_price: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KubernetesClusterNodePoolTimeouts"] = None,
        vnet_subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param kubernetes_cluster_id: -
        :param name: -
        :param vm_size: -
        :param availability_zones: -
        :param enable_auto_scaling: -
        :param enable_node_public_ip: -
        :param eviction_policy: -
        :param max_count: -
        :param max_pods: -
        :param min_count: -
        :param mode: -
        :param node_count: -
        :param node_labels: -
        :param node_taints: -
        :param orchestrator_version: -
        :param os_disk_size_gb: -
        :param os_disk_type: -
        :param os_type: -
        :param priority: -
        :param proximity_placement_group_id: -
        :param spot_max_price: -
        :param tags: -
        :param timeouts: timeouts block.
        :param vnet_subnet_id: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KubernetesClusterNodePoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "kubernetes_cluster_id": kubernetes_cluster_id,
            "name": name,
            "vm_size": vm_size,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if availability_zones is not None:
            self._values["availability_zones"] = availability_zones
        if enable_auto_scaling is not None:
            self._values["enable_auto_scaling"] = enable_auto_scaling
        if enable_node_public_ip is not None:
            self._values["enable_node_public_ip"] = enable_node_public_ip
        if eviction_policy is not None:
            self._values["eviction_policy"] = eviction_policy
        if max_count is not None:
            self._values["max_count"] = max_count
        if max_pods is not None:
            self._values["max_pods"] = max_pods
        if min_count is not None:
            self._values["min_count"] = min_count
        if mode is not None:
            self._values["mode"] = mode
        if node_count is not None:
            self._values["node_count"] = node_count
        if node_labels is not None:
            self._values["node_labels"] = node_labels
        if node_taints is not None:
            self._values["node_taints"] = node_taints
        if orchestrator_version is not None:
            self._values["orchestrator_version"] = orchestrator_version
        if os_disk_size_gb is not None:
            self._values["os_disk_size_gb"] = os_disk_size_gb
        if os_disk_type is not None:
            self._values["os_disk_type"] = os_disk_type
        if os_type is not None:
            self._values["os_type"] = os_type
        if priority is not None:
            self._values["priority"] = priority
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if spot_max_price is not None:
            self._values["spot_max_price"] = spot_max_price
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if vnet_subnet_id is not None:
            self._values["vnet_subnet_id"] = vnet_subnet_id

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def kubernetes_cluster_id(self) -> builtins.str:
        result = self._values.get("kubernetes_cluster_id")
        assert result is not None, "Required property 'kubernetes_cluster_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def availability_zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("availability_zones")
        return result

    @builtins.property
    def enable_auto_scaling(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_auto_scaling")
        return result

    @builtins.property
    def enable_node_public_ip(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_node_public_ip")
        return result

    @builtins.property
    def eviction_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eviction_policy")
        return result

    @builtins.property
    def max_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_count")
        return result

    @builtins.property
    def max_pods(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_pods")
        return result

    @builtins.property
    def min_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_count")
        return result

    @builtins.property
    def mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("mode")
        return result

    @builtins.property
    def node_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("node_count")
        return result

    @builtins.property
    def node_labels(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("node_labels")
        return result

    @builtins.property
    def node_taints(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("node_taints")
        return result

    @builtins.property
    def orchestrator_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("orchestrator_version")
        return result

    @builtins.property
    def os_disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("os_disk_size_gb")
        return result

    @builtins.property
    def os_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_disk_type")
        return result

    @builtins.property
    def os_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_type")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def spot_max_price(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("spot_max_price")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KubernetesClusterNodePoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def vnet_subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("vnet_subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterNodePoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterNodePoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KubernetesClusterNodePoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterNodePoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterRoleBasedAccessControl",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "azure_active_directory": "azureActiveDirectory",
    },
)
class KubernetesClusterRoleBasedAccessControl:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        azure_active_directory: typing.Optional[typing.List["KubernetesClusterRoleBasedAccessControlAzureActiveDirectory"]] = None,
    ) -> None:
        """
        :param enabled: -
        :param azure_active_directory: azure_active_directory block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if azure_active_directory is not None:
            self._values["azure_active_directory"] = azure_active_directory

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def azure_active_directory(
        self,
    ) -> typing.Optional[typing.List["KubernetesClusterRoleBasedAccessControlAzureActiveDirectory"]]:
        """azure_active_directory block."""
        result = self._values.get("azure_active_directory")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterRoleBasedAccessControl(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterRoleBasedAccessControlAzureActiveDirectory",
    jsii_struct_bases=[],
    name_mapping={
        "admin_group_object_ids": "adminGroupObjectIds",
        "client_app_id": "clientAppId",
        "managed": "managed",
        "server_app_id": "serverAppId",
        "server_app_secret": "serverAppSecret",
        "tenant_id": "tenantId",
    },
)
class KubernetesClusterRoleBasedAccessControlAzureActiveDirectory:
    def __init__(
        self,
        *,
        admin_group_object_ids: typing.Optional[typing.List[builtins.str]] = None,
        client_app_id: typing.Optional[builtins.str] = None,
        managed: typing.Optional[builtins.bool] = None,
        server_app_id: typing.Optional[builtins.str] = None,
        server_app_secret: typing.Optional[builtins.str] = None,
        tenant_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param admin_group_object_ids: -
        :param client_app_id: -
        :param managed: -
        :param server_app_id: -
        :param server_app_secret: -
        :param tenant_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if admin_group_object_ids is not None:
            self._values["admin_group_object_ids"] = admin_group_object_ids
        if client_app_id is not None:
            self._values["client_app_id"] = client_app_id
        if managed is not None:
            self._values["managed"] = managed
        if server_app_id is not None:
            self._values["server_app_id"] = server_app_id
        if server_app_secret is not None:
            self._values["server_app_secret"] = server_app_secret
        if tenant_id is not None:
            self._values["tenant_id"] = tenant_id

    @builtins.property
    def admin_group_object_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("admin_group_object_ids")
        return result

    @builtins.property
    def client_app_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("client_app_id")
        return result

    @builtins.property
    def managed(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("managed")
        return result

    @builtins.property
    def server_app_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("server_app_id")
        return result

    @builtins.property
    def server_app_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("server_app_secret")
        return result

    @builtins.property
    def tenant_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tenant_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterRoleBasedAccessControlAzureActiveDirectory(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterServicePrincipal",
    jsii_struct_bases=[],
    name_mapping={"client_id": "clientId", "client_secret": "clientSecret"},
)
class KubernetesClusterServicePrincipal:
    def __init__(self, *, client_id: builtins.str, client_secret: builtins.str) -> None:
        """
        :param client_id: -
        :param client_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "client_secret": client_secret,
        }

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def client_secret(self) -> builtins.str:
        result = self._values.get("client_secret")
        assert result is not None, "Required property 'client_secret' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterServicePrincipal(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KubernetesClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KubernetesClusterWindowsProfile",
    jsii_struct_bases=[],
    name_mapping={
        "admin_username": "adminUsername",
        "admin_password": "adminPassword",
    },
)
class KubernetesClusterWindowsProfile:
    def __init__(
        self,
        *,
        admin_username: builtins.str,
        admin_password: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param admin_username: -
        :param admin_password: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "admin_username": admin_username,
        }
        if admin_password is not None:
            self._values["admin_password"] = admin_password

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def admin_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("admin_password")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KubernetesClusterWindowsProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KustoAttachedDatabaseConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoAttachedDatabaseConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_name: builtins.str,
        cluster_resource_id: builtins.str,
        database_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        default_principal_modification_kind: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KustoAttachedDatabaseConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_name: -
        :param cluster_resource_id: -
        :param database_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param default_principal_modification_kind: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoAttachedDatabaseConfigurationConfig(
            cluster_name=cluster_name,
            cluster_resource_id=cluster_resource_id,
            database_name=database_name,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            default_principal_modification_kind=default_principal_modification_kind,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoAttachedDatabaseConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetDefaultPrincipalModificationKind")
    def reset_default_principal_modification_kind(self) -> None:
        return jsii.invoke(self, "resetDefaultPrincipalModificationKind", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="attachedDatabaseNames")
    def attached_database_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "attachedDatabaseNames")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterNameInput")
    def cluster_name_input(self) -> builtins.str:
        return jsii.get(self, "clusterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterResourceIdInput")
    def cluster_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "clusterResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrincipalModificationKindInput")
    def default_principal_modification_kind_input(
        self,
    ) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultPrincipalModificationKindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["KustoAttachedDatabaseConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterName")
    def cluster_name(self) -> builtins.str:
        return jsii.get(self, "clusterName")

    @cluster_name.setter # type: ignore
    def cluster_name(self, value: builtins.str) -> None:
        jsii.set(self, "clusterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterResourceId")
    def cluster_resource_id(self) -> builtins.str:
        return jsii.get(self, "clusterResourceId")

    @cluster_resource_id.setter # type: ignore
    def cluster_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "clusterResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrincipalModificationKind")
    def default_principal_modification_kind(self) -> builtins.str:
        return jsii.get(self, "defaultPrincipalModificationKind")

    @default_principal_modification_kind.setter # type: ignore
    def default_principal_modification_kind(self, value: builtins.str) -> None:
        jsii.set(self, "defaultPrincipalModificationKind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoAttachedDatabaseConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoAttachedDatabaseConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KustoAttachedDatabaseConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_name": "clusterName",
        "cluster_resource_id": "clusterResourceId",
        "database_name": "databaseName",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "default_principal_modification_kind": "defaultPrincipalModificationKind",
        "timeouts": "timeouts",
    },
)
class KustoAttachedDatabaseConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_name: builtins.str,
        cluster_resource_id: builtins.str,
        database_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        default_principal_modification_kind: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KustoAttachedDatabaseConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_name: -
        :param cluster_resource_id: -
        :param database_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param default_principal_modification_kind: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoAttachedDatabaseConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_name": cluster_name,
            "cluster_resource_id": cluster_resource_id,
            "database_name": database_name,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if default_principal_modification_kind is not None:
            self._values["default_principal_modification_kind"] = default_principal_modification_kind
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_name(self) -> builtins.str:
        result = self._values.get("cluster_name")
        assert result is not None, "Required property 'cluster_name' is missing"
        return result

    @builtins.property
    def cluster_resource_id(self) -> builtins.str:
        result = self._values.get("cluster_resource_id")
        assert result is not None, "Required property 'cluster_resource_id' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def default_principal_modification_kind(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_principal_modification_kind")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoAttachedDatabaseConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoAttachedDatabaseConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoAttachedDatabaseConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KustoAttachedDatabaseConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoAttachedDatabaseConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KustoCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["KustoClusterSku"],
        enable_disk_encryption: typing.Optional[builtins.bool] = None,
        enable_purge: typing.Optional[builtins.bool] = None,
        enable_streaming_ingest: typing.Optional[builtins.bool] = None,
        engine: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["KustoClusterIdentity"]] = None,
        language_extensions: typing.Optional[typing.List[builtins.str]] = None,
        optimized_auto_scale: typing.Optional[typing.List["KustoClusterOptimizedAutoScale"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KustoClusterTimeouts"] = None,
        trusted_external_tenants: typing.Optional[typing.List[builtins.str]] = None,
        virtual_network_configuration: typing.Optional[typing.List["KustoClusterVirtualNetworkConfiguration"]] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param enable_disk_encryption: -
        :param enable_purge: -
        :param enable_streaming_ingest: -
        :param engine: -
        :param identity: identity block.
        :param language_extensions: -
        :param optimized_auto_scale: optimized_auto_scale block.
        :param tags: -
        :param timeouts: timeouts block.
        :param trusted_external_tenants: -
        :param virtual_network_configuration: virtual_network_configuration block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoClusterConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            enable_disk_encryption=enable_disk_encryption,
            enable_purge=enable_purge,
            enable_streaming_ingest=enable_streaming_ingest,
            engine=engine,
            identity=identity,
            language_extensions=language_extensions,
            optimized_auto_scale=optimized_auto_scale,
            tags=tags,
            timeouts=timeouts,
            trusted_external_tenants=trusted_external_tenants,
            virtual_network_configuration=virtual_network_configuration,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnableDiskEncryption")
    def reset_enable_disk_encryption(self) -> None:
        return jsii.invoke(self, "resetEnableDiskEncryption", [])

    @jsii.member(jsii_name="resetEnablePurge")
    def reset_enable_purge(self) -> None:
        return jsii.invoke(self, "resetEnablePurge", [])

    @jsii.member(jsii_name="resetEnableStreamingIngest")
    def reset_enable_streaming_ingest(self) -> None:
        return jsii.invoke(self, "resetEnableStreamingIngest", [])

    @jsii.member(jsii_name="resetEngine")
    def reset_engine(self) -> None:
        return jsii.invoke(self, "resetEngine", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLanguageExtensions")
    def reset_language_extensions(self) -> None:
        return jsii.invoke(self, "resetLanguageExtensions", [])

    @jsii.member(jsii_name="resetOptimizedAutoScale")
    def reset_optimized_auto_scale(self) -> None:
        return jsii.invoke(self, "resetOptimizedAutoScale", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTrustedExternalTenants")
    def reset_trusted_external_tenants(self) -> None:
        return jsii.invoke(self, "resetTrustedExternalTenants", [])

    @jsii.member(jsii_name="resetVirtualNetworkConfiguration")
    def reset_virtual_network_configuration(self) -> None:
        return jsii.invoke(self, "resetVirtualNetworkConfiguration", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataIngestionUri")
    def data_ingestion_uri(self) -> builtins.str:
        return jsii.get(self, "dataIngestionUri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["KustoClusterSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uri")
    def uri(self) -> builtins.str:
        return jsii.get(self, "uri")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableDiskEncryptionInput")
    def enable_disk_encryption_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableDiskEncryptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePurgeInput")
    def enable_purge_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enablePurgeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableStreamingIngestInput")
    def enable_streaming_ingest_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableStreamingIngestInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="engineInput")
    def engine_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "engineInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["KustoClusterIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="languageExtensionsInput")
    def language_extensions_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "languageExtensionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="optimizedAutoScaleInput")
    def optimized_auto_scale_input(
        self,
    ) -> typing.Optional[typing.List["KustoClusterOptimizedAutoScale"]]:
        return jsii.get(self, "optimizedAutoScaleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KustoClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustedExternalTenantsInput")
    def trusted_external_tenants_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "trustedExternalTenantsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkConfigurationInput")
    def virtual_network_configuration_input(
        self,
    ) -> typing.Optional[typing.List["KustoClusterVirtualNetworkConfiguration"]]:
        return jsii.get(self, "virtualNetworkConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableDiskEncryption")
    def enable_disk_encryption(self) -> builtins.bool:
        return jsii.get(self, "enableDiskEncryption")

    @enable_disk_encryption.setter # type: ignore
    def enable_disk_encryption(self, value: builtins.bool) -> None:
        jsii.set(self, "enableDiskEncryption", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePurge")
    def enable_purge(self) -> builtins.bool:
        return jsii.get(self, "enablePurge")

    @enable_purge.setter # type: ignore
    def enable_purge(self, value: builtins.bool) -> None:
        jsii.set(self, "enablePurge", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableStreamingIngest")
    def enable_streaming_ingest(self) -> builtins.bool:
        return jsii.get(self, "enableStreamingIngest")

    @enable_streaming_ingest.setter # type: ignore
    def enable_streaming_ingest(self, value: builtins.bool) -> None:
        jsii.set(self, "enableStreamingIngest", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="engine")
    def engine(self) -> builtins.str:
        return jsii.get(self, "engine")

    @engine.setter # type: ignore
    def engine(self, value: builtins.str) -> None:
        jsii.set(self, "engine", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["KustoClusterIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["KustoClusterIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="languageExtensions")
    def language_extensions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "languageExtensions")

    @language_extensions.setter # type: ignore
    def language_extensions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "languageExtensions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="optimizedAutoScale")
    def optimized_auto_scale(self) -> typing.List["KustoClusterOptimizedAutoScale"]:
        return jsii.get(self, "optimizedAutoScale")

    @optimized_auto_scale.setter # type: ignore
    def optimized_auto_scale(
        self,
        value: typing.List["KustoClusterOptimizedAutoScale"],
    ) -> None:
        jsii.set(self, "optimizedAutoScale", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["KustoClusterSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["KustoClusterSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trustedExternalTenants")
    def trusted_external_tenants(self) -> typing.List[builtins.str]:
        return jsii.get(self, "trustedExternalTenants")

    @trusted_external_tenants.setter # type: ignore
    def trusted_external_tenants(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "trustedExternalTenants", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkConfiguration")
    def virtual_network_configuration(
        self,
    ) -> typing.List["KustoClusterVirtualNetworkConfiguration"]:
        return jsii.get(self, "virtualNetworkConfiguration")

    @virtual_network_configuration.setter # type: ignore
    def virtual_network_configuration(
        self,
        value: typing.List["KustoClusterVirtualNetworkConfiguration"],
    ) -> None:
        jsii.set(self, "virtualNetworkConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.KustoClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "enable_disk_encryption": "enableDiskEncryption",
        "enable_purge": "enablePurge",
        "enable_streaming_ingest": "enableStreamingIngest",
        "engine": "engine",
        "identity": "identity",
        "language_extensions": "languageExtensions",
        "optimized_auto_scale": "optimizedAutoScale",
        "tags": "tags",
        "timeouts": "timeouts",
        "trusted_external_tenants": "trustedExternalTenants",
        "virtual_network_configuration": "virtualNetworkConfiguration",
        "zones": "zones",
    },
)
class KustoClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["KustoClusterSku"],
        enable_disk_encryption: typing.Optional[builtins.bool] = None,
        enable_purge: typing.Optional[builtins.bool] = None,
        enable_streaming_ingest: typing.Optional[builtins.bool] = None,
        engine: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["KustoClusterIdentity"]] = None,
        language_extensions: typing.Optional[typing.List[builtins.str]] = None,
        optimized_auto_scale: typing.Optional[typing.List["KustoClusterOptimizedAutoScale"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["KustoClusterTimeouts"] = None,
        trusted_external_tenants: typing.Optional[typing.List[builtins.str]] = None,
        virtual_network_configuration: typing.Optional[typing.List["KustoClusterVirtualNetworkConfiguration"]] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param enable_disk_encryption: -
        :param enable_purge: -
        :param enable_streaming_ingest: -
        :param engine: -
        :param identity: identity block.
        :param language_extensions: -
        :param optimized_auto_scale: optimized_auto_scale block.
        :param tags: -
        :param timeouts: timeouts block.
        :param trusted_external_tenants: -
        :param virtual_network_configuration: virtual_network_configuration block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enable_disk_encryption is not None:
            self._values["enable_disk_encryption"] = enable_disk_encryption
        if enable_purge is not None:
            self._values["enable_purge"] = enable_purge
        if enable_streaming_ingest is not None:
            self._values["enable_streaming_ingest"] = enable_streaming_ingest
        if engine is not None:
            self._values["engine"] = engine
        if identity is not None:
            self._values["identity"] = identity
        if language_extensions is not None:
            self._values["language_extensions"] = language_extensions
        if optimized_auto_scale is not None:
            self._values["optimized_auto_scale"] = optimized_auto_scale
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if trusted_external_tenants is not None:
            self._values["trusted_external_tenants"] = trusted_external_tenants
        if virtual_network_configuration is not None:
            self._values["virtual_network_configuration"] = virtual_network_configuration
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["KustoClusterSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def enable_disk_encryption(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_disk_encryption")
        return result

    @builtins.property
    def enable_purge(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_purge")
        return result

    @builtins.property
    def enable_streaming_ingest(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_streaming_ingest")
        return result

    @builtins.property
    def engine(self) -> typing.Optional[builtins.str]:
        result = self._values.get("engine")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["KustoClusterIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def language_extensions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("language_extensions")
        return result

    @builtins.property
    def optimized_auto_scale(
        self,
    ) -> typing.Optional[typing.List["KustoClusterOptimizedAutoScale"]]:
        """optimized_auto_scale block."""
        result = self._values.get("optimized_auto_scale")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def trusted_external_tenants(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("trusted_external_tenants")
        return result

    @builtins.property
    def virtual_network_configuration(
        self,
    ) -> typing.Optional[typing.List["KustoClusterVirtualNetworkConfiguration"]]:
        """virtual_network_configuration block."""
        result = self._values.get("virtual_network_configuration")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KustoClusterCustomerManagedKey(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoClusterCustomerManagedKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_id: builtins.str,
        key_name: builtins.str,
        key_vault_id: builtins.str,
        key_version: builtins.str,
        timeouts: typing.Optional["KustoClusterCustomerManagedKeyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_id: -
        :param key_name: -
        :param key_vault_id: -
        :param key_version: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoClusterCustomerManagedKeyConfig(
            cluster_id=cluster_id,
            key_name=key_name,
            key_vault_id=key_vault_id,
            key_version=key_version,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoClusterCustomerManagedKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterIdInput")
    def cluster_id_input(self) -> builtins.str:
        return jsii.get(self, "clusterIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyNameInput")
    def key_name_input(self) -> builtins.str:
        return jsii.get(self, "keyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVersionInput")
    def key_version_input(self) -> builtins.str:
        return jsii.get(self, "keyVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["KustoClusterCustomerManagedKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterId")
    def cluster_id(self) -> builtins.str:
        return jsii.get(self, "clusterId")

    @cluster_id.setter # type: ignore
    def cluster_id(self, value: builtins.str) -> None:
        jsii.set(self, "clusterId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyName")
    def key_name(self) -> builtins.str:
        return jsii.get(self, "keyName")

    @key_name.setter # type: ignore
    def key_name(self, value: builtins.str) -> None:
        jsii.set(self, "keyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVersion")
    def key_version(self) -> builtins.str:
        return jsii.get(self, "keyVersion")

    @key_version.setter # type: ignore
    def key_version(self, value: builtins.str) -> None:
        jsii.set(self, "keyVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoClusterCustomerManagedKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoClusterCustomerManagedKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KustoClusterCustomerManagedKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_id": "clusterId",
        "key_name": "keyName",
        "key_vault_id": "keyVaultId",
        "key_version": "keyVersion",
        "timeouts": "timeouts",
    },
)
class KustoClusterCustomerManagedKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_id: builtins.str,
        key_name: builtins.str,
        key_vault_id: builtins.str,
        key_version: builtins.str,
        timeouts: typing.Optional["KustoClusterCustomerManagedKeyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_id: -
        :param key_name: -
        :param key_vault_id: -
        :param key_version: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoClusterCustomerManagedKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_id": cluster_id,
            "key_name": key_name,
            "key_vault_id": key_vault_id,
            "key_version": key_version,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_id(self) -> builtins.str:
        result = self._values.get("cluster_id")
        assert result is not None, "Required property 'cluster_id' is missing"
        return result

    @builtins.property
    def key_name(self) -> builtins.str:
        result = self._values.get("key_name")
        assert result is not None, "Required property 'key_name' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def key_version(self) -> builtins.str:
        result = self._values.get("key_version")
        assert result is not None, "Required property 'key_version' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoClusterCustomerManagedKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterCustomerManagedKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoClusterCustomerManagedKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KustoClusterCustomerManagedKeyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterCustomerManagedKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoClusterIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class KustoClusterIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoClusterOptimizedAutoScale",
    jsii_struct_bases=[],
    name_mapping={
        "maximum_instances": "maximumInstances",
        "minimum_instances": "minimumInstances",
    },
)
class KustoClusterOptimizedAutoScale:
    def __init__(
        self,
        *,
        maximum_instances: jsii.Number,
        minimum_instances: jsii.Number,
    ) -> None:
        """
        :param maximum_instances: -
        :param minimum_instances: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "maximum_instances": maximum_instances,
            "minimum_instances": minimum_instances,
        }

    @builtins.property
    def maximum_instances(self) -> jsii.Number:
        result = self._values.get("maximum_instances")
        assert result is not None, "Required property 'maximum_instances' is missing"
        return result

    @builtins.property
    def minimum_instances(self) -> jsii.Number:
        result = self._values.get("minimum_instances")
        assert result is not None, "Required property 'minimum_instances' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterOptimizedAutoScale(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KustoClusterPrincipalAssignment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoClusterPrincipalAssignment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_name: builtins.str,
        name: builtins.str,
        principal_id: builtins.str,
        principal_type: builtins.str,
        resource_group_name: builtins.str,
        role: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["KustoClusterPrincipalAssignmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_name: -
        :param name: -
        :param principal_id: -
        :param principal_type: -
        :param resource_group_name: -
        :param role: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoClusterPrincipalAssignmentConfig(
            cluster_name=cluster_name,
            name=name,
            principal_id=principal_id,
            principal_type=principal_type,
            resource_group_name=resource_group_name,
            role=role,
            tenant_id=tenant_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoClusterPrincipalAssignment, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterNameInput")
    def cluster_name_input(self) -> builtins.str:
        return jsii.get(self, "clusterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalIdInput")
    def principal_id_input(self) -> builtins.str:
        return jsii.get(self, "principalIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalName")
    def principal_name(self) -> builtins.str:
        return jsii.get(self, "principalName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalTypeInput")
    def principal_type_input(self) -> builtins.str:
        return jsii.get(self, "principalTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleInput")
    def role_input(self) -> builtins.str:
        return jsii.get(self, "roleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantName")
    def tenant_name(self) -> builtins.str:
        return jsii.get(self, "tenantName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["KustoClusterPrincipalAssignmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterName")
    def cluster_name(self) -> builtins.str:
        return jsii.get(self, "clusterName")

    @cluster_name.setter # type: ignore
    def cluster_name(self, value: builtins.str) -> None:
        jsii.set(self, "clusterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @principal_id.setter # type: ignore
    def principal_id(self, value: builtins.str) -> None:
        jsii.set(self, "principalId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalType")
    def principal_type(self) -> builtins.str:
        return jsii.get(self, "principalType")

    @principal_type.setter # type: ignore
    def principal_type(self, value: builtins.str) -> None:
        jsii.set(self, "principalType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="role")
    def role(self) -> builtins.str:
        return jsii.get(self, "role")

    @role.setter # type: ignore
    def role(self, value: builtins.str) -> None:
        jsii.set(self, "role", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoClusterPrincipalAssignmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoClusterPrincipalAssignmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KustoClusterPrincipalAssignmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_name": "clusterName",
        "name": "name",
        "principal_id": "principalId",
        "principal_type": "principalType",
        "resource_group_name": "resourceGroupName",
        "role": "role",
        "tenant_id": "tenantId",
        "timeouts": "timeouts",
    },
)
class KustoClusterPrincipalAssignmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_name: builtins.str,
        name: builtins.str,
        principal_id: builtins.str,
        principal_type: builtins.str,
        resource_group_name: builtins.str,
        role: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["KustoClusterPrincipalAssignmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_name: -
        :param name: -
        :param principal_id: -
        :param principal_type: -
        :param resource_group_name: -
        :param role: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoClusterPrincipalAssignmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_name": cluster_name,
            "name": name,
            "principal_id": principal_id,
            "principal_type": principal_type,
            "resource_group_name": resource_group_name,
            "role": role,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_name(self) -> builtins.str:
        result = self._values.get("cluster_name")
        assert result is not None, "Required property 'cluster_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def principal_id(self) -> builtins.str:
        result = self._values.get("principal_id")
        assert result is not None, "Required property 'principal_id' is missing"
        return result

    @builtins.property
    def principal_type(self) -> builtins.str:
        result = self._values.get("principal_type")
        assert result is not None, "Required property 'principal_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def role(self) -> builtins.str:
        result = self._values.get("role")
        assert result is not None, "Required property 'role' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoClusterPrincipalAssignmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterPrincipalAssignmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoClusterPrincipalAssignmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KustoClusterPrincipalAssignmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterPrincipalAssignmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoClusterSku",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "capacity": "capacity"},
)
class KustoClusterSku:
    def __init__(
        self,
        *,
        name: builtins.str,
        capacity: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param name: -
        :param capacity: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if capacity is not None:
            self._values["capacity"] = capacity

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def capacity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("capacity")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KustoClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoClusterVirtualNetworkConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "data_management_public_ip_id": "dataManagementPublicIpId",
        "engine_public_ip_id": "enginePublicIpId",
        "subnet_id": "subnetId",
    },
)
class KustoClusterVirtualNetworkConfiguration:
    def __init__(
        self,
        *,
        data_management_public_ip_id: builtins.str,
        engine_public_ip_id: builtins.str,
        subnet_id: builtins.str,
    ) -> None:
        """
        :param data_management_public_ip_id: -
        :param engine_public_ip_id: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "data_management_public_ip_id": data_management_public_ip_id,
            "engine_public_ip_id": engine_public_ip_id,
            "subnet_id": subnet_id,
        }

    @builtins.property
    def data_management_public_ip_id(self) -> builtins.str:
        result = self._values.get("data_management_public_ip_id")
        assert result is not None, "Required property 'data_management_public_ip_id' is missing"
        return result

    @builtins.property
    def engine_public_ip_id(self) -> builtins.str:
        result = self._values.get("engine_public_ip_id")
        assert result is not None, "Required property 'engine_public_ip_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoClusterVirtualNetworkConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KustoDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        hot_cache_period: typing.Optional[builtins.str] = None,
        soft_delete_period: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KustoDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param hot_cache_period: -
        :param soft_delete_period: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoDatabaseConfig(
            cluster_name=cluster_name,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            hot_cache_period=hot_cache_period,
            soft_delete_period=soft_delete_period,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetHotCachePeriod")
    def reset_hot_cache_period(self) -> None:
        return jsii.invoke(self, "resetHotCachePeriod", [])

    @jsii.member(jsii_name="resetSoftDeletePeriod")
    def reset_soft_delete_period(self) -> None:
        return jsii.invoke(self, "resetSoftDeletePeriod", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterNameInput")
    def cluster_name_input(self) -> builtins.str:
        return jsii.get(self, "clusterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hotCachePeriodInput")
    def hot_cache_period_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "hotCachePeriodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeletePeriodInput")
    def soft_delete_period_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "softDeletePeriodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KustoDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterName")
    def cluster_name(self) -> builtins.str:
        return jsii.get(self, "clusterName")

    @cluster_name.setter # type: ignore
    def cluster_name(self, value: builtins.str) -> None:
        jsii.set(self, "clusterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hotCachePeriod")
    def hot_cache_period(self) -> builtins.str:
        return jsii.get(self, "hotCachePeriod")

    @hot_cache_period.setter # type: ignore
    def hot_cache_period(self, value: builtins.str) -> None:
        jsii.set(self, "hotCachePeriod", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeletePeriod")
    def soft_delete_period(self) -> builtins.str:
        return jsii.get(self, "softDeletePeriod")

    @soft_delete_period.setter # type: ignore
    def soft_delete_period(self, value: builtins.str) -> None:
        jsii.set(self, "softDeletePeriod", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KustoDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_name": "clusterName",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "hot_cache_period": "hotCachePeriod",
        "soft_delete_period": "softDeletePeriod",
        "timeouts": "timeouts",
    },
)
class KustoDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        hot_cache_period: typing.Optional[builtins.str] = None,
        soft_delete_period: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KustoDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param hot_cache_period: -
        :param soft_delete_period: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_name": cluster_name,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if hot_cache_period is not None:
            self._values["hot_cache_period"] = hot_cache_period
        if soft_delete_period is not None:
            self._values["soft_delete_period"] = soft_delete_period
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_name(self) -> builtins.str:
        result = self._values.get("cluster_name")
        assert result is not None, "Required property 'cluster_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def hot_cache_period(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hot_cache_period")
        return result

    @builtins.property
    def soft_delete_period(self) -> typing.Optional[builtins.str]:
        result = self._values.get("soft_delete_period")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KustoDatabasePrincipal(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoDatabasePrincipal",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        client_id: builtins.str,
        cluster_name: builtins.str,
        database_name: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        role: builtins.str,
        type: builtins.str,
        timeouts: typing.Optional["KustoDatabasePrincipalTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param client_id: -
        :param cluster_name: -
        :param database_name: -
        :param object_id: -
        :param resource_group_name: -
        :param role: -
        :param type: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoDatabasePrincipalConfig(
            client_id=client_id,
            cluster_name=cluster_name,
            database_name=database_name,
            object_id=object_id,
            resource_group_name=resource_group_name,
            role=role,
            type=type,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoDatabasePrincipal, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appId")
    def app_id(self) -> builtins.str:
        return jsii.get(self, "appId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterNameInput")
    def cluster_name_input(self) -> builtins.str:
        return jsii.get(self, "clusterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="email")
    def email(self) -> builtins.str:
        return jsii.get(self, "email")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fullyQualifiedName")
    def fully_qualified_name(self) -> builtins.str:
        return jsii.get(self, "fullyQualifiedName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectIdInput")
    def object_id_input(self) -> builtins.str:
        return jsii.get(self, "objectIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleInput")
    def role_input(self) -> builtins.str:
        return jsii.get(self, "roleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KustoDatabasePrincipalTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterName")
    def cluster_name(self) -> builtins.str:
        return jsii.get(self, "clusterName")

    @cluster_name.setter # type: ignore
    def cluster_name(self, value: builtins.str) -> None:
        jsii.set(self, "clusterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @object_id.setter # type: ignore
    def object_id(self, value: builtins.str) -> None:
        jsii.set(self, "objectId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="role")
    def role(self) -> builtins.str:
        return jsii.get(self, "role")

    @role.setter # type: ignore
    def role(self, value: builtins.str) -> None:
        jsii.set(self, "role", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoDatabasePrincipalTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoDatabasePrincipalTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


class KustoDatabasePrincipalAssignment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoDatabasePrincipalAssignment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        principal_id: builtins.str,
        principal_type: builtins.str,
        resource_group_name: builtins.str,
        role: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["KustoDatabasePrincipalAssignmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_name: -
        :param database_name: -
        :param name: -
        :param principal_id: -
        :param principal_type: -
        :param resource_group_name: -
        :param role: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoDatabasePrincipalAssignmentConfig(
            cluster_name=cluster_name,
            database_name=database_name,
            name=name,
            principal_id=principal_id,
            principal_type=principal_type,
            resource_group_name=resource_group_name,
            role=role,
            tenant_id=tenant_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoDatabasePrincipalAssignment, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterNameInput")
    def cluster_name_input(self) -> builtins.str:
        return jsii.get(self, "clusterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalIdInput")
    def principal_id_input(self) -> builtins.str:
        return jsii.get(self, "principalIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalName")
    def principal_name(self) -> builtins.str:
        return jsii.get(self, "principalName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalTypeInput")
    def principal_type_input(self) -> builtins.str:
        return jsii.get(self, "principalTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleInput")
    def role_input(self) -> builtins.str:
        return jsii.get(self, "roleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantName")
    def tenant_name(self) -> builtins.str:
        return jsii.get(self, "tenantName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["KustoDatabasePrincipalAssignmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterName")
    def cluster_name(self) -> builtins.str:
        return jsii.get(self, "clusterName")

    @cluster_name.setter # type: ignore
    def cluster_name(self, value: builtins.str) -> None:
        jsii.set(self, "clusterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @principal_id.setter # type: ignore
    def principal_id(self, value: builtins.str) -> None:
        jsii.set(self, "principalId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalType")
    def principal_type(self) -> builtins.str:
        return jsii.get(self, "principalType")

    @principal_type.setter # type: ignore
    def principal_type(self, value: builtins.str) -> None:
        jsii.set(self, "principalType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="role")
    def role(self) -> builtins.str:
        return jsii.get(self, "role")

    @role.setter # type: ignore
    def role(self, value: builtins.str) -> None:
        jsii.set(self, "role", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoDatabasePrincipalAssignmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoDatabasePrincipalAssignmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KustoDatabasePrincipalAssignmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_name": "clusterName",
        "database_name": "databaseName",
        "name": "name",
        "principal_id": "principalId",
        "principal_type": "principalType",
        "resource_group_name": "resourceGroupName",
        "role": "role",
        "tenant_id": "tenantId",
        "timeouts": "timeouts",
    },
)
class KustoDatabasePrincipalAssignmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_name: builtins.str,
        database_name: builtins.str,
        name: builtins.str,
        principal_id: builtins.str,
        principal_type: builtins.str,
        resource_group_name: builtins.str,
        role: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["KustoDatabasePrincipalAssignmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_name: -
        :param database_name: -
        :param name: -
        :param principal_id: -
        :param principal_type: -
        :param resource_group_name: -
        :param role: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoDatabasePrincipalAssignmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_name": cluster_name,
            "database_name": database_name,
            "name": name,
            "principal_id": principal_id,
            "principal_type": principal_type,
            "resource_group_name": resource_group_name,
            "role": role,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_name(self) -> builtins.str:
        result = self._values.get("cluster_name")
        assert result is not None, "Required property 'cluster_name' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def principal_id(self) -> builtins.str:
        result = self._values.get("principal_id")
        assert result is not None, "Required property 'principal_id' is missing"
        return result

    @builtins.property
    def principal_type(self) -> builtins.str:
        result = self._values.get("principal_type")
        assert result is not None, "Required property 'principal_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def role(self) -> builtins.str:
        result = self._values.get("role")
        assert result is not None, "Required property 'role' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoDatabasePrincipalAssignmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoDatabasePrincipalAssignmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoDatabasePrincipalAssignmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class KustoDatabasePrincipalAssignmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoDatabasePrincipalAssignmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoDatabasePrincipalConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "client_id": "clientId",
        "cluster_name": "clusterName",
        "database_name": "databaseName",
        "object_id": "objectId",
        "resource_group_name": "resourceGroupName",
        "role": "role",
        "type": "type",
        "timeouts": "timeouts",
    },
)
class KustoDatabasePrincipalConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        client_id: builtins.str,
        cluster_name: builtins.str,
        database_name: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        role: builtins.str,
        type: builtins.str,
        timeouts: typing.Optional["KustoDatabasePrincipalTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param client_id: -
        :param cluster_name: -
        :param database_name: -
        :param object_id: -
        :param resource_group_name: -
        :param role: -
        :param type: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoDatabasePrincipalTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "cluster_name": cluster_name,
            "database_name": database_name,
            "object_id": object_id,
            "resource_group_name": resource_group_name,
            "role": role,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def cluster_name(self) -> builtins.str:
        result = self._values.get("cluster_name")
        assert result is not None, "Required property 'cluster_name' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def object_id(self) -> builtins.str:
        result = self._values.get("object_id")
        assert result is not None, "Required property 'object_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def role(self) -> builtins.str:
        result = self._values.get("role")
        assert result is not None, "Required property 'role' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoDatabasePrincipalTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoDatabasePrincipalConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoDatabasePrincipalTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KustoDatabasePrincipalTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoDatabasePrincipalTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KustoDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class KustoEventhubDataConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.KustoEventhubDataConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        cluster_name: builtins.str,
        consumer_group: builtins.str,
        database_name: builtins.str,
        eventhub_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        compression: typing.Optional[builtins.str] = None,
        data_format: typing.Optional[builtins.str] = None,
        mapping_rule_name: typing.Optional[builtins.str] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KustoEventhubDataConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_name: -
        :param consumer_group: -
        :param database_name: -
        :param eventhub_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param compression: -
        :param data_format: -
        :param mapping_rule_name: -
        :param table_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KustoEventhubDataConnectionConfig(
            cluster_name=cluster_name,
            consumer_group=consumer_group,
            database_name=database_name,
            eventhub_id=eventhub_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            compression=compression,
            data_format=data_format,
            mapping_rule_name=mapping_rule_name,
            table_name=table_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(KustoEventhubDataConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetCompression")
    def reset_compression(self) -> None:
        return jsii.invoke(self, "resetCompression", [])

    @jsii.member(jsii_name="resetDataFormat")
    def reset_data_format(self) -> None:
        return jsii.invoke(self, "resetDataFormat", [])

    @jsii.member(jsii_name="resetMappingRuleName")
    def reset_mapping_rule_name(self) -> None:
        return jsii.invoke(self, "resetMappingRuleName", [])

    @jsii.member(jsii_name="resetTableName")
    def reset_table_name(self) -> None:
        return jsii.invoke(self, "resetTableName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterNameInput")
    def cluster_name_input(self) -> builtins.str:
        return jsii.get(self, "clusterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="consumerGroupInput")
    def consumer_group_input(self) -> builtins.str:
        return jsii.get(self, "consumerGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubIdInput")
    def eventhub_id_input(self) -> builtins.str:
        return jsii.get(self, "eventhubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="compressionInput")
    def compression_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "compressionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFormatInput")
    def data_format_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dataFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mappingRuleNameInput")
    def mapping_rule_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "mappingRuleNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNameInput")
    def table_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tableNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["KustoEventhubDataConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterName")
    def cluster_name(self) -> builtins.str:
        return jsii.get(self, "clusterName")

    @cluster_name.setter # type: ignore
    def cluster_name(self, value: builtins.str) -> None:
        jsii.set(self, "clusterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="compression")
    def compression(self) -> builtins.str:
        return jsii.get(self, "compression")

    @compression.setter # type: ignore
    def compression(self, value: builtins.str) -> None:
        jsii.set(self, "compression", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="consumerGroup")
    def consumer_group(self) -> builtins.str:
        return jsii.get(self, "consumerGroup")

    @consumer_group.setter # type: ignore
    def consumer_group(self, value: builtins.str) -> None:
        jsii.set(self, "consumerGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataFormat")
    def data_format(self) -> builtins.str:
        return jsii.get(self, "dataFormat")

    @data_format.setter # type: ignore
    def data_format(self, value: builtins.str) -> None:
        jsii.set(self, "dataFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubId")
    def eventhub_id(self) -> builtins.str:
        return jsii.get(self, "eventhubId")

    @eventhub_id.setter # type: ignore
    def eventhub_id(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mappingRuleName")
    def mapping_rule_name(self) -> builtins.str:
        return jsii.get(self, "mappingRuleName")

    @mapping_rule_name.setter # type: ignore
    def mapping_rule_name(self, value: builtins.str) -> None:
        jsii.set(self, "mappingRuleName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableName")
    def table_name(self) -> builtins.str:
        return jsii.get(self, "tableName")

    @table_name.setter # type: ignore
    def table_name(self, value: builtins.str) -> None:
        jsii.set(self, "tableName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "KustoEventhubDataConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "KustoEventhubDataConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.KustoEventhubDataConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "cluster_name": "clusterName",
        "consumer_group": "consumerGroup",
        "database_name": "databaseName",
        "eventhub_id": "eventhubId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "compression": "compression",
        "data_format": "dataFormat",
        "mapping_rule_name": "mappingRuleName",
        "table_name": "tableName",
        "timeouts": "timeouts",
    },
)
class KustoEventhubDataConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        cluster_name: builtins.str,
        consumer_group: builtins.str,
        database_name: builtins.str,
        eventhub_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        compression: typing.Optional[builtins.str] = None,
        data_format: typing.Optional[builtins.str] = None,
        mapping_rule_name: typing.Optional[builtins.str] = None,
        table_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["KustoEventhubDataConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_name: -
        :param consumer_group: -
        :param database_name: -
        :param eventhub_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param compression: -
        :param data_format: -
        :param mapping_rule_name: -
        :param table_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = KustoEventhubDataConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "cluster_name": cluster_name,
            "consumer_group": consumer_group,
            "database_name": database_name,
            "eventhub_id": eventhub_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if compression is not None:
            self._values["compression"] = compression
        if data_format is not None:
            self._values["data_format"] = data_format
        if mapping_rule_name is not None:
            self._values["mapping_rule_name"] = mapping_rule_name
        if table_name is not None:
            self._values["table_name"] = table_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def cluster_name(self) -> builtins.str:
        result = self._values.get("cluster_name")
        assert result is not None, "Required property 'cluster_name' is missing"
        return result

    @builtins.property
    def consumer_group(self) -> builtins.str:
        result = self._values.get("consumer_group")
        assert result is not None, "Required property 'consumer_group' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def eventhub_id(self) -> builtins.str:
        result = self._values.get("eventhub_id")
        assert result is not None, "Required property 'eventhub_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def compression(self) -> typing.Optional[builtins.str]:
        result = self._values.get("compression")
        return result

    @builtins.property
    def data_format(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data_format")
        return result

    @builtins.property
    def mapping_rule_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("mapping_rule_name")
        return result

    @builtins.property
    def table_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("table_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["KustoEventhubDataConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoEventhubDataConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.KustoEventhubDataConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class KustoEventhubDataConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "KustoEventhubDataConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Lb(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="azurerm.Lb"):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        frontend_ip_configuration: typing.Optional[typing.List["LbFrontendIpConfiguration"]] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LbTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param frontend_ip_configuration: frontend_ip_configuration block.
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LbConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            frontend_ip_configuration=frontend_ip_configuration,
            sku=sku,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Lb, self, [scope, id, config])

    @jsii.member(jsii_name="resetFrontendIpConfiguration")
    def reset_frontend_ip_configuration(self) -> None:
        return jsii.invoke(self, "resetFrontendIpConfiguration", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationInput")
    def frontend_ip_configuration_input(
        self,
    ) -> typing.Optional[typing.List["LbFrontendIpConfiguration"]]:
        return jsii.get(self, "frontendIpConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LbTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfiguration")
    def frontend_ip_configuration(self) -> typing.List["LbFrontendIpConfiguration"]:
        return jsii.get(self, "frontendIpConfiguration")

    @frontend_ip_configuration.setter # type: ignore
    def frontend_ip_configuration(
        self,
        value: typing.List["LbFrontendIpConfiguration"],
    ) -> None:
        jsii.set(self, "frontendIpConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LbTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LbTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class LbBackendAddressPool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LbBackendAddressPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["LbBackendAddressPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param loadbalancer_id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LbBackendAddressPoolConfig(
            loadbalancer_id=loadbalancer_id,
            name=name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LbBackendAddressPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendIpConfigurations")
    def backend_ip_configurations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "backendIpConfigurations")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancingRules")
    def load_balancing_rules(self) -> typing.List[builtins.str]:
        return jsii.get(self, "loadBalancingRules")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LbBackendAddressPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LbBackendAddressPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LbBackendAddressPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LbBackendAddressPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class LbBackendAddressPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["LbBackendAddressPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param loadbalancer_id: -
        :param name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LbBackendAddressPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "loadbalancer_id": loadbalancer_id,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LbBackendAddressPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbBackendAddressPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbBackendAddressPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LbBackendAddressPoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbBackendAddressPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "frontend_ip_configuration": "frontendIpConfiguration",
        "sku": "sku",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LbConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        frontend_ip_configuration: typing.Optional[typing.List["LbFrontendIpConfiguration"]] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LbTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param frontend_ip_configuration: frontend_ip_configuration block.
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LbTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if frontend_ip_configuration is not None:
            self._values["frontend_ip_configuration"] = frontend_ip_configuration
        if sku is not None:
            self._values["sku"] = sku
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def frontend_ip_configuration(
        self,
    ) -> typing.Optional[typing.List["LbFrontendIpConfiguration"]]:
        """frontend_ip_configuration block."""
        result = self._values.get("frontend_ip_configuration")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LbTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbFrontendIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "private_ip_address": "privateIpAddress",
        "private_ip_address_allocation": "privateIpAddressAllocation",
        "private_ip_address_version": "privateIpAddressVersion",
        "public_ip_address_id": "publicIpAddressId",
        "public_ip_prefix_id": "publicIpPrefixId",
        "subnet_id": "subnetId",
        "zones": "zones",
    },
)
class LbFrontendIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        private_ip_address: typing.Optional[builtins.str] = None,
        private_ip_address_allocation: typing.Optional[builtins.str] = None,
        private_ip_address_version: typing.Optional[builtins.str] = None,
        public_ip_address_id: typing.Optional[builtins.str] = None,
        public_ip_prefix_id: typing.Optional[builtins.str] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param private_ip_address: -
        :param private_ip_address_allocation: -
        :param private_ip_address_version: -
        :param public_ip_address_id: -
        :param public_ip_prefix_id: -
        :param subnet_id: -
        :param zones: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if private_ip_address is not None:
            self._values["private_ip_address"] = private_ip_address
        if private_ip_address_allocation is not None:
            self._values["private_ip_address_allocation"] = private_ip_address_allocation
        if private_ip_address_version is not None:
            self._values["private_ip_address_version"] = private_ip_address_version
        if public_ip_address_id is not None:
            self._values["public_ip_address_id"] = public_ip_address_id
        if public_ip_prefix_id is not None:
            self._values["public_ip_prefix_id"] = public_ip_prefix_id
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def private_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address")
        return result

    @builtins.property
    def private_ip_address_allocation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address_allocation")
        return result

    @builtins.property
    def private_ip_address_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address_version")
        return result

    @builtins.property
    def public_ip_address_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_address_id")
        return result

    @builtins.property
    def public_ip_prefix_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_prefix_id")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbFrontendIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LbNatPool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LbNatPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_port: jsii.Number,
        frontend_ip_configuration_name: builtins.str,
        frontend_port_end: jsii.Number,
        frontend_port_start: jsii.Number,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["LbNatPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_port: -
        :param frontend_ip_configuration_name: -
        :param frontend_port_end: -
        :param frontend_port_start: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LbNatPoolConfig(
            backend_port=backend_port,
            frontend_ip_configuration_name=frontend_ip_configuration_name,
            frontend_port_end=frontend_port_end,
            frontend_port_start=frontend_port_start,
            loadbalancer_id=loadbalancer_id,
            name=name,
            protocol=protocol,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LbNatPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPortInput")
    def backend_port_input(self) -> jsii.Number:
        return jsii.get(self, "backendPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationId")
    def frontend_ip_configuration_id(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationNameInput")
    def frontend_ip_configuration_name_input(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPortEndInput")
    def frontend_port_end_input(self) -> jsii.Number:
        return jsii.get(self, "frontendPortEndInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPortStartInput")
    def frontend_port_start_input(self) -> jsii.Number:
        return jsii.get(self, "frontendPortStartInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolInput")
    def protocol_input(self) -> builtins.str:
        return jsii.get(self, "protocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LbNatPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPort")
    def backend_port(self) -> jsii.Number:
        return jsii.get(self, "backendPort")

    @backend_port.setter # type: ignore
    def backend_port(self, value: jsii.Number) -> None:
        jsii.set(self, "backendPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationName")
    def frontend_ip_configuration_name(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationName")

    @frontend_ip_configuration_name.setter # type: ignore
    def frontend_ip_configuration_name(self, value: builtins.str) -> None:
        jsii.set(self, "frontendIpConfigurationName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPortEnd")
    def frontend_port_end(self) -> jsii.Number:
        return jsii.get(self, "frontendPortEnd")

    @frontend_port_end.setter # type: ignore
    def frontend_port_end(self, value: jsii.Number) -> None:
        jsii.set(self, "frontendPortEnd", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPortStart")
    def frontend_port_start(self) -> jsii.Number:
        return jsii.get(self, "frontendPortStart")

    @frontend_port_start.setter # type: ignore
    def frontend_port_start(self, value: jsii.Number) -> None:
        jsii.set(self, "frontendPortStart", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @protocol.setter # type: ignore
    def protocol(self, value: builtins.str) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LbNatPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LbNatPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LbNatPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_port": "backendPort",
        "frontend_ip_configuration_name": "frontendIpConfigurationName",
        "frontend_port_end": "frontendPortEnd",
        "frontend_port_start": "frontendPortStart",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "protocol": "protocol",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class LbNatPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_port: jsii.Number,
        frontend_ip_configuration_name: builtins.str,
        frontend_port_end: jsii.Number,
        frontend_port_start: jsii.Number,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["LbNatPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_port: -
        :param frontend_ip_configuration_name: -
        :param frontend_port_end: -
        :param frontend_port_start: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LbNatPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_port": backend_port,
            "frontend_ip_configuration_name": frontend_ip_configuration_name,
            "frontend_port_end": frontend_port_end,
            "frontend_port_start": frontend_port_start,
            "loadbalancer_id": loadbalancer_id,
            "name": name,
            "protocol": protocol,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_port(self) -> jsii.Number:
        result = self._values.get("backend_port")
        assert result is not None, "Required property 'backend_port' is missing"
        return result

    @builtins.property
    def frontend_ip_configuration_name(self) -> builtins.str:
        result = self._values.get("frontend_ip_configuration_name")
        assert result is not None, "Required property 'frontend_ip_configuration_name' is missing"
        return result

    @builtins.property
    def frontend_port_end(self) -> jsii.Number:
        result = self._values.get("frontend_port_end")
        assert result is not None, "Required property 'frontend_port_end' is missing"
        return result

    @builtins.property
    def frontend_port_start(self) -> jsii.Number:
        result = self._values.get("frontend_port_start")
        assert result is not None, "Required property 'frontend_port_start' is missing"
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LbNatPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbNatPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbNatPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LbNatPoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbNatPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LbNatRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LbNatRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_port: jsii.Number,
        frontend_ip_configuration_name: builtins.str,
        frontend_port: jsii.Number,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        enable_floating_ip: typing.Optional[builtins.bool] = None,
        enable_tcp_reset: typing.Optional[builtins.bool] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["LbNatRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_port: -
        :param frontend_ip_configuration_name: -
        :param frontend_port: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param enable_floating_ip: -
        :param enable_tcp_reset: -
        :param idle_timeout_in_minutes: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LbNatRuleConfig(
            backend_port=backend_port,
            frontend_ip_configuration_name=frontend_ip_configuration_name,
            frontend_port=frontend_port,
            loadbalancer_id=loadbalancer_id,
            name=name,
            protocol=protocol,
            resource_group_name=resource_group_name,
            enable_floating_ip=enable_floating_ip,
            enable_tcp_reset=enable_tcp_reset,
            idle_timeout_in_minutes=idle_timeout_in_minutes,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LbNatRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnableFloatingIp")
    def reset_enable_floating_ip(self) -> None:
        return jsii.invoke(self, "resetEnableFloatingIp", [])

    @jsii.member(jsii_name="resetEnableTcpReset")
    def reset_enable_tcp_reset(self) -> None:
        return jsii.invoke(self, "resetEnableTcpReset", [])

    @jsii.member(jsii_name="resetIdleTimeoutInMinutes")
    def reset_idle_timeout_in_minutes(self) -> None:
        return jsii.invoke(self, "resetIdleTimeoutInMinutes", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendIpConfigurationId")
    def backend_ip_configuration_id(self) -> builtins.str:
        return jsii.get(self, "backendIpConfigurationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPortInput")
    def backend_port_input(self) -> jsii.Number:
        return jsii.get(self, "backendPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationId")
    def frontend_ip_configuration_id(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationNameInput")
    def frontend_ip_configuration_name_input(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPortInput")
    def frontend_port_input(self) -> jsii.Number:
        return jsii.get(self, "frontendPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolInput")
    def protocol_input(self) -> builtins.str:
        return jsii.get(self, "protocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFloatingIpInput")
    def enable_floating_ip_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableFloatingIpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableTcpResetInput")
    def enable_tcp_reset_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableTcpResetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutesInput")
    def idle_timeout_in_minutes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "idleTimeoutInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LbNatRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPort")
    def backend_port(self) -> jsii.Number:
        return jsii.get(self, "backendPort")

    @backend_port.setter # type: ignore
    def backend_port(self, value: jsii.Number) -> None:
        jsii.set(self, "backendPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFloatingIp")
    def enable_floating_ip(self) -> builtins.bool:
        return jsii.get(self, "enableFloatingIp")

    @enable_floating_ip.setter # type: ignore
    def enable_floating_ip(self, value: builtins.bool) -> None:
        jsii.set(self, "enableFloatingIp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableTcpReset")
    def enable_tcp_reset(self) -> builtins.bool:
        return jsii.get(self, "enableTcpReset")

    @enable_tcp_reset.setter # type: ignore
    def enable_tcp_reset(self, value: builtins.bool) -> None:
        jsii.set(self, "enableTcpReset", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationName")
    def frontend_ip_configuration_name(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationName")

    @frontend_ip_configuration_name.setter # type: ignore
    def frontend_ip_configuration_name(self, value: builtins.str) -> None:
        jsii.set(self, "frontendIpConfigurationName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPort")
    def frontend_port(self) -> jsii.Number:
        return jsii.get(self, "frontendPort")

    @frontend_port.setter # type: ignore
    def frontend_port(self, value: jsii.Number) -> None:
        jsii.set(self, "frontendPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @idle_timeout_in_minutes.setter # type: ignore
    def idle_timeout_in_minutes(self, value: jsii.Number) -> None:
        jsii.set(self, "idleTimeoutInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @protocol.setter # type: ignore
    def protocol(self, value: builtins.str) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LbNatRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LbNatRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LbNatRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_port": "backendPort",
        "frontend_ip_configuration_name": "frontendIpConfigurationName",
        "frontend_port": "frontendPort",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "protocol": "protocol",
        "resource_group_name": "resourceGroupName",
        "enable_floating_ip": "enableFloatingIp",
        "enable_tcp_reset": "enableTcpReset",
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "timeouts": "timeouts",
    },
)
class LbNatRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_port: jsii.Number,
        frontend_ip_configuration_name: builtins.str,
        frontend_port: jsii.Number,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        enable_floating_ip: typing.Optional[builtins.bool] = None,
        enable_tcp_reset: typing.Optional[builtins.bool] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["LbNatRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_port: -
        :param frontend_ip_configuration_name: -
        :param frontend_port: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param enable_floating_ip: -
        :param enable_tcp_reset: -
        :param idle_timeout_in_minutes: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LbNatRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_port": backend_port,
            "frontend_ip_configuration_name": frontend_ip_configuration_name,
            "frontend_port": frontend_port,
            "loadbalancer_id": loadbalancer_id,
            "name": name,
            "protocol": protocol,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enable_floating_ip is not None:
            self._values["enable_floating_ip"] = enable_floating_ip
        if enable_tcp_reset is not None:
            self._values["enable_tcp_reset"] = enable_tcp_reset
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_port(self) -> jsii.Number:
        result = self._values.get("backend_port")
        assert result is not None, "Required property 'backend_port' is missing"
        return result

    @builtins.property
    def frontend_ip_configuration_name(self) -> builtins.str:
        result = self._values.get("frontend_ip_configuration_name")
        assert result is not None, "Required property 'frontend_ip_configuration_name' is missing"
        return result

    @builtins.property
    def frontend_port(self) -> jsii.Number:
        result = self._values.get("frontend_port")
        assert result is not None, "Required property 'frontend_port' is missing"
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def enable_floating_ip(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_floating_ip")
        return result

    @builtins.property
    def enable_tcp_reset(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_tcp_reset")
        return result

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LbNatRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbNatRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbNatRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LbNatRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbNatRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LbOutboundRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LbOutboundRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_address_pool_id: builtins.str,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        allocated_outbound_ports: typing.Optional[jsii.Number] = None,
        enable_tcp_reset: typing.Optional[builtins.bool] = None,
        frontend_ip_configuration: typing.Optional[typing.List["LbOutboundRuleFrontendIpConfiguration"]] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["LbOutboundRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_address_pool_id: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param allocated_outbound_ports: -
        :param enable_tcp_reset: -
        :param frontend_ip_configuration: frontend_ip_configuration block.
        :param idle_timeout_in_minutes: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LbOutboundRuleConfig(
            backend_address_pool_id=backend_address_pool_id,
            loadbalancer_id=loadbalancer_id,
            name=name,
            protocol=protocol,
            resource_group_name=resource_group_name,
            allocated_outbound_ports=allocated_outbound_ports,
            enable_tcp_reset=enable_tcp_reset,
            frontend_ip_configuration=frontend_ip_configuration,
            idle_timeout_in_minutes=idle_timeout_in_minutes,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LbOutboundRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllocatedOutboundPorts")
    def reset_allocated_outbound_ports(self) -> None:
        return jsii.invoke(self, "resetAllocatedOutboundPorts", [])

    @jsii.member(jsii_name="resetEnableTcpReset")
    def reset_enable_tcp_reset(self) -> None:
        return jsii.invoke(self, "resetEnableTcpReset", [])

    @jsii.member(jsii_name="resetFrontendIpConfiguration")
    def reset_frontend_ip_configuration(self) -> None:
        return jsii.invoke(self, "resetFrontendIpConfiguration", [])

    @jsii.member(jsii_name="resetIdleTimeoutInMinutes")
    def reset_idle_timeout_in_minutes(self) -> None:
        return jsii.invoke(self, "resetIdleTimeoutInMinutes", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolIdInput")
    def backend_address_pool_id_input(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolInput")
    def protocol_input(self) -> builtins.str:
        return jsii.get(self, "protocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocatedOutboundPortsInput")
    def allocated_outbound_ports_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "allocatedOutboundPortsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableTcpResetInput")
    def enable_tcp_reset_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableTcpResetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationInput")
    def frontend_ip_configuration_input(
        self,
    ) -> typing.Optional[typing.List["LbOutboundRuleFrontendIpConfiguration"]]:
        return jsii.get(self, "frontendIpConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutesInput")
    def idle_timeout_in_minutes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "idleTimeoutInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LbOutboundRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocatedOutboundPorts")
    def allocated_outbound_ports(self) -> jsii.Number:
        return jsii.get(self, "allocatedOutboundPorts")

    @allocated_outbound_ports.setter # type: ignore
    def allocated_outbound_ports(self, value: jsii.Number) -> None:
        jsii.set(self, "allocatedOutboundPorts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolId")
    def backend_address_pool_id(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolId")

    @backend_address_pool_id.setter # type: ignore
    def backend_address_pool_id(self, value: builtins.str) -> None:
        jsii.set(self, "backendAddressPoolId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableTcpReset")
    def enable_tcp_reset(self) -> builtins.bool:
        return jsii.get(self, "enableTcpReset")

    @enable_tcp_reset.setter # type: ignore
    def enable_tcp_reset(self, value: builtins.bool) -> None:
        jsii.set(self, "enableTcpReset", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfiguration")
    def frontend_ip_configuration(
        self,
    ) -> typing.List["LbOutboundRuleFrontendIpConfiguration"]:
        return jsii.get(self, "frontendIpConfiguration")

    @frontend_ip_configuration.setter # type: ignore
    def frontend_ip_configuration(
        self,
        value: typing.List["LbOutboundRuleFrontendIpConfiguration"],
    ) -> None:
        jsii.set(self, "frontendIpConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @idle_timeout_in_minutes.setter # type: ignore
    def idle_timeout_in_minutes(self, value: jsii.Number) -> None:
        jsii.set(self, "idleTimeoutInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @protocol.setter # type: ignore
    def protocol(self, value: builtins.str) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LbOutboundRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LbOutboundRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LbOutboundRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_address_pool_id": "backendAddressPoolId",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "protocol": "protocol",
        "resource_group_name": "resourceGroupName",
        "allocated_outbound_ports": "allocatedOutboundPorts",
        "enable_tcp_reset": "enableTcpReset",
        "frontend_ip_configuration": "frontendIpConfiguration",
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "timeouts": "timeouts",
    },
)
class LbOutboundRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_address_pool_id: builtins.str,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        allocated_outbound_ports: typing.Optional[jsii.Number] = None,
        enable_tcp_reset: typing.Optional[builtins.bool] = None,
        frontend_ip_configuration: typing.Optional[typing.List["LbOutboundRuleFrontendIpConfiguration"]] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["LbOutboundRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_address_pool_id: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param allocated_outbound_ports: -
        :param enable_tcp_reset: -
        :param frontend_ip_configuration: frontend_ip_configuration block.
        :param idle_timeout_in_minutes: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LbOutboundRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_address_pool_id": backend_address_pool_id,
            "loadbalancer_id": loadbalancer_id,
            "name": name,
            "protocol": protocol,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allocated_outbound_ports is not None:
            self._values["allocated_outbound_ports"] = allocated_outbound_ports
        if enable_tcp_reset is not None:
            self._values["enable_tcp_reset"] = enable_tcp_reset
        if frontend_ip_configuration is not None:
            self._values["frontend_ip_configuration"] = frontend_ip_configuration
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_address_pool_id(self) -> builtins.str:
        result = self._values.get("backend_address_pool_id")
        assert result is not None, "Required property 'backend_address_pool_id' is missing"
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def allocated_outbound_ports(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("allocated_outbound_ports")
        return result

    @builtins.property
    def enable_tcp_reset(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_tcp_reset")
        return result

    @builtins.property
    def frontend_ip_configuration(
        self,
    ) -> typing.Optional[typing.List["LbOutboundRuleFrontendIpConfiguration"]]:
        """frontend_ip_configuration block."""
        result = self._values.get("frontend_ip_configuration")
        return result

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LbOutboundRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbOutboundRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbOutboundRuleFrontendIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={"name": "name"},
)
class LbOutboundRuleFrontendIpConfiguration:
    def __init__(self, *, name: builtins.str) -> None:
        """
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbOutboundRuleFrontendIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbOutboundRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LbOutboundRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbOutboundRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LbProbe(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LbProbe",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        port: jsii.Number,
        resource_group_name: builtins.str,
        interval_in_seconds: typing.Optional[jsii.Number] = None,
        number_of_probes: typing.Optional[jsii.Number] = None,
        protocol: typing.Optional[builtins.str] = None,
        request_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LbProbeTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param loadbalancer_id: -
        :param name: -
        :param port: -
        :param resource_group_name: -
        :param interval_in_seconds: -
        :param number_of_probes: -
        :param protocol: -
        :param request_path: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LbProbeConfig(
            loadbalancer_id=loadbalancer_id,
            name=name,
            port=port,
            resource_group_name=resource_group_name,
            interval_in_seconds=interval_in_seconds,
            number_of_probes=number_of_probes,
            protocol=protocol,
            request_path=request_path,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LbProbe, self, [scope, id, config])

    @jsii.member(jsii_name="resetIntervalInSeconds")
    def reset_interval_in_seconds(self) -> None:
        return jsii.invoke(self, "resetIntervalInSeconds", [])

    @jsii.member(jsii_name="resetNumberOfProbes")
    def reset_number_of_probes(self) -> None:
        return jsii.invoke(self, "resetNumberOfProbes", [])

    @jsii.member(jsii_name="resetProtocol")
    def reset_protocol(self) -> None:
        return jsii.invoke(self, "resetProtocol", [])

    @jsii.member(jsii_name="resetRequestPath")
    def reset_request_path(self) -> None:
        return jsii.invoke(self, "resetRequestPath", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerRules")
    def load_balancer_rules(self) -> typing.List[builtins.str]:
        return jsii.get(self, "loadBalancerRules")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portInput")
    def port_input(self) -> jsii.Number:
        return jsii.get(self, "portInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInSecondsInput")
    def interval_in_seconds_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "intervalInSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfProbesInput")
    def number_of_probes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "numberOfProbesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolInput")
    def protocol_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "protocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestPathInput")
    def request_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "requestPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LbProbeTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInSeconds")
    def interval_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "intervalInSeconds")

    @interval_in_seconds.setter # type: ignore
    def interval_in_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "intervalInSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfProbes")
    def number_of_probes(self) -> jsii.Number:
        return jsii.get(self, "numberOfProbes")

    @number_of_probes.setter # type: ignore
    def number_of_probes(self, value: jsii.Number) -> None:
        jsii.set(self, "numberOfProbes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @port.setter # type: ignore
    def port(self, value: jsii.Number) -> None:
        jsii.set(self, "port", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @protocol.setter # type: ignore
    def protocol(self, value: builtins.str) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestPath")
    def request_path(self) -> builtins.str:
        return jsii.get(self, "requestPath")

    @request_path.setter # type: ignore
    def request_path(self, value: builtins.str) -> None:
        jsii.set(self, "requestPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LbProbeTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LbProbeTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LbProbeConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "port": "port",
        "resource_group_name": "resourceGroupName",
        "interval_in_seconds": "intervalInSeconds",
        "number_of_probes": "numberOfProbes",
        "protocol": "protocol",
        "request_path": "requestPath",
        "timeouts": "timeouts",
    },
)
class LbProbeConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        port: jsii.Number,
        resource_group_name: builtins.str,
        interval_in_seconds: typing.Optional[jsii.Number] = None,
        number_of_probes: typing.Optional[jsii.Number] = None,
        protocol: typing.Optional[builtins.str] = None,
        request_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LbProbeTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param loadbalancer_id: -
        :param name: -
        :param port: -
        :param resource_group_name: -
        :param interval_in_seconds: -
        :param number_of_probes: -
        :param protocol: -
        :param request_path: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LbProbeTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "loadbalancer_id": loadbalancer_id,
            "name": name,
            "port": port,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if interval_in_seconds is not None:
            self._values["interval_in_seconds"] = interval_in_seconds
        if number_of_probes is not None:
            self._values["number_of_probes"] = number_of_probes
        if protocol is not None:
            self._values["protocol"] = protocol
        if request_path is not None:
            self._values["request_path"] = request_path
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def interval_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval_in_seconds")
        return result

    @builtins.property
    def number_of_probes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("number_of_probes")
        return result

    @builtins.property
    def protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protocol")
        return result

    @builtins.property
    def request_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("request_path")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LbProbeTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbProbeConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbProbeTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LbProbeTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbProbeTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LbRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LbRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_port: jsii.Number,
        frontend_ip_configuration_name: builtins.str,
        frontend_port: jsii.Number,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        backend_address_pool_id: typing.Optional[builtins.str] = None,
        disable_outbound_snat: typing.Optional[builtins.bool] = None,
        enable_floating_ip: typing.Optional[builtins.bool] = None,
        enable_tcp_reset: typing.Optional[builtins.bool] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        load_distribution: typing.Optional[builtins.str] = None,
        probe_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LbRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_port: -
        :param frontend_ip_configuration_name: -
        :param frontend_port: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param backend_address_pool_id: -
        :param disable_outbound_snat: -
        :param enable_floating_ip: -
        :param enable_tcp_reset: -
        :param idle_timeout_in_minutes: -
        :param load_distribution: -
        :param probe_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LbRuleConfig(
            backend_port=backend_port,
            frontend_ip_configuration_name=frontend_ip_configuration_name,
            frontend_port=frontend_port,
            loadbalancer_id=loadbalancer_id,
            name=name,
            protocol=protocol,
            resource_group_name=resource_group_name,
            backend_address_pool_id=backend_address_pool_id,
            disable_outbound_snat=disable_outbound_snat,
            enable_floating_ip=enable_floating_ip,
            enable_tcp_reset=enable_tcp_reset,
            idle_timeout_in_minutes=idle_timeout_in_minutes,
            load_distribution=load_distribution,
            probe_id=probe_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LbRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetBackendAddressPoolId")
    def reset_backend_address_pool_id(self) -> None:
        return jsii.invoke(self, "resetBackendAddressPoolId", [])

    @jsii.member(jsii_name="resetDisableOutboundSnat")
    def reset_disable_outbound_snat(self) -> None:
        return jsii.invoke(self, "resetDisableOutboundSnat", [])

    @jsii.member(jsii_name="resetEnableFloatingIp")
    def reset_enable_floating_ip(self) -> None:
        return jsii.invoke(self, "resetEnableFloatingIp", [])

    @jsii.member(jsii_name="resetEnableTcpReset")
    def reset_enable_tcp_reset(self) -> None:
        return jsii.invoke(self, "resetEnableTcpReset", [])

    @jsii.member(jsii_name="resetIdleTimeoutInMinutes")
    def reset_idle_timeout_in_minutes(self) -> None:
        return jsii.invoke(self, "resetIdleTimeoutInMinutes", [])

    @jsii.member(jsii_name="resetLoadDistribution")
    def reset_load_distribution(self) -> None:
        return jsii.invoke(self, "resetLoadDistribution", [])

    @jsii.member(jsii_name="resetProbeId")
    def reset_probe_id(self) -> None:
        return jsii.invoke(self, "resetProbeId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPortInput")
    def backend_port_input(self) -> jsii.Number:
        return jsii.get(self, "backendPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationId")
    def frontend_ip_configuration_id(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationNameInput")
    def frontend_ip_configuration_name_input(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPortInput")
    def frontend_port_input(self) -> jsii.Number:
        return jsii.get(self, "frontendPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerIdInput")
    def loadbalancer_id_input(self) -> builtins.str:
        return jsii.get(self, "loadbalancerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolInput")
    def protocol_input(self) -> builtins.str:
        return jsii.get(self, "protocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolIdInput")
    def backend_address_pool_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "backendAddressPoolIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableOutboundSnatInput")
    def disable_outbound_snat_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableOutboundSnatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFloatingIpInput")
    def enable_floating_ip_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableFloatingIpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableTcpResetInput")
    def enable_tcp_reset_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableTcpResetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutesInput")
    def idle_timeout_in_minutes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "idleTimeoutInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadDistributionInput")
    def load_distribution_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "loadDistributionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="probeIdInput")
    def probe_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "probeIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LbRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolId")
    def backend_address_pool_id(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolId")

    @backend_address_pool_id.setter # type: ignore
    def backend_address_pool_id(self, value: builtins.str) -> None:
        jsii.set(self, "backendAddressPoolId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendPort")
    def backend_port(self) -> jsii.Number:
        return jsii.get(self, "backendPort")

    @backend_port.setter # type: ignore
    def backend_port(self, value: jsii.Number) -> None:
        jsii.set(self, "backendPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableOutboundSnat")
    def disable_outbound_snat(self) -> builtins.bool:
        return jsii.get(self, "disableOutboundSnat")

    @disable_outbound_snat.setter # type: ignore
    def disable_outbound_snat(self, value: builtins.bool) -> None:
        jsii.set(self, "disableOutboundSnat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableFloatingIp")
    def enable_floating_ip(self) -> builtins.bool:
        return jsii.get(self, "enableFloatingIp")

    @enable_floating_ip.setter # type: ignore
    def enable_floating_ip(self, value: builtins.bool) -> None:
        jsii.set(self, "enableFloatingIp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableTcpReset")
    def enable_tcp_reset(self) -> builtins.bool:
        return jsii.get(self, "enableTcpReset")

    @enable_tcp_reset.setter # type: ignore
    def enable_tcp_reset(self, value: builtins.bool) -> None:
        jsii.set(self, "enableTcpReset", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendIpConfigurationName")
    def frontend_ip_configuration_name(self) -> builtins.str:
        return jsii.get(self, "frontendIpConfigurationName")

    @frontend_ip_configuration_name.setter # type: ignore
    def frontend_ip_configuration_name(self, value: builtins.str) -> None:
        jsii.set(self, "frontendIpConfigurationName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frontendPort")
    def frontend_port(self) -> jsii.Number:
        return jsii.get(self, "frontendPort")

    @frontend_port.setter # type: ignore
    def frontend_port(self, value: jsii.Number) -> None:
        jsii.set(self, "frontendPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @idle_timeout_in_minutes.setter # type: ignore
    def idle_timeout_in_minutes(self, value: jsii.Number) -> None:
        jsii.set(self, "idleTimeoutInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadbalancerId")
    def loadbalancer_id(self) -> builtins.str:
        return jsii.get(self, "loadbalancerId")

    @loadbalancer_id.setter # type: ignore
    def loadbalancer_id(self, value: builtins.str) -> None:
        jsii.set(self, "loadbalancerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadDistribution")
    def load_distribution(self) -> builtins.str:
        return jsii.get(self, "loadDistribution")

    @load_distribution.setter # type: ignore
    def load_distribution(self, value: builtins.str) -> None:
        jsii.set(self, "loadDistribution", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="probeId")
    def probe_id(self) -> builtins.str:
        return jsii.get(self, "probeId")

    @probe_id.setter # type: ignore
    def probe_id(self, value: builtins.str) -> None:
        jsii.set(self, "probeId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @protocol.setter # type: ignore
    def protocol(self, value: builtins.str) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LbRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LbRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LbRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_port": "backendPort",
        "frontend_ip_configuration_name": "frontendIpConfigurationName",
        "frontend_port": "frontendPort",
        "loadbalancer_id": "loadbalancerId",
        "name": "name",
        "protocol": "protocol",
        "resource_group_name": "resourceGroupName",
        "backend_address_pool_id": "backendAddressPoolId",
        "disable_outbound_snat": "disableOutboundSnat",
        "enable_floating_ip": "enableFloatingIp",
        "enable_tcp_reset": "enableTcpReset",
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "load_distribution": "loadDistribution",
        "probe_id": "probeId",
        "timeouts": "timeouts",
    },
)
class LbRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_port: jsii.Number,
        frontend_ip_configuration_name: builtins.str,
        frontend_port: jsii.Number,
        loadbalancer_id: builtins.str,
        name: builtins.str,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        backend_address_pool_id: typing.Optional[builtins.str] = None,
        disable_outbound_snat: typing.Optional[builtins.bool] = None,
        enable_floating_ip: typing.Optional[builtins.bool] = None,
        enable_tcp_reset: typing.Optional[builtins.bool] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        load_distribution: typing.Optional[builtins.str] = None,
        probe_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LbRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_port: -
        :param frontend_ip_configuration_name: -
        :param frontend_port: -
        :param loadbalancer_id: -
        :param name: -
        :param protocol: -
        :param resource_group_name: -
        :param backend_address_pool_id: -
        :param disable_outbound_snat: -
        :param enable_floating_ip: -
        :param enable_tcp_reset: -
        :param idle_timeout_in_minutes: -
        :param load_distribution: -
        :param probe_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LbRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_port": backend_port,
            "frontend_ip_configuration_name": frontend_ip_configuration_name,
            "frontend_port": frontend_port,
            "loadbalancer_id": loadbalancer_id,
            "name": name,
            "protocol": protocol,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if backend_address_pool_id is not None:
            self._values["backend_address_pool_id"] = backend_address_pool_id
        if disable_outbound_snat is not None:
            self._values["disable_outbound_snat"] = disable_outbound_snat
        if enable_floating_ip is not None:
            self._values["enable_floating_ip"] = enable_floating_ip
        if enable_tcp_reset is not None:
            self._values["enable_tcp_reset"] = enable_tcp_reset
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if load_distribution is not None:
            self._values["load_distribution"] = load_distribution
        if probe_id is not None:
            self._values["probe_id"] = probe_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_port(self) -> jsii.Number:
        result = self._values.get("backend_port")
        assert result is not None, "Required property 'backend_port' is missing"
        return result

    @builtins.property
    def frontend_ip_configuration_name(self) -> builtins.str:
        result = self._values.get("frontend_ip_configuration_name")
        assert result is not None, "Required property 'frontend_ip_configuration_name' is missing"
        return result

    @builtins.property
    def frontend_port(self) -> jsii.Number:
        result = self._values.get("frontend_port")
        assert result is not None, "Required property 'frontend_port' is missing"
        return result

    @builtins.property
    def loadbalancer_id(self) -> builtins.str:
        result = self._values.get("loadbalancer_id")
        assert result is not None, "Required property 'loadbalancer_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def backend_address_pool_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("backend_address_pool_id")
        return result

    @builtins.property
    def disable_outbound_snat(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disable_outbound_snat")
        return result

    @builtins.property
    def enable_floating_ip(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_floating_ip")
        return result

    @builtins.property
    def enable_tcp_reset(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_tcp_reset")
        return result

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def load_distribution(self) -> typing.Optional[builtins.str]:
        result = self._values.get("load_distribution")
        return result

    @builtins.property
    def probe_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("probe_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LbRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LbRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LbTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LbTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LbTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LighthouseAssignment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LighthouseAssignment",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        lighthouse_definition_id: builtins.str,
        scope: builtins.str,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LighthouseAssignmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param lighthouse_definition_id: -
        :param scope: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LighthouseAssignmentConfig(
            lighthouse_definition_id=lighthouse_definition_id,
            scope=scope,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LighthouseAssignment, self, [scope_, id, config])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lighthouseDefinitionIdInput")
    def lighthouse_definition_id_input(self) -> builtins.str:
        return jsii.get(self, "lighthouseDefinitionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LighthouseAssignmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lighthouseDefinitionId")
    def lighthouse_definition_id(self) -> builtins.str:
        return jsii.get(self, "lighthouseDefinitionId")

    @lighthouse_definition_id.setter # type: ignore
    def lighthouse_definition_id(self, value: builtins.str) -> None:
        jsii.set(self, "lighthouseDefinitionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LighthouseAssignmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LighthouseAssignmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LighthouseAssignmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "lighthouse_definition_id": "lighthouseDefinitionId",
        "scope": "scope",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class LighthouseAssignmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        lighthouse_definition_id: builtins.str,
        scope: builtins.str,
        name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LighthouseAssignmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param lighthouse_definition_id: -
        :param scope: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LighthouseAssignmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "lighthouse_definition_id": lighthouse_definition_id,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if name is not None:
            self._values["name"] = name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def lighthouse_definition_id(self) -> builtins.str:
        result = self._values.get("lighthouse_definition_id")
        assert result is not None, "Required property 'lighthouse_definition_id' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LighthouseAssignmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LighthouseAssignmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LighthouseAssignmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class LighthouseAssignmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LighthouseAssignmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LighthouseDefinition(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LighthouseDefinition",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        authorization: typing.List["LighthouseDefinitionAuthorization"],
        managing_tenant_id: builtins.str,
        name: builtins.str,
        scope: builtins.str,
        description: typing.Optional[builtins.str] = None,
        lighthouse_definition_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LighthouseDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param authorization: authorization block.
        :param managing_tenant_id: -
        :param name: -
        :param scope: -
        :param description: -
        :param lighthouse_definition_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LighthouseDefinitionConfig(
            authorization=authorization,
            managing_tenant_id=managing_tenant_id,
            name=name,
            scope=scope,
            description=description,
            lighthouse_definition_id=lighthouse_definition_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LighthouseDefinition, self, [scope_, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetLighthouseDefinitionId")
    def reset_lighthouse_definition_id(self) -> None:
        return jsii.invoke(self, "resetLighthouseDefinitionId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationInput")
    def authorization_input(self) -> typing.List["LighthouseDefinitionAuthorization"]:
        return jsii.get(self, "authorizationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managingTenantIdInput")
    def managing_tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "managingTenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lighthouseDefinitionIdInput")
    def lighthouse_definition_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "lighthouseDefinitionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LighthouseDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorization")
    def authorization(self) -> typing.List["LighthouseDefinitionAuthorization"]:
        return jsii.get(self, "authorization")

    @authorization.setter # type: ignore
    def authorization(
        self,
        value: typing.List["LighthouseDefinitionAuthorization"],
    ) -> None:
        jsii.set(self, "authorization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lighthouseDefinitionId")
    def lighthouse_definition_id(self) -> builtins.str:
        return jsii.get(self, "lighthouseDefinitionId")

    @lighthouse_definition_id.setter # type: ignore
    def lighthouse_definition_id(self, value: builtins.str) -> None:
        jsii.set(self, "lighthouseDefinitionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managingTenantId")
    def managing_tenant_id(self) -> builtins.str:
        return jsii.get(self, "managingTenantId")

    @managing_tenant_id.setter # type: ignore
    def managing_tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "managingTenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LighthouseDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LighthouseDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LighthouseDefinitionAuthorization",
    jsii_struct_bases=[],
    name_mapping={
        "principal_id": "principalId",
        "role_definition_id": "roleDefinitionId",
    },
)
class LighthouseDefinitionAuthorization:
    def __init__(
        self,
        *,
        principal_id: builtins.str,
        role_definition_id: builtins.str,
    ) -> None:
        """
        :param principal_id: -
        :param role_definition_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "principal_id": principal_id,
            "role_definition_id": role_definition_id,
        }

    @builtins.property
    def principal_id(self) -> builtins.str:
        result = self._values.get("principal_id")
        assert result is not None, "Required property 'principal_id' is missing"
        return result

    @builtins.property
    def role_definition_id(self) -> builtins.str:
        result = self._values.get("role_definition_id")
        assert result is not None, "Required property 'role_definition_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LighthouseDefinitionAuthorization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LighthouseDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "authorization": "authorization",
        "managing_tenant_id": "managingTenantId",
        "name": "name",
        "scope": "scope",
        "description": "description",
        "lighthouse_definition_id": "lighthouseDefinitionId",
        "timeouts": "timeouts",
    },
)
class LighthouseDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        authorization: typing.List[LighthouseDefinitionAuthorization],
        managing_tenant_id: builtins.str,
        name: builtins.str,
        scope: builtins.str,
        description: typing.Optional[builtins.str] = None,
        lighthouse_definition_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LighthouseDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param authorization: authorization block.
        :param managing_tenant_id: -
        :param name: -
        :param scope: -
        :param description: -
        :param lighthouse_definition_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LighthouseDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "authorization": authorization,
            "managing_tenant_id": managing_tenant_id,
            "name": name,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if lighthouse_definition_id is not None:
            self._values["lighthouse_definition_id"] = lighthouse_definition_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def authorization(self) -> typing.List[LighthouseDefinitionAuthorization]:
        """authorization block."""
        result = self._values.get("authorization")
        assert result is not None, "Required property 'authorization' is missing"
        return result

    @builtins.property
    def managing_tenant_id(self) -> builtins.str:
        result = self._values.get("managing_tenant_id")
        assert result is not None, "Required property 'managing_tenant_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def lighthouse_definition_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("lighthouse_definition_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LighthouseDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LighthouseDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LighthouseDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LighthouseDefinitionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LighthouseDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LinuxVirtualMachine(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LinuxVirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        admin_username: builtins.str,
        location: builtins.str,
        name: builtins.str,
        network_interface_ids: typing.List[builtins.str],
        os_disk: typing.List["LinuxVirtualMachineOsDisk"],
        resource_group_name: builtins.str,
        size: builtins.str,
        additional_capabilities: typing.Optional[typing.List["LinuxVirtualMachineAdditionalCapabilities"]] = None,
        admin_password: typing.Optional[builtins.str] = None,
        admin_ssh_key: typing.Optional[typing.List["LinuxVirtualMachineAdminSshKey"]] = None,
        allow_extension_operations: typing.Optional[builtins.bool] = None,
        availability_set_id: typing.Optional[builtins.str] = None,
        boot_diagnostics: typing.Optional[typing.List["LinuxVirtualMachineBootDiagnostics"]] = None,
        computer_name: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        dedicated_host_id: typing.Optional[builtins.str] = None,
        disable_password_authentication: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extensions_time_budget: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["LinuxVirtualMachineIdentity"]] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        plan: typing.Optional[typing.List["LinuxVirtualMachinePlan"]] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["LinuxVirtualMachineSecret"]] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["LinuxVirtualMachineSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LinuxVirtualMachineTimeouts"] = None,
        virtual_machine_scale_set_id: typing.Optional[builtins.str] = None,
        zone: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param admin_username: -
        :param location: -
        :param name: -
        :param network_interface_ids: -
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param size: -
        :param additional_capabilities: additional_capabilities block.
        :param admin_password: -
        :param admin_ssh_key: admin_ssh_key block.
        :param allow_extension_operations: -
        :param availability_set_id: -
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name: -
        :param custom_data: -
        :param dedicated_host_id: -
        :param disable_password_authentication: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extensions_time_budget: -
        :param identity: identity block.
        :param max_bid_price: -
        :param plan: plan block.
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param secret: secret block.
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_machine_scale_set_id: -
        :param zone: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LinuxVirtualMachineConfig(
            admin_username=admin_username,
            location=location,
            name=name,
            network_interface_ids=network_interface_ids,
            os_disk=os_disk,
            resource_group_name=resource_group_name,
            size=size,
            additional_capabilities=additional_capabilities,
            admin_password=admin_password,
            admin_ssh_key=admin_ssh_key,
            allow_extension_operations=allow_extension_operations,
            availability_set_id=availability_set_id,
            boot_diagnostics=boot_diagnostics,
            computer_name=computer_name,
            custom_data=custom_data,
            dedicated_host_id=dedicated_host_id,
            disable_password_authentication=disable_password_authentication,
            encryption_at_host_enabled=encryption_at_host_enabled,
            eviction_policy=eviction_policy,
            extensions_time_budget=extensions_time_budget,
            identity=identity,
            max_bid_price=max_bid_price,
            plan=plan,
            priority=priority,
            provision_vm_agent=provision_vm_agent,
            proximity_placement_group_id=proximity_placement_group_id,
            secret=secret,
            source_image_id=source_image_id,
            source_image_reference=source_image_reference,
            tags=tags,
            timeouts=timeouts,
            virtual_machine_scale_set_id=virtual_machine_scale_set_id,
            zone=zone,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LinuxVirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalCapabilities")
    def reset_additional_capabilities(self) -> None:
        return jsii.invoke(self, "resetAdditionalCapabilities", [])

    @jsii.member(jsii_name="resetAdminPassword")
    def reset_admin_password(self) -> None:
        return jsii.invoke(self, "resetAdminPassword", [])

    @jsii.member(jsii_name="resetAdminSshKey")
    def reset_admin_ssh_key(self) -> None:
        return jsii.invoke(self, "resetAdminSshKey", [])

    @jsii.member(jsii_name="resetAllowExtensionOperations")
    def reset_allow_extension_operations(self) -> None:
        return jsii.invoke(self, "resetAllowExtensionOperations", [])

    @jsii.member(jsii_name="resetAvailabilitySetId")
    def reset_availability_set_id(self) -> None:
        return jsii.invoke(self, "resetAvailabilitySetId", [])

    @jsii.member(jsii_name="resetBootDiagnostics")
    def reset_boot_diagnostics(self) -> None:
        return jsii.invoke(self, "resetBootDiagnostics", [])

    @jsii.member(jsii_name="resetComputerName")
    def reset_computer_name(self) -> None:
        return jsii.invoke(self, "resetComputerName", [])

    @jsii.member(jsii_name="resetCustomData")
    def reset_custom_data(self) -> None:
        return jsii.invoke(self, "resetCustomData", [])

    @jsii.member(jsii_name="resetDedicatedHostId")
    def reset_dedicated_host_id(self) -> None:
        return jsii.invoke(self, "resetDedicatedHostId", [])

    @jsii.member(jsii_name="resetDisablePasswordAuthentication")
    def reset_disable_password_authentication(self) -> None:
        return jsii.invoke(self, "resetDisablePasswordAuthentication", [])

    @jsii.member(jsii_name="resetEncryptionAtHostEnabled")
    def reset_encryption_at_host_enabled(self) -> None:
        return jsii.invoke(self, "resetEncryptionAtHostEnabled", [])

    @jsii.member(jsii_name="resetEvictionPolicy")
    def reset_eviction_policy(self) -> None:
        return jsii.invoke(self, "resetEvictionPolicy", [])

    @jsii.member(jsii_name="resetExtensionsTimeBudget")
    def reset_extensions_time_budget(self) -> None:
        return jsii.invoke(self, "resetExtensionsTimeBudget", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetMaxBidPrice")
    def reset_max_bid_price(self) -> None:
        return jsii.invoke(self, "resetMaxBidPrice", [])

    @jsii.member(jsii_name="resetPlan")
    def reset_plan(self) -> None:
        return jsii.invoke(self, "resetPlan", [])

    @jsii.member(jsii_name="resetPriority")
    def reset_priority(self) -> None:
        return jsii.invoke(self, "resetPriority", [])

    @jsii.member(jsii_name="resetProvisionVmAgent")
    def reset_provision_vm_agent(self) -> None:
        return jsii.invoke(self, "resetProvisionVmAgent", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetSecret")
    def reset_secret(self) -> None:
        return jsii.invoke(self, "resetSecret", [])

    @jsii.member(jsii_name="resetSourceImageId")
    def reset_source_image_id(self) -> None:
        return jsii.invoke(self, "resetSourceImageId", [])

    @jsii.member(jsii_name="resetSourceImageReference")
    def reset_source_image_reference(self) -> None:
        return jsii.invoke(self, "resetSourceImageReference", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVirtualMachineScaleSetId")
    def reset_virtual_machine_scale_set_id(self) -> None:
        return jsii.invoke(self, "resetVirtualMachineScaleSetId", [])

    @jsii.member(jsii_name="resetZone")
    def reset_zone(self) -> None:
        return jsii.invoke(self, "resetZone", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsernameInput")
    def admin_username_input(self) -> builtins.str:
        return jsii.get(self, "adminUsernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdsInput")
    def network_interface_ids_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "networkInterfaceIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskInput")
    def os_disk_input(self) -> typing.List["LinuxVirtualMachineOsDisk"]:
        return jsii.get(self, "osDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddress")
    def public_ip_address(self) -> builtins.str:
        return jsii.get(self, "publicIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddresses")
    def public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInput")
    def size_input(self) -> builtins.str:
        return jsii.get(self, "sizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilitiesInput")
    def additional_capabilities_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineAdditionalCapabilities"]]:
        return jsii.get(self, "additionalCapabilitiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPasswordInput")
    def admin_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "adminPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminSshKeyInput")
    def admin_ssh_key_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineAdminSshKey"]]:
        return jsii.get(self, "adminSshKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowExtensionOperationsInput")
    def allow_extension_operations_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowExtensionOperationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilitySetIdInput")
    def availability_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "availabilitySetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnosticsInput")
    def boot_diagnostics_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineBootDiagnostics"]]:
        return jsii.get(self, "bootDiagnosticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerNameInput")
    def computer_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "computerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDataInput")
    def custom_data_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "customDataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostIdInput")
    def dedicated_host_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dedicatedHostIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disablePasswordAuthenticationInput")
    def disable_password_authentication_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disablePasswordAuthenticationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabledInput")
    def encryption_at_host_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptionAtHostEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicyInput")
    def eviction_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "evictionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extensionsTimeBudgetInput")
    def extensions_time_budget_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "extensionsTimeBudgetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPriceInput")
    def max_bid_price_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxBidPriceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(self) -> typing.Optional[typing.List["LinuxVirtualMachinePlan"]]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgentInput")
    def provision_vm_agent_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "provisionVmAgentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretInput")
    def secret_input(self) -> typing.Optional[typing.List["LinuxVirtualMachineSecret"]]:
        return jsii.get(self, "secretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageIdInput")
    def source_image_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceImageIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReferenceInput")
    def source_image_reference_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineSourceImageReference"]]:
        return jsii.get(self, "sourceImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LinuxVirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineScaleSetIdInput")
    def virtual_machine_scale_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "virtualMachineScaleSetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneInput")
    def zone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "zoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilities")
    def additional_capabilities(
        self,
    ) -> typing.List["LinuxVirtualMachineAdditionalCapabilities"]:
        return jsii.get(self, "additionalCapabilities")

    @additional_capabilities.setter # type: ignore
    def additional_capabilities(
        self,
        value: typing.List["LinuxVirtualMachineAdditionalCapabilities"],
    ) -> None:
        jsii.set(self, "additionalCapabilities", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPassword")
    def admin_password(self) -> builtins.str:
        return jsii.get(self, "adminPassword")

    @admin_password.setter # type: ignore
    def admin_password(self, value: builtins.str) -> None:
        jsii.set(self, "adminPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminSshKey")
    def admin_ssh_key(self) -> typing.List["LinuxVirtualMachineAdminSshKey"]:
        return jsii.get(self, "adminSshKey")

    @admin_ssh_key.setter # type: ignore
    def admin_ssh_key(
        self,
        value: typing.List["LinuxVirtualMachineAdminSshKey"],
    ) -> None:
        jsii.set(self, "adminSshKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")

    @admin_username.setter # type: ignore
    def admin_username(self, value: builtins.str) -> None:
        jsii.set(self, "adminUsername", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowExtensionOperations")
    def allow_extension_operations(self) -> builtins.bool:
        return jsii.get(self, "allowExtensionOperations")

    @allow_extension_operations.setter # type: ignore
    def allow_extension_operations(self, value: builtins.bool) -> None:
        jsii.set(self, "allowExtensionOperations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilitySetId")
    def availability_set_id(self) -> builtins.str:
        return jsii.get(self, "availabilitySetId")

    @availability_set_id.setter # type: ignore
    def availability_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "availabilitySetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnostics")
    def boot_diagnostics(self) -> typing.List["LinuxVirtualMachineBootDiagnostics"]:
        return jsii.get(self, "bootDiagnostics")

    @boot_diagnostics.setter # type: ignore
    def boot_diagnostics(
        self,
        value: typing.List["LinuxVirtualMachineBootDiagnostics"],
    ) -> None:
        jsii.set(self, "bootDiagnostics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerName")
    def computer_name(self) -> builtins.str:
        return jsii.get(self, "computerName")

    @computer_name.setter # type: ignore
    def computer_name(self, value: builtins.str) -> None:
        jsii.set(self, "computerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customData")
    def custom_data(self) -> builtins.str:
        return jsii.get(self, "customData")

    @custom_data.setter # type: ignore
    def custom_data(self, value: builtins.str) -> None:
        jsii.set(self, "customData", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostId")
    def dedicated_host_id(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostId")

    @dedicated_host_id.setter # type: ignore
    def dedicated_host_id(self, value: builtins.str) -> None:
        jsii.set(self, "dedicatedHostId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disablePasswordAuthentication")
    def disable_password_authentication(self) -> builtins.bool:
        return jsii.get(self, "disablePasswordAuthentication")

    @disable_password_authentication.setter # type: ignore
    def disable_password_authentication(self, value: builtins.bool) -> None:
        jsii.set(self, "disablePasswordAuthentication", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabled")
    def encryption_at_host_enabled(self) -> builtins.bool:
        return jsii.get(self, "encryptionAtHostEnabled")

    @encryption_at_host_enabled.setter # type: ignore
    def encryption_at_host_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "encryptionAtHostEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicy")
    def eviction_policy(self) -> builtins.str:
        return jsii.get(self, "evictionPolicy")

    @eviction_policy.setter # type: ignore
    def eviction_policy(self, value: builtins.str) -> None:
        jsii.set(self, "evictionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extensionsTimeBudget")
    def extensions_time_budget(self) -> builtins.str:
        return jsii.get(self, "extensionsTimeBudget")

    @extensions_time_budget.setter # type: ignore
    def extensions_time_budget(self, value: builtins.str) -> None:
        jsii.set(self, "extensionsTimeBudget", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["LinuxVirtualMachineIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["LinuxVirtualMachineIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPrice")
    def max_bid_price(self) -> jsii.Number:
        return jsii.get(self, "maxBidPrice")

    @max_bid_price.setter # type: ignore
    def max_bid_price(self, value: jsii.Number) -> None:
        jsii.set(self, "maxBidPrice", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIds")
    def network_interface_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "networkInterfaceIds")

    @network_interface_ids.setter # type: ignore
    def network_interface_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "networkInterfaceIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDisk")
    def os_disk(self) -> typing.List["LinuxVirtualMachineOsDisk"]:
        return jsii.get(self, "osDisk")

    @os_disk.setter # type: ignore
    def os_disk(self, value: typing.List["LinuxVirtualMachineOsDisk"]) -> None:
        jsii.set(self, "osDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["LinuxVirtualMachinePlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["LinuxVirtualMachinePlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> builtins.str:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: builtins.str) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgent")
    def provision_vm_agent(self) -> builtins.bool:
        return jsii.get(self, "provisionVmAgent")

    @provision_vm_agent.setter # type: ignore
    def provision_vm_agent(self, value: builtins.bool) -> None:
        jsii.set(self, "provisionVmAgent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> typing.List["LinuxVirtualMachineSecret"]:
        return jsii.get(self, "secret")

    @secret.setter # type: ignore
    def secret(self, value: typing.List["LinuxVirtualMachineSecret"]) -> None:
        jsii.set(self, "secret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="size")
    def size(self) -> builtins.str:
        return jsii.get(self, "size")

    @size.setter # type: ignore
    def size(self, value: builtins.str) -> None:
        jsii.set(self, "size", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageId")
    def source_image_id(self) -> builtins.str:
        return jsii.get(self, "sourceImageId")

    @source_image_id.setter # type: ignore
    def source_image_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceImageId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReference")
    def source_image_reference(
        self,
    ) -> typing.List["LinuxVirtualMachineSourceImageReference"]:
        return jsii.get(self, "sourceImageReference")

    @source_image_reference.setter # type: ignore
    def source_image_reference(
        self,
        value: typing.List["LinuxVirtualMachineSourceImageReference"],
    ) -> None:
        jsii.set(self, "sourceImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LinuxVirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LinuxVirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineScaleSetId")
    def virtual_machine_scale_set_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineScaleSetId")

    @virtual_machine_scale_set_id.setter # type: ignore
    def virtual_machine_scale_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineScaleSetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zone")
    def zone(self) -> builtins.str:
        return jsii.get(self, "zone")

    @zone.setter # type: ignore
    def zone(self, value: builtins.str) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineAdditionalCapabilities",
    jsii_struct_bases=[],
    name_mapping={"ultra_ssd_enabled": "ultraSsdEnabled"},
)
class LinuxVirtualMachineAdditionalCapabilities:
    def __init__(
        self,
        *,
        ultra_ssd_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param ultra_ssd_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ultra_ssd_enabled is not None:
            self._values["ultra_ssd_enabled"] = ultra_ssd_enabled

    @builtins.property
    def ultra_ssd_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ultra_ssd_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineAdditionalCapabilities(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineAdminSshKey",
    jsii_struct_bases=[],
    name_mapping={"public_key": "publicKey", "username": "username"},
)
class LinuxVirtualMachineAdminSshKey:
    def __init__(self, *, public_key: builtins.str, username: builtins.str) -> None:
        """
        :param public_key: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "public_key": public_key,
            "username": username,
        }

    @builtins.property
    def public_key(self) -> builtins.str:
        result = self._values.get("public_key")
        assert result is not None, "Required property 'public_key' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineAdminSshKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineBootDiagnostics",
    jsii_struct_bases=[],
    name_mapping={"storage_account_uri": "storageAccountUri"},
)
class LinuxVirtualMachineBootDiagnostics:
    def __init__(
        self,
        *,
        storage_account_uri: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param storage_account_uri: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if storage_account_uri is not None:
            self._values["storage_account_uri"] = storage_account_uri

    @builtins.property
    def storage_account_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_uri")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineBootDiagnostics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "admin_username": "adminUsername",
        "location": "location",
        "name": "name",
        "network_interface_ids": "networkInterfaceIds",
        "os_disk": "osDisk",
        "resource_group_name": "resourceGroupName",
        "size": "size",
        "additional_capabilities": "additionalCapabilities",
        "admin_password": "adminPassword",
        "admin_ssh_key": "adminSshKey",
        "allow_extension_operations": "allowExtensionOperations",
        "availability_set_id": "availabilitySetId",
        "boot_diagnostics": "bootDiagnostics",
        "computer_name": "computerName",
        "custom_data": "customData",
        "dedicated_host_id": "dedicatedHostId",
        "disable_password_authentication": "disablePasswordAuthentication",
        "encryption_at_host_enabled": "encryptionAtHostEnabled",
        "eviction_policy": "evictionPolicy",
        "extensions_time_budget": "extensionsTimeBudget",
        "identity": "identity",
        "max_bid_price": "maxBidPrice",
        "plan": "plan",
        "priority": "priority",
        "provision_vm_agent": "provisionVmAgent",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "secret": "secret",
        "source_image_id": "sourceImageId",
        "source_image_reference": "sourceImageReference",
        "tags": "tags",
        "timeouts": "timeouts",
        "virtual_machine_scale_set_id": "virtualMachineScaleSetId",
        "zone": "zone",
    },
)
class LinuxVirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        admin_username: builtins.str,
        location: builtins.str,
        name: builtins.str,
        network_interface_ids: typing.List[builtins.str],
        os_disk: typing.List["LinuxVirtualMachineOsDisk"],
        resource_group_name: builtins.str,
        size: builtins.str,
        additional_capabilities: typing.Optional[typing.List[LinuxVirtualMachineAdditionalCapabilities]] = None,
        admin_password: typing.Optional[builtins.str] = None,
        admin_ssh_key: typing.Optional[typing.List[LinuxVirtualMachineAdminSshKey]] = None,
        allow_extension_operations: typing.Optional[builtins.bool] = None,
        availability_set_id: typing.Optional[builtins.str] = None,
        boot_diagnostics: typing.Optional[typing.List[LinuxVirtualMachineBootDiagnostics]] = None,
        computer_name: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        dedicated_host_id: typing.Optional[builtins.str] = None,
        disable_password_authentication: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extensions_time_budget: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["LinuxVirtualMachineIdentity"]] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        plan: typing.Optional[typing.List["LinuxVirtualMachinePlan"]] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["LinuxVirtualMachineSecret"]] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["LinuxVirtualMachineSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LinuxVirtualMachineTimeouts"] = None,
        virtual_machine_scale_set_id: typing.Optional[builtins.str] = None,
        zone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param admin_username: -
        :param location: -
        :param name: -
        :param network_interface_ids: -
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param size: -
        :param additional_capabilities: additional_capabilities block.
        :param admin_password: -
        :param admin_ssh_key: admin_ssh_key block.
        :param allow_extension_operations: -
        :param availability_set_id: -
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name: -
        :param custom_data: -
        :param dedicated_host_id: -
        :param disable_password_authentication: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extensions_time_budget: -
        :param identity: identity block.
        :param max_bid_price: -
        :param plan: plan block.
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param secret: secret block.
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_machine_scale_set_id: -
        :param zone: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LinuxVirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "admin_username": admin_username,
            "location": location,
            "name": name,
            "network_interface_ids": network_interface_ids,
            "os_disk": os_disk,
            "resource_group_name": resource_group_name,
            "size": size,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_capabilities is not None:
            self._values["additional_capabilities"] = additional_capabilities
        if admin_password is not None:
            self._values["admin_password"] = admin_password
        if admin_ssh_key is not None:
            self._values["admin_ssh_key"] = admin_ssh_key
        if allow_extension_operations is not None:
            self._values["allow_extension_operations"] = allow_extension_operations
        if availability_set_id is not None:
            self._values["availability_set_id"] = availability_set_id
        if boot_diagnostics is not None:
            self._values["boot_diagnostics"] = boot_diagnostics
        if computer_name is not None:
            self._values["computer_name"] = computer_name
        if custom_data is not None:
            self._values["custom_data"] = custom_data
        if dedicated_host_id is not None:
            self._values["dedicated_host_id"] = dedicated_host_id
        if disable_password_authentication is not None:
            self._values["disable_password_authentication"] = disable_password_authentication
        if encryption_at_host_enabled is not None:
            self._values["encryption_at_host_enabled"] = encryption_at_host_enabled
        if eviction_policy is not None:
            self._values["eviction_policy"] = eviction_policy
        if extensions_time_budget is not None:
            self._values["extensions_time_budget"] = extensions_time_budget
        if identity is not None:
            self._values["identity"] = identity
        if max_bid_price is not None:
            self._values["max_bid_price"] = max_bid_price
        if plan is not None:
            self._values["plan"] = plan
        if priority is not None:
            self._values["priority"] = priority
        if provision_vm_agent is not None:
            self._values["provision_vm_agent"] = provision_vm_agent
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if secret is not None:
            self._values["secret"] = secret
        if source_image_id is not None:
            self._values["source_image_id"] = source_image_id
        if source_image_reference is not None:
            self._values["source_image_reference"] = source_image_reference
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if virtual_machine_scale_set_id is not None:
            self._values["virtual_machine_scale_set_id"] = virtual_machine_scale_set_id
        if zone is not None:
            self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_interface_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("network_interface_ids")
        assert result is not None, "Required property 'network_interface_ids' is missing"
        return result

    @builtins.property
    def os_disk(self) -> typing.List["LinuxVirtualMachineOsDisk"]:
        """os_disk block."""
        result = self._values.get("os_disk")
        assert result is not None, "Required property 'os_disk' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def size(self) -> builtins.str:
        result = self._values.get("size")
        assert result is not None, "Required property 'size' is missing"
        return result

    @builtins.property
    def additional_capabilities(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineAdditionalCapabilities]]:
        """additional_capabilities block."""
        result = self._values.get("additional_capabilities")
        return result

    @builtins.property
    def admin_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("admin_password")
        return result

    @builtins.property
    def admin_ssh_key(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineAdminSshKey]]:
        """admin_ssh_key block."""
        result = self._values.get("admin_ssh_key")
        return result

    @builtins.property
    def allow_extension_operations(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_extension_operations")
        return result

    @builtins.property
    def availability_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("availability_set_id")
        return result

    @builtins.property
    def boot_diagnostics(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineBootDiagnostics]]:
        """boot_diagnostics block."""
        result = self._values.get("boot_diagnostics")
        return result

    @builtins.property
    def computer_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("computer_name")
        return result

    @builtins.property
    def custom_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_data")
        return result

    @builtins.property
    def dedicated_host_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dedicated_host_id")
        return result

    @builtins.property
    def disable_password_authentication(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disable_password_authentication")
        return result

    @builtins.property
    def encryption_at_host_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encryption_at_host_enabled")
        return result

    @builtins.property
    def eviction_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eviction_policy")
        return result

    @builtins.property
    def extensions_time_budget(self) -> typing.Optional[builtins.str]:
        result = self._values.get("extensions_time_budget")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["LinuxVirtualMachineIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def max_bid_price(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_bid_price")
        return result

    @builtins.property
    def plan(self) -> typing.Optional[typing.List["LinuxVirtualMachinePlan"]]:
        """plan block."""
        result = self._values.get("plan")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def provision_vm_agent(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("provision_vm_agent")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def secret(self) -> typing.Optional[typing.List["LinuxVirtualMachineSecret"]]:
        """secret block."""
        result = self._values.get("secret")
        return result

    @builtins.property
    def source_image_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_image_id")
        return result

    @builtins.property
    def source_image_reference(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineSourceImageReference"]]:
        """source_image_reference block."""
        result = self._values.get("source_image_reference")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LinuxVirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def virtual_machine_scale_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_machine_scale_set_id")
        return result

    @builtins.property
    def zone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("zone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class LinuxVirtualMachineIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineOsDisk",
    jsii_struct_bases=[],
    name_mapping={
        "caching": "caching",
        "storage_account_type": "storageAccountType",
        "diff_disk_settings": "diffDiskSettings",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "disk_size_gb": "diskSizeGb",
        "name": "name",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class LinuxVirtualMachineOsDisk:
    def __init__(
        self,
        *,
        caching: builtins.str,
        storage_account_type: builtins.str,
        diff_disk_settings: typing.Optional[typing.List["LinuxVirtualMachineOsDiskDiffDiskSettings"]] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        name: typing.Optional[builtins.str] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param caching: -
        :param storage_account_type: -
        :param diff_disk_settings: diff_disk_settings block.
        :param disk_encryption_set_id: -
        :param disk_size_gb: -
        :param name: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "caching": caching,
            "storage_account_type": storage_account_type,
        }
        if diff_disk_settings is not None:
            self._values["diff_disk_settings"] = diff_disk_settings
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if name is not None:
            self._values["name"] = name
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def caching(self) -> builtins.str:
        result = self._values.get("caching")
        assert result is not None, "Required property 'caching' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> builtins.str:
        result = self._values.get("storage_account_type")
        assert result is not None, "Required property 'storage_account_type' is missing"
        return result

    @builtins.property
    def diff_disk_settings(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineOsDiskDiffDiskSettings"]]:
        """diff_disk_settings block."""
        result = self._values.get("diff_disk_settings")
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineOsDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineOsDiskDiffDiskSettings",
    jsii_struct_bases=[],
    name_mapping={"option": "option"},
)
class LinuxVirtualMachineOsDiskDiffDiskSettings:
    def __init__(self, *, option: builtins.str) -> None:
        """
        :param option: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "option": option,
        }

    @builtins.property
    def option(self) -> builtins.str:
        result = self._values.get("option")
        assert result is not None, "Required property 'option' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineOsDiskDiffDiskSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachinePlan",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "product": "product", "publisher": "publisher"},
)
class LinuxVirtualMachinePlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: builtins.str,
        publisher: builtins.str,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "product": product,
            "publisher": publisher,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachinePlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LinuxVirtualMachineScaleSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LinuxVirtualMachineScaleSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        admin_username: builtins.str,
        instances: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        network_interface: typing.List["LinuxVirtualMachineScaleSetNetworkInterface"],
        os_disk: typing.List["LinuxVirtualMachineScaleSetOsDisk"],
        resource_group_name: builtins.str,
        sku: builtins.str,
        additional_capabilities: typing.Optional[typing.List["LinuxVirtualMachineScaleSetAdditionalCapabilities"]] = None,
        admin_password: typing.Optional[builtins.str] = None,
        admin_ssh_key: typing.Optional[typing.List["LinuxVirtualMachineScaleSetAdminSshKey"]] = None,
        automatic_instance_repair: typing.Optional[typing.List["LinuxVirtualMachineScaleSetAutomaticInstanceRepair"]] = None,
        automatic_os_upgrade_policy: typing.Optional[typing.List["LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy"]] = None,
        boot_diagnostics: typing.Optional[typing.List["LinuxVirtualMachineScaleSetBootDiagnostics"]] = None,
        computer_name_prefix: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        data_disk: typing.Optional[typing.List["LinuxVirtualMachineScaleSetDataDisk"]] = None,
        disable_password_authentication: typing.Optional[builtins.bool] = None,
        do_not_run_extensions_on_overprovisioned_machines: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extension: typing.Optional[typing.List["LinuxVirtualMachineScaleSetExtension"]] = None,
        health_probe_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["LinuxVirtualMachineScaleSetIdentity"]] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        overprovision: typing.Optional[builtins.bool] = None,
        plan: typing.Optional[typing.List["LinuxVirtualMachineScaleSetPlan"]] = None,
        platform_fault_domain_count: typing.Optional[jsii.Number] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        rolling_upgrade_policy: typing.Optional[typing.List["LinuxVirtualMachineScaleSetRollingUpgradePolicy"]] = None,
        scale_in_policy: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["LinuxVirtualMachineScaleSetSecret"]] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["LinuxVirtualMachineScaleSetSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        terminate_notification: typing.Optional[typing.List["LinuxVirtualMachineScaleSetTerminateNotification"]] = None,
        timeouts: typing.Optional["LinuxVirtualMachineScaleSetTimeouts"] = None,
        upgrade_mode: typing.Optional[builtins.str] = None,
        zone_balance: typing.Optional[builtins.bool] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param admin_username: -
        :param instances: -
        :param location: -
        :param name: -
        :param network_interface: network_interface block.
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param sku: -
        :param additional_capabilities: additional_capabilities block.
        :param admin_password: -
        :param admin_ssh_key: admin_ssh_key block.
        :param automatic_instance_repair: automatic_instance_repair block.
        :param automatic_os_upgrade_policy: automatic_os_upgrade_policy block.
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name_prefix: -
        :param custom_data: -
        :param data_disk: data_disk block.
        :param disable_password_authentication: -
        :param do_not_run_extensions_on_overprovisioned_machines: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extension: extension block.
        :param health_probe_id: -
        :param identity: identity block.
        :param max_bid_price: -
        :param overprovision: -
        :param plan: plan block.
        :param platform_fault_domain_count: -
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param rolling_upgrade_policy: rolling_upgrade_policy block.
        :param scale_in_policy: -
        :param secret: secret block.
        :param single_placement_group: -
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param terminate_notification: terminate_notification block.
        :param timeouts: timeouts block.
        :param upgrade_mode: -
        :param zone_balance: -
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LinuxVirtualMachineScaleSetConfig(
            admin_username=admin_username,
            instances=instances,
            location=location,
            name=name,
            network_interface=network_interface,
            os_disk=os_disk,
            resource_group_name=resource_group_name,
            sku=sku,
            additional_capabilities=additional_capabilities,
            admin_password=admin_password,
            admin_ssh_key=admin_ssh_key,
            automatic_instance_repair=automatic_instance_repair,
            automatic_os_upgrade_policy=automatic_os_upgrade_policy,
            boot_diagnostics=boot_diagnostics,
            computer_name_prefix=computer_name_prefix,
            custom_data=custom_data,
            data_disk=data_disk,
            disable_password_authentication=disable_password_authentication,
            do_not_run_extensions_on_overprovisioned_machines=do_not_run_extensions_on_overprovisioned_machines,
            encryption_at_host_enabled=encryption_at_host_enabled,
            eviction_policy=eviction_policy,
            extension=extension,
            health_probe_id=health_probe_id,
            identity=identity,
            max_bid_price=max_bid_price,
            overprovision=overprovision,
            plan=plan,
            platform_fault_domain_count=platform_fault_domain_count,
            priority=priority,
            provision_vm_agent=provision_vm_agent,
            proximity_placement_group_id=proximity_placement_group_id,
            rolling_upgrade_policy=rolling_upgrade_policy,
            scale_in_policy=scale_in_policy,
            secret=secret,
            single_placement_group=single_placement_group,
            source_image_id=source_image_id,
            source_image_reference=source_image_reference,
            tags=tags,
            terminate_notification=terminate_notification,
            timeouts=timeouts,
            upgrade_mode=upgrade_mode,
            zone_balance=zone_balance,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LinuxVirtualMachineScaleSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalCapabilities")
    def reset_additional_capabilities(self) -> None:
        return jsii.invoke(self, "resetAdditionalCapabilities", [])

    @jsii.member(jsii_name="resetAdminPassword")
    def reset_admin_password(self) -> None:
        return jsii.invoke(self, "resetAdminPassword", [])

    @jsii.member(jsii_name="resetAdminSshKey")
    def reset_admin_ssh_key(self) -> None:
        return jsii.invoke(self, "resetAdminSshKey", [])

    @jsii.member(jsii_name="resetAutomaticInstanceRepair")
    def reset_automatic_instance_repair(self) -> None:
        return jsii.invoke(self, "resetAutomaticInstanceRepair", [])

    @jsii.member(jsii_name="resetAutomaticOsUpgradePolicy")
    def reset_automatic_os_upgrade_policy(self) -> None:
        return jsii.invoke(self, "resetAutomaticOsUpgradePolicy", [])

    @jsii.member(jsii_name="resetBootDiagnostics")
    def reset_boot_diagnostics(self) -> None:
        return jsii.invoke(self, "resetBootDiagnostics", [])

    @jsii.member(jsii_name="resetComputerNamePrefix")
    def reset_computer_name_prefix(self) -> None:
        return jsii.invoke(self, "resetComputerNamePrefix", [])

    @jsii.member(jsii_name="resetCustomData")
    def reset_custom_data(self) -> None:
        return jsii.invoke(self, "resetCustomData", [])

    @jsii.member(jsii_name="resetDataDisk")
    def reset_data_disk(self) -> None:
        return jsii.invoke(self, "resetDataDisk", [])

    @jsii.member(jsii_name="resetDisablePasswordAuthentication")
    def reset_disable_password_authentication(self) -> None:
        return jsii.invoke(self, "resetDisablePasswordAuthentication", [])

    @jsii.member(jsii_name="resetDoNotRunExtensionsOnOverprovisionedMachines")
    def reset_do_not_run_extensions_on_overprovisioned_machines(self) -> None:
        return jsii.invoke(self, "resetDoNotRunExtensionsOnOverprovisionedMachines", [])

    @jsii.member(jsii_name="resetEncryptionAtHostEnabled")
    def reset_encryption_at_host_enabled(self) -> None:
        return jsii.invoke(self, "resetEncryptionAtHostEnabled", [])

    @jsii.member(jsii_name="resetEvictionPolicy")
    def reset_eviction_policy(self) -> None:
        return jsii.invoke(self, "resetEvictionPolicy", [])

    @jsii.member(jsii_name="resetExtension")
    def reset_extension(self) -> None:
        return jsii.invoke(self, "resetExtension", [])

    @jsii.member(jsii_name="resetHealthProbeId")
    def reset_health_probe_id(self) -> None:
        return jsii.invoke(self, "resetHealthProbeId", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetMaxBidPrice")
    def reset_max_bid_price(self) -> None:
        return jsii.invoke(self, "resetMaxBidPrice", [])

    @jsii.member(jsii_name="resetOverprovision")
    def reset_overprovision(self) -> None:
        return jsii.invoke(self, "resetOverprovision", [])

    @jsii.member(jsii_name="resetPlan")
    def reset_plan(self) -> None:
        return jsii.invoke(self, "resetPlan", [])

    @jsii.member(jsii_name="resetPlatformFaultDomainCount")
    def reset_platform_fault_domain_count(self) -> None:
        return jsii.invoke(self, "resetPlatformFaultDomainCount", [])

    @jsii.member(jsii_name="resetPriority")
    def reset_priority(self) -> None:
        return jsii.invoke(self, "resetPriority", [])

    @jsii.member(jsii_name="resetProvisionVmAgent")
    def reset_provision_vm_agent(self) -> None:
        return jsii.invoke(self, "resetProvisionVmAgent", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetRollingUpgradePolicy")
    def reset_rolling_upgrade_policy(self) -> None:
        return jsii.invoke(self, "resetRollingUpgradePolicy", [])

    @jsii.member(jsii_name="resetScaleInPolicy")
    def reset_scale_in_policy(self) -> None:
        return jsii.invoke(self, "resetScaleInPolicy", [])

    @jsii.member(jsii_name="resetSecret")
    def reset_secret(self) -> None:
        return jsii.invoke(self, "resetSecret", [])

    @jsii.member(jsii_name="resetSinglePlacementGroup")
    def reset_single_placement_group(self) -> None:
        return jsii.invoke(self, "resetSinglePlacementGroup", [])

    @jsii.member(jsii_name="resetSourceImageId")
    def reset_source_image_id(self) -> None:
        return jsii.invoke(self, "resetSourceImageId", [])

    @jsii.member(jsii_name="resetSourceImageReference")
    def reset_source_image_reference(self) -> None:
        return jsii.invoke(self, "resetSourceImageReference", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTerminateNotification")
    def reset_terminate_notification(self) -> None:
        return jsii.invoke(self, "resetTerminateNotification", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUpgradeMode")
    def reset_upgrade_mode(self) -> None:
        return jsii.invoke(self, "resetUpgradeMode", [])

    @jsii.member(jsii_name="resetZoneBalance")
    def reset_zone_balance(self) -> None:
        return jsii.invoke(self, "resetZoneBalance", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsernameInput")
    def admin_username_input(self) -> builtins.str:
        return jsii.get(self, "adminUsernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instancesInput")
    def instances_input(self) -> jsii.Number:
        return jsii.get(self, "instancesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceInput")
    def network_interface_input(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetNetworkInterface"]:
        return jsii.get(self, "networkInterfaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskInput")
    def os_disk_input(self) -> typing.List["LinuxVirtualMachineScaleSetOsDisk"]:
        return jsii.get(self, "osDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueId")
    def unique_id(self) -> builtins.str:
        return jsii.get(self, "uniqueId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilitiesInput")
    def additional_capabilities_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetAdditionalCapabilities"]]:
        return jsii.get(self, "additionalCapabilitiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPasswordInput")
    def admin_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "adminPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminSshKeyInput")
    def admin_ssh_key_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetAdminSshKey"]]:
        return jsii.get(self, "adminSshKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticInstanceRepairInput")
    def automatic_instance_repair_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetAutomaticInstanceRepair"]]:
        return jsii.get(self, "automaticInstanceRepairInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticOsUpgradePolicyInput")
    def automatic_os_upgrade_policy_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy"]]:
        return jsii.get(self, "automaticOsUpgradePolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnosticsInput")
    def boot_diagnostics_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetBootDiagnostics"]]:
        return jsii.get(self, "bootDiagnosticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerNamePrefixInput")
    def computer_name_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "computerNamePrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDataInput")
    def custom_data_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "customDataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataDiskInput")
    def data_disk_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetDataDisk"]]:
        return jsii.get(self, "dataDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disablePasswordAuthenticationInput")
    def disable_password_authentication_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disablePasswordAuthenticationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="doNotRunExtensionsOnOverprovisionedMachinesInput")
    def do_not_run_extensions_on_overprovisioned_machines_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "doNotRunExtensionsOnOverprovisionedMachinesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabledInput")
    def encryption_at_host_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptionAtHostEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicyInput")
    def eviction_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "evictionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extensionInput")
    def extension_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetExtension"]]:
        return jsii.get(self, "extensionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthProbeIdInput")
    def health_probe_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "healthProbeIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPriceInput")
    def max_bid_price_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxBidPriceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="overprovisionInput")
    def overprovision_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "overprovisionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetPlan"]]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCountInput")
    def platform_fault_domain_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "platformFaultDomainCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgentInput")
    def provision_vm_agent_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "provisionVmAgentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollingUpgradePolicyInput")
    def rolling_upgrade_policy_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetRollingUpgradePolicy"]]:
        return jsii.get(self, "rollingUpgradePolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleInPolicyInput")
    def scale_in_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "scaleInPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretInput")
    def secret_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetSecret"]]:
        return jsii.get(self, "secretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroupInput")
    def single_placement_group_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "singlePlacementGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageIdInput")
    def source_image_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceImageIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReferenceInput")
    def source_image_reference_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetSourceImageReference"]]:
        return jsii.get(self, "sourceImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terminateNotificationInput")
    def terminate_notification_input(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetTerminateNotification"]]:
        return jsii.get(self, "terminateNotificationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LinuxVirtualMachineScaleSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradeModeInput")
    def upgrade_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "upgradeModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneBalanceInput")
    def zone_balance_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneBalanceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilities")
    def additional_capabilities(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetAdditionalCapabilities"]:
        return jsii.get(self, "additionalCapabilities")

    @additional_capabilities.setter # type: ignore
    def additional_capabilities(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetAdditionalCapabilities"],
    ) -> None:
        jsii.set(self, "additionalCapabilities", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPassword")
    def admin_password(self) -> builtins.str:
        return jsii.get(self, "adminPassword")

    @admin_password.setter # type: ignore
    def admin_password(self, value: builtins.str) -> None:
        jsii.set(self, "adminPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminSshKey")
    def admin_ssh_key(self) -> typing.List["LinuxVirtualMachineScaleSetAdminSshKey"]:
        return jsii.get(self, "adminSshKey")

    @admin_ssh_key.setter # type: ignore
    def admin_ssh_key(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetAdminSshKey"],
    ) -> None:
        jsii.set(self, "adminSshKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")

    @admin_username.setter # type: ignore
    def admin_username(self, value: builtins.str) -> None:
        jsii.set(self, "adminUsername", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticInstanceRepair")
    def automatic_instance_repair(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetAutomaticInstanceRepair"]:
        return jsii.get(self, "automaticInstanceRepair")

    @automatic_instance_repair.setter # type: ignore
    def automatic_instance_repair(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetAutomaticInstanceRepair"],
    ) -> None:
        jsii.set(self, "automaticInstanceRepair", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticOsUpgradePolicy")
    def automatic_os_upgrade_policy(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy"]:
        return jsii.get(self, "automaticOsUpgradePolicy")

    @automatic_os_upgrade_policy.setter # type: ignore
    def automatic_os_upgrade_policy(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy"],
    ) -> None:
        jsii.set(self, "automaticOsUpgradePolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnostics")
    def boot_diagnostics(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetBootDiagnostics"]:
        return jsii.get(self, "bootDiagnostics")

    @boot_diagnostics.setter # type: ignore
    def boot_diagnostics(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetBootDiagnostics"],
    ) -> None:
        jsii.set(self, "bootDiagnostics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerNamePrefix")
    def computer_name_prefix(self) -> builtins.str:
        return jsii.get(self, "computerNamePrefix")

    @computer_name_prefix.setter # type: ignore
    def computer_name_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "computerNamePrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customData")
    def custom_data(self) -> builtins.str:
        return jsii.get(self, "customData")

    @custom_data.setter # type: ignore
    def custom_data(self, value: builtins.str) -> None:
        jsii.set(self, "customData", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataDisk")
    def data_disk(self) -> typing.List["LinuxVirtualMachineScaleSetDataDisk"]:
        return jsii.get(self, "dataDisk")

    @data_disk.setter # type: ignore
    def data_disk(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetDataDisk"],
    ) -> None:
        jsii.set(self, "dataDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disablePasswordAuthentication")
    def disable_password_authentication(self) -> builtins.bool:
        return jsii.get(self, "disablePasswordAuthentication")

    @disable_password_authentication.setter # type: ignore
    def disable_password_authentication(self, value: builtins.bool) -> None:
        jsii.set(self, "disablePasswordAuthentication", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="doNotRunExtensionsOnOverprovisionedMachines")
    def do_not_run_extensions_on_overprovisioned_machines(self) -> builtins.bool:
        return jsii.get(self, "doNotRunExtensionsOnOverprovisionedMachines")

    @do_not_run_extensions_on_overprovisioned_machines.setter # type: ignore
    def do_not_run_extensions_on_overprovisioned_machines(
        self,
        value: builtins.bool,
    ) -> None:
        jsii.set(self, "doNotRunExtensionsOnOverprovisionedMachines", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabled")
    def encryption_at_host_enabled(self) -> builtins.bool:
        return jsii.get(self, "encryptionAtHostEnabled")

    @encryption_at_host_enabled.setter # type: ignore
    def encryption_at_host_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "encryptionAtHostEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicy")
    def eviction_policy(self) -> builtins.str:
        return jsii.get(self, "evictionPolicy")

    @eviction_policy.setter # type: ignore
    def eviction_policy(self, value: builtins.str) -> None:
        jsii.set(self, "evictionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extension")
    def extension(self) -> typing.List["LinuxVirtualMachineScaleSetExtension"]:
        return jsii.get(self, "extension")

    @extension.setter # type: ignore
    def extension(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetExtension"],
    ) -> None:
        jsii.set(self, "extension", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthProbeId")
    def health_probe_id(self) -> builtins.str:
        return jsii.get(self, "healthProbeId")

    @health_probe_id.setter # type: ignore
    def health_probe_id(self, value: builtins.str) -> None:
        jsii.set(self, "healthProbeId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["LinuxVirtualMachineScaleSetIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetIdentity"],
    ) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instances")
    def instances(self) -> jsii.Number:
        return jsii.get(self, "instances")

    @instances.setter # type: ignore
    def instances(self, value: jsii.Number) -> None:
        jsii.set(self, "instances", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPrice")
    def max_bid_price(self) -> jsii.Number:
        return jsii.get(self, "maxBidPrice")

    @max_bid_price.setter # type: ignore
    def max_bid_price(self, value: jsii.Number) -> None:
        jsii.set(self, "maxBidPrice", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterface")
    def network_interface(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetNetworkInterface"]:
        return jsii.get(self, "networkInterface")

    @network_interface.setter # type: ignore
    def network_interface(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetNetworkInterface"],
    ) -> None:
        jsii.set(self, "networkInterface", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDisk")
    def os_disk(self) -> typing.List["LinuxVirtualMachineScaleSetOsDisk"]:
        return jsii.get(self, "osDisk")

    @os_disk.setter # type: ignore
    def os_disk(self, value: typing.List["LinuxVirtualMachineScaleSetOsDisk"]) -> None:
        jsii.set(self, "osDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="overprovision")
    def overprovision(self) -> builtins.bool:
        return jsii.get(self, "overprovision")

    @overprovision.setter # type: ignore
    def overprovision(self, value: builtins.bool) -> None:
        jsii.set(self, "overprovision", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["LinuxVirtualMachineScaleSetPlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["LinuxVirtualMachineScaleSetPlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCount")
    def platform_fault_domain_count(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCount")

    @platform_fault_domain_count.setter # type: ignore
    def platform_fault_domain_count(self, value: jsii.Number) -> None:
        jsii.set(self, "platformFaultDomainCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> builtins.str:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: builtins.str) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgent")
    def provision_vm_agent(self) -> builtins.bool:
        return jsii.get(self, "provisionVmAgent")

    @provision_vm_agent.setter # type: ignore
    def provision_vm_agent(self, value: builtins.bool) -> None:
        jsii.set(self, "provisionVmAgent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollingUpgradePolicy")
    def rolling_upgrade_policy(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetRollingUpgradePolicy"]:
        return jsii.get(self, "rollingUpgradePolicy")

    @rolling_upgrade_policy.setter # type: ignore
    def rolling_upgrade_policy(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetRollingUpgradePolicy"],
    ) -> None:
        jsii.set(self, "rollingUpgradePolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleInPolicy")
    def scale_in_policy(self) -> builtins.str:
        return jsii.get(self, "scaleInPolicy")

    @scale_in_policy.setter # type: ignore
    def scale_in_policy(self, value: builtins.str) -> None:
        jsii.set(self, "scaleInPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> typing.List["LinuxVirtualMachineScaleSetSecret"]:
        return jsii.get(self, "secret")

    @secret.setter # type: ignore
    def secret(self, value: typing.List["LinuxVirtualMachineScaleSetSecret"]) -> None:
        jsii.set(self, "secret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroup")
    def single_placement_group(self) -> builtins.bool:
        return jsii.get(self, "singlePlacementGroup")

    @single_placement_group.setter # type: ignore
    def single_placement_group(self, value: builtins.bool) -> None:
        jsii.set(self, "singlePlacementGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageId")
    def source_image_id(self) -> builtins.str:
        return jsii.get(self, "sourceImageId")

    @source_image_id.setter # type: ignore
    def source_image_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceImageId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReference")
    def source_image_reference(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetSourceImageReference"]:
        return jsii.get(self, "sourceImageReference")

    @source_image_reference.setter # type: ignore
    def source_image_reference(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetSourceImageReference"],
    ) -> None:
        jsii.set(self, "sourceImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terminateNotification")
    def terminate_notification(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetTerminateNotification"]:
        return jsii.get(self, "terminateNotification")

    @terminate_notification.setter # type: ignore
    def terminate_notification(
        self,
        value: typing.List["LinuxVirtualMachineScaleSetTerminateNotification"],
    ) -> None:
        jsii.set(self, "terminateNotification", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LinuxVirtualMachineScaleSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LinuxVirtualMachineScaleSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradeMode")
    def upgrade_mode(self) -> builtins.str:
        return jsii.get(self, "upgradeMode")

    @upgrade_mode.setter # type: ignore
    def upgrade_mode(self, value: builtins.str) -> None:
        jsii.set(self, "upgradeMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneBalance")
    def zone_balance(self) -> builtins.bool:
        return jsii.get(self, "zoneBalance")

    @zone_balance.setter # type: ignore
    def zone_balance(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneBalance", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetAdditionalCapabilities",
    jsii_struct_bases=[],
    name_mapping={"ultra_ssd_enabled": "ultraSsdEnabled"},
)
class LinuxVirtualMachineScaleSetAdditionalCapabilities:
    def __init__(
        self,
        *,
        ultra_ssd_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param ultra_ssd_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ultra_ssd_enabled is not None:
            self._values["ultra_ssd_enabled"] = ultra_ssd_enabled

    @builtins.property
    def ultra_ssd_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ultra_ssd_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetAdditionalCapabilities(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetAdminSshKey",
    jsii_struct_bases=[],
    name_mapping={"public_key": "publicKey", "username": "username"},
)
class LinuxVirtualMachineScaleSetAdminSshKey:
    def __init__(self, *, public_key: builtins.str, username: builtins.str) -> None:
        """
        :param public_key: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "public_key": public_key,
            "username": username,
        }

    @builtins.property
    def public_key(self) -> builtins.str:
        result = self._values.get("public_key")
        assert result is not None, "Required property 'public_key' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetAdminSshKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetAutomaticInstanceRepair",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "grace_period": "gracePeriod"},
)
class LinuxVirtualMachineScaleSetAutomaticInstanceRepair:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        grace_period: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param grace_period: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if grace_period is not None:
            self._values["grace_period"] = grace_period

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def grace_period(self) -> typing.Optional[builtins.str]:
        result = self._values.get("grace_period")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetAutomaticInstanceRepair(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy",
    jsii_struct_bases=[],
    name_mapping={
        "disable_automatic_rollback": "disableAutomaticRollback",
        "enable_automatic_os_upgrade": "enableAutomaticOsUpgrade",
    },
)
class LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy:
    def __init__(
        self,
        *,
        disable_automatic_rollback: builtins.bool,
        enable_automatic_os_upgrade: builtins.bool,
    ) -> None:
        """
        :param disable_automatic_rollback: -
        :param enable_automatic_os_upgrade: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "disable_automatic_rollback": disable_automatic_rollback,
            "enable_automatic_os_upgrade": enable_automatic_os_upgrade,
        }

    @builtins.property
    def disable_automatic_rollback(self) -> builtins.bool:
        result = self._values.get("disable_automatic_rollback")
        assert result is not None, "Required property 'disable_automatic_rollback' is missing"
        return result

    @builtins.property
    def enable_automatic_os_upgrade(self) -> builtins.bool:
        result = self._values.get("enable_automatic_os_upgrade")
        assert result is not None, "Required property 'enable_automatic_os_upgrade' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetBootDiagnostics",
    jsii_struct_bases=[],
    name_mapping={"storage_account_uri": "storageAccountUri"},
)
class LinuxVirtualMachineScaleSetBootDiagnostics:
    def __init__(
        self,
        *,
        storage_account_uri: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param storage_account_uri: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if storage_account_uri is not None:
            self._values["storage_account_uri"] = storage_account_uri

    @builtins.property
    def storage_account_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_uri")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetBootDiagnostics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "admin_username": "adminUsername",
        "instances": "instances",
        "location": "location",
        "name": "name",
        "network_interface": "networkInterface",
        "os_disk": "osDisk",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "additional_capabilities": "additionalCapabilities",
        "admin_password": "adminPassword",
        "admin_ssh_key": "adminSshKey",
        "automatic_instance_repair": "automaticInstanceRepair",
        "automatic_os_upgrade_policy": "automaticOsUpgradePolicy",
        "boot_diagnostics": "bootDiagnostics",
        "computer_name_prefix": "computerNamePrefix",
        "custom_data": "customData",
        "data_disk": "dataDisk",
        "disable_password_authentication": "disablePasswordAuthentication",
        "do_not_run_extensions_on_overprovisioned_machines": "doNotRunExtensionsOnOverprovisionedMachines",
        "encryption_at_host_enabled": "encryptionAtHostEnabled",
        "eviction_policy": "evictionPolicy",
        "extension": "extension",
        "health_probe_id": "healthProbeId",
        "identity": "identity",
        "max_bid_price": "maxBidPrice",
        "overprovision": "overprovision",
        "plan": "plan",
        "platform_fault_domain_count": "platformFaultDomainCount",
        "priority": "priority",
        "provision_vm_agent": "provisionVmAgent",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "rolling_upgrade_policy": "rollingUpgradePolicy",
        "scale_in_policy": "scaleInPolicy",
        "secret": "secret",
        "single_placement_group": "singlePlacementGroup",
        "source_image_id": "sourceImageId",
        "source_image_reference": "sourceImageReference",
        "tags": "tags",
        "terminate_notification": "terminateNotification",
        "timeouts": "timeouts",
        "upgrade_mode": "upgradeMode",
        "zone_balance": "zoneBalance",
        "zones": "zones",
    },
)
class LinuxVirtualMachineScaleSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        admin_username: builtins.str,
        instances: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        network_interface: typing.List["LinuxVirtualMachineScaleSetNetworkInterface"],
        os_disk: typing.List["LinuxVirtualMachineScaleSetOsDisk"],
        resource_group_name: builtins.str,
        sku: builtins.str,
        additional_capabilities: typing.Optional[typing.List[LinuxVirtualMachineScaleSetAdditionalCapabilities]] = None,
        admin_password: typing.Optional[builtins.str] = None,
        admin_ssh_key: typing.Optional[typing.List[LinuxVirtualMachineScaleSetAdminSshKey]] = None,
        automatic_instance_repair: typing.Optional[typing.List[LinuxVirtualMachineScaleSetAutomaticInstanceRepair]] = None,
        automatic_os_upgrade_policy: typing.Optional[typing.List[LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy]] = None,
        boot_diagnostics: typing.Optional[typing.List[LinuxVirtualMachineScaleSetBootDiagnostics]] = None,
        computer_name_prefix: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        data_disk: typing.Optional[typing.List["LinuxVirtualMachineScaleSetDataDisk"]] = None,
        disable_password_authentication: typing.Optional[builtins.bool] = None,
        do_not_run_extensions_on_overprovisioned_machines: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extension: typing.Optional[typing.List["LinuxVirtualMachineScaleSetExtension"]] = None,
        health_probe_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["LinuxVirtualMachineScaleSetIdentity"]] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        overprovision: typing.Optional[builtins.bool] = None,
        plan: typing.Optional[typing.List["LinuxVirtualMachineScaleSetPlan"]] = None,
        platform_fault_domain_count: typing.Optional[jsii.Number] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        rolling_upgrade_policy: typing.Optional[typing.List["LinuxVirtualMachineScaleSetRollingUpgradePolicy"]] = None,
        scale_in_policy: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["LinuxVirtualMachineScaleSetSecret"]] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["LinuxVirtualMachineScaleSetSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        terminate_notification: typing.Optional[typing.List["LinuxVirtualMachineScaleSetTerminateNotification"]] = None,
        timeouts: typing.Optional["LinuxVirtualMachineScaleSetTimeouts"] = None,
        upgrade_mode: typing.Optional[builtins.str] = None,
        zone_balance: typing.Optional[builtins.bool] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param admin_username: -
        :param instances: -
        :param location: -
        :param name: -
        :param network_interface: network_interface block.
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param sku: -
        :param additional_capabilities: additional_capabilities block.
        :param admin_password: -
        :param admin_ssh_key: admin_ssh_key block.
        :param automatic_instance_repair: automatic_instance_repair block.
        :param automatic_os_upgrade_policy: automatic_os_upgrade_policy block.
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name_prefix: -
        :param custom_data: -
        :param data_disk: data_disk block.
        :param disable_password_authentication: -
        :param do_not_run_extensions_on_overprovisioned_machines: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extension: extension block.
        :param health_probe_id: -
        :param identity: identity block.
        :param max_bid_price: -
        :param overprovision: -
        :param plan: plan block.
        :param platform_fault_domain_count: -
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param rolling_upgrade_policy: rolling_upgrade_policy block.
        :param scale_in_policy: -
        :param secret: secret block.
        :param single_placement_group: -
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param terminate_notification: terminate_notification block.
        :param timeouts: timeouts block.
        :param upgrade_mode: -
        :param zone_balance: -
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LinuxVirtualMachineScaleSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "admin_username": admin_username,
            "instances": instances,
            "location": location,
            "name": name,
            "network_interface": network_interface,
            "os_disk": os_disk,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_capabilities is not None:
            self._values["additional_capabilities"] = additional_capabilities
        if admin_password is not None:
            self._values["admin_password"] = admin_password
        if admin_ssh_key is not None:
            self._values["admin_ssh_key"] = admin_ssh_key
        if automatic_instance_repair is not None:
            self._values["automatic_instance_repair"] = automatic_instance_repair
        if automatic_os_upgrade_policy is not None:
            self._values["automatic_os_upgrade_policy"] = automatic_os_upgrade_policy
        if boot_diagnostics is not None:
            self._values["boot_diagnostics"] = boot_diagnostics
        if computer_name_prefix is not None:
            self._values["computer_name_prefix"] = computer_name_prefix
        if custom_data is not None:
            self._values["custom_data"] = custom_data
        if data_disk is not None:
            self._values["data_disk"] = data_disk
        if disable_password_authentication is not None:
            self._values["disable_password_authentication"] = disable_password_authentication
        if do_not_run_extensions_on_overprovisioned_machines is not None:
            self._values["do_not_run_extensions_on_overprovisioned_machines"] = do_not_run_extensions_on_overprovisioned_machines
        if encryption_at_host_enabled is not None:
            self._values["encryption_at_host_enabled"] = encryption_at_host_enabled
        if eviction_policy is not None:
            self._values["eviction_policy"] = eviction_policy
        if extension is not None:
            self._values["extension"] = extension
        if health_probe_id is not None:
            self._values["health_probe_id"] = health_probe_id
        if identity is not None:
            self._values["identity"] = identity
        if max_bid_price is not None:
            self._values["max_bid_price"] = max_bid_price
        if overprovision is not None:
            self._values["overprovision"] = overprovision
        if plan is not None:
            self._values["plan"] = plan
        if platform_fault_domain_count is not None:
            self._values["platform_fault_domain_count"] = platform_fault_domain_count
        if priority is not None:
            self._values["priority"] = priority
        if provision_vm_agent is not None:
            self._values["provision_vm_agent"] = provision_vm_agent
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if rolling_upgrade_policy is not None:
            self._values["rolling_upgrade_policy"] = rolling_upgrade_policy
        if scale_in_policy is not None:
            self._values["scale_in_policy"] = scale_in_policy
        if secret is not None:
            self._values["secret"] = secret
        if single_placement_group is not None:
            self._values["single_placement_group"] = single_placement_group
        if source_image_id is not None:
            self._values["source_image_id"] = source_image_id
        if source_image_reference is not None:
            self._values["source_image_reference"] = source_image_reference
        if tags is not None:
            self._values["tags"] = tags
        if terminate_notification is not None:
            self._values["terminate_notification"] = terminate_notification
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if upgrade_mode is not None:
            self._values["upgrade_mode"] = upgrade_mode
        if zone_balance is not None:
            self._values["zone_balance"] = zone_balance
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def instances(self) -> jsii.Number:
        result = self._values.get("instances")
        assert result is not None, "Required property 'instances' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_interface(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetNetworkInterface"]:
        """network_interface block."""
        result = self._values.get("network_interface")
        assert result is not None, "Required property 'network_interface' is missing"
        return result

    @builtins.property
    def os_disk(self) -> typing.List["LinuxVirtualMachineScaleSetOsDisk"]:
        """os_disk block."""
        result = self._values.get("os_disk")
        assert result is not None, "Required property 'os_disk' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def additional_capabilities(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineScaleSetAdditionalCapabilities]]:
        """additional_capabilities block."""
        result = self._values.get("additional_capabilities")
        return result

    @builtins.property
    def admin_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("admin_password")
        return result

    @builtins.property
    def admin_ssh_key(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineScaleSetAdminSshKey]]:
        """admin_ssh_key block."""
        result = self._values.get("admin_ssh_key")
        return result

    @builtins.property
    def automatic_instance_repair(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineScaleSetAutomaticInstanceRepair]]:
        """automatic_instance_repair block."""
        result = self._values.get("automatic_instance_repair")
        return result

    @builtins.property
    def automatic_os_upgrade_policy(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy]]:
        """automatic_os_upgrade_policy block."""
        result = self._values.get("automatic_os_upgrade_policy")
        return result

    @builtins.property
    def boot_diagnostics(
        self,
    ) -> typing.Optional[typing.List[LinuxVirtualMachineScaleSetBootDiagnostics]]:
        """boot_diagnostics block."""
        result = self._values.get("boot_diagnostics")
        return result

    @builtins.property
    def computer_name_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("computer_name_prefix")
        return result

    @builtins.property
    def custom_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_data")
        return result

    @builtins.property
    def data_disk(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetDataDisk"]]:
        """data_disk block."""
        result = self._values.get("data_disk")
        return result

    @builtins.property
    def disable_password_authentication(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disable_password_authentication")
        return result

    @builtins.property
    def do_not_run_extensions_on_overprovisioned_machines(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("do_not_run_extensions_on_overprovisioned_machines")
        return result

    @builtins.property
    def encryption_at_host_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encryption_at_host_enabled")
        return result

    @builtins.property
    def eviction_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eviction_policy")
        return result

    @builtins.property
    def extension(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetExtension"]]:
        """extension block."""
        result = self._values.get("extension")
        return result

    @builtins.property
    def health_probe_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("health_probe_id")
        return result

    @builtins.property
    def identity(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def max_bid_price(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_bid_price")
        return result

    @builtins.property
    def overprovision(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("overprovision")
        return result

    @builtins.property
    def plan(self) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetPlan"]]:
        """plan block."""
        result = self._values.get("plan")
        return result

    @builtins.property
    def platform_fault_domain_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("platform_fault_domain_count")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def provision_vm_agent(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("provision_vm_agent")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def rolling_upgrade_policy(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetRollingUpgradePolicy"]]:
        """rolling_upgrade_policy block."""
        result = self._values.get("rolling_upgrade_policy")
        return result

    @builtins.property
    def scale_in_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_in_policy")
        return result

    @builtins.property
    def secret(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetSecret"]]:
        """secret block."""
        result = self._values.get("secret")
        return result

    @builtins.property
    def single_placement_group(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("single_placement_group")
        return result

    @builtins.property
    def source_image_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_image_id")
        return result

    @builtins.property
    def source_image_reference(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetSourceImageReference"]]:
        """source_image_reference block."""
        result = self._values.get("source_image_reference")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def terminate_notification(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetTerminateNotification"]]:
        """terminate_notification block."""
        result = self._values.get("terminate_notification")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LinuxVirtualMachineScaleSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def upgrade_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("upgrade_mode")
        return result

    @builtins.property
    def zone_balance(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_balance")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetDataDisk",
    jsii_struct_bases=[],
    name_mapping={
        "caching": "caching",
        "disk_size_gb": "diskSizeGb",
        "lun": "lun",
        "storage_account_type": "storageAccountType",
        "create_option": "createOption",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "disk_iops_read_write": "diskIopsReadWrite",
        "disk_mbps_read_write": "diskMbpsReadWrite",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class LinuxVirtualMachineScaleSetDataDisk:
    def __init__(
        self,
        *,
        caching: builtins.str,
        disk_size_gb: jsii.Number,
        lun: jsii.Number,
        storage_account_type: builtins.str,
        create_option: typing.Optional[builtins.str] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_iops_read_write: typing.Optional[jsii.Number] = None,
        disk_mbps_read_write: typing.Optional[jsii.Number] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param caching: -
        :param disk_size_gb: -
        :param lun: -
        :param storage_account_type: -
        :param create_option: -
        :param disk_encryption_set_id: -
        :param disk_iops_read_write: -
        :param disk_mbps_read_write: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "caching": caching,
            "disk_size_gb": disk_size_gb,
            "lun": lun,
            "storage_account_type": storage_account_type,
        }
        if create_option is not None:
            self._values["create_option"] = create_option
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if disk_iops_read_write is not None:
            self._values["disk_iops_read_write"] = disk_iops_read_write
        if disk_mbps_read_write is not None:
            self._values["disk_mbps_read_write"] = disk_mbps_read_write
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def caching(self) -> builtins.str:
        result = self._values.get("caching")
        assert result is not None, "Required property 'caching' is missing"
        return result

    @builtins.property
    def disk_size_gb(self) -> jsii.Number:
        result = self._values.get("disk_size_gb")
        assert result is not None, "Required property 'disk_size_gb' is missing"
        return result

    @builtins.property
    def lun(self) -> jsii.Number:
        result = self._values.get("lun")
        assert result is not None, "Required property 'lun' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> builtins.str:
        result = self._values.get("storage_account_type")
        assert result is not None, "Required property 'storage_account_type' is missing"
        return result

    @builtins.property
    def create_option(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_option")
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def disk_iops_read_write(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_iops_read_write")
        return result

    @builtins.property
    def disk_mbps_read_write(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_mbps_read_write")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetDataDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetExtension",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "publisher": "publisher",
        "type": "type",
        "type_handler_version": "typeHandlerVersion",
        "auto_upgrade_minor_version": "autoUpgradeMinorVersion",
        "force_update_tag": "forceUpdateTag",
        "protected_settings": "protectedSettings",
        "provision_after_extensions": "provisionAfterExtensions",
        "settings": "settings",
    },
)
class LinuxVirtualMachineScaleSetExtension:
    def __init__(
        self,
        *,
        name: builtins.str,
        publisher: builtins.str,
        type: builtins.str,
        type_handler_version: builtins.str,
        auto_upgrade_minor_version: typing.Optional[builtins.bool] = None,
        force_update_tag: typing.Optional[builtins.str] = None,
        protected_settings: typing.Optional[builtins.str] = None,
        provision_after_extensions: typing.Optional[typing.List[builtins.str]] = None,
        settings: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param publisher: -
        :param type: -
        :param type_handler_version: -
        :param auto_upgrade_minor_version: -
        :param force_update_tag: -
        :param protected_settings: -
        :param provision_after_extensions: -
        :param settings: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "publisher": publisher,
            "type": type,
            "type_handler_version": type_handler_version,
        }
        if auto_upgrade_minor_version is not None:
            self._values["auto_upgrade_minor_version"] = auto_upgrade_minor_version
        if force_update_tag is not None:
            self._values["force_update_tag"] = force_update_tag
        if protected_settings is not None:
            self._values["protected_settings"] = protected_settings
        if provision_after_extensions is not None:
            self._values["provision_after_extensions"] = provision_after_extensions
        if settings is not None:
            self._values["settings"] = settings

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def type_handler_version(self) -> builtins.str:
        result = self._values.get("type_handler_version")
        assert result is not None, "Required property 'type_handler_version' is missing"
        return result

    @builtins.property
    def auto_upgrade_minor_version(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_upgrade_minor_version")
        return result

    @builtins.property
    def force_update_tag(self) -> typing.Optional[builtins.str]:
        result = self._values.get("force_update_tag")
        return result

    @builtins.property
    def protected_settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protected_settings")
        return result

    @builtins.property
    def provision_after_extensions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("provision_after_extensions")
        return result

    @builtins.property
    def settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("settings")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetExtension(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class LinuxVirtualMachineScaleSetIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetNetworkInterface",
    jsii_struct_bases=[],
    name_mapping={
        "ip_configuration": "ipConfiguration",
        "name": "name",
        "dns_servers": "dnsServers",
        "enable_accelerated_networking": "enableAcceleratedNetworking",
        "enable_ip_forwarding": "enableIpForwarding",
        "network_security_group_id": "networkSecurityGroupId",
        "primary": "primary",
    },
)
class LinuxVirtualMachineScaleSetNetworkInterface:
    def __init__(
        self,
        *,
        ip_configuration: typing.List["LinuxVirtualMachineScaleSetNetworkInterfaceIpConfiguration"],
        name: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        enable_accelerated_networking: typing.Optional[builtins.bool] = None,
        enable_ip_forwarding: typing.Optional[builtins.bool] = None,
        network_security_group_id: typing.Optional[builtins.str] = None,
        primary: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param ip_configuration: ip_configuration block.
        :param name: -
        :param dns_servers: -
        :param enable_accelerated_networking: -
        :param enable_ip_forwarding: -
        :param network_security_group_id: -
        :param primary: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "ip_configuration": ip_configuration,
            "name": name,
        }
        if dns_servers is not None:
            self._values["dns_servers"] = dns_servers
        if enable_accelerated_networking is not None:
            self._values["enable_accelerated_networking"] = enable_accelerated_networking
        if enable_ip_forwarding is not None:
            self._values["enable_ip_forwarding"] = enable_ip_forwarding
        if network_security_group_id is not None:
            self._values["network_security_group_id"] = network_security_group_id
        if primary is not None:
            self._values["primary"] = primary

    @builtins.property
    def ip_configuration(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetNetworkInterfaceIpConfiguration"]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        assert result is not None, "Required property 'ip_configuration' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def dns_servers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("dns_servers")
        return result

    @builtins.property
    def enable_accelerated_networking(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_accelerated_networking")
        return result

    @builtins.property
    def enable_ip_forwarding(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_ip_forwarding")
        return result

    @builtins.property
    def network_security_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("network_security_group_id")
        return result

    @builtins.property
    def primary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("primary")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetNetworkInterface(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetNetworkInterfaceIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "application_gateway_backend_address_pool_ids": "applicationGatewayBackendAddressPoolIds",
        "application_security_group_ids": "applicationSecurityGroupIds",
        "load_balancer_backend_address_pool_ids": "loadBalancerBackendAddressPoolIds",
        "load_balancer_inbound_nat_rules_ids": "loadBalancerInboundNatRulesIds",
        "primary": "primary",
        "public_ip_address": "publicIpAddress",
        "subnet_id": "subnetId",
        "version": "version",
    },
)
class LinuxVirtualMachineScaleSetNetworkInterfaceIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        application_gateway_backend_address_pool_ids: typing.Optional[typing.List[builtins.str]] = None,
        application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        load_balancer_backend_address_pool_ids: typing.Optional[typing.List[builtins.str]] = None,
        load_balancer_inbound_nat_rules_ids: typing.Optional[typing.List[builtins.str]] = None,
        primary: typing.Optional[builtins.bool] = None,
        public_ip_address: typing.Optional[typing.List["LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress"]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param application_gateway_backend_address_pool_ids: -
        :param application_security_group_ids: -
        :param load_balancer_backend_address_pool_ids: -
        :param load_balancer_inbound_nat_rules_ids: -
        :param primary: -
        :param public_ip_address: public_ip_address block.
        :param subnet_id: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if application_gateway_backend_address_pool_ids is not None:
            self._values["application_gateway_backend_address_pool_ids"] = application_gateway_backend_address_pool_ids
        if application_security_group_ids is not None:
            self._values["application_security_group_ids"] = application_security_group_ids
        if load_balancer_backend_address_pool_ids is not None:
            self._values["load_balancer_backend_address_pool_ids"] = load_balancer_backend_address_pool_ids
        if load_balancer_inbound_nat_rules_ids is not None:
            self._values["load_balancer_inbound_nat_rules_ids"] = load_balancer_inbound_nat_rules_ids
        if primary is not None:
            self._values["primary"] = primary
        if public_ip_address is not None:
            self._values["public_ip_address"] = public_ip_address
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def application_gateway_backend_address_pool_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("application_gateway_backend_address_pool_ids")
        return result

    @builtins.property
    def application_security_group_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("application_security_group_ids")
        return result

    @builtins.property
    def load_balancer_backend_address_pool_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("load_balancer_backend_address_pool_ids")
        return result

    @builtins.property
    def load_balancer_inbound_nat_rules_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("load_balancer_inbound_nat_rules_ids")
        return result

    @builtins.property
    def primary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("primary")
        return result

    @builtins.property
    def public_ip_address(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress"]]:
        """public_ip_address block."""
        result = self._values.get("public_ip_address")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetNetworkInterfaceIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "domain_name_label": "domainNameLabel",
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "ip_tag": "ipTag",
        "public_ip_prefix_id": "publicIpPrefixId",
    },
)
class LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress:
    def __init__(
        self,
        *,
        name: builtins.str,
        domain_name_label: typing.Optional[builtins.str] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        ip_tag: typing.Optional[typing.List["LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag"]] = None,
        public_ip_prefix_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param domain_name_label: -
        :param idle_timeout_in_minutes: -
        :param ip_tag: ip_tag block.
        :param public_ip_prefix_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if domain_name_label is not None:
            self._values["domain_name_label"] = domain_name_label
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if ip_tag is not None:
            self._values["ip_tag"] = ip_tag
        if public_ip_prefix_id is not None:
            self._values["public_ip_prefix_id"] = public_ip_prefix_id

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def domain_name_label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("domain_name_label")
        return result

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def ip_tag(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag"]]:
        """ip_tag block."""
        result = self._values.get("ip_tag")
        return result

    @builtins.property
    def public_ip_prefix_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_prefix_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag",
    jsii_struct_bases=[],
    name_mapping={"tag": "tag", "type": "type"},
)
class LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag:
    def __init__(self, *, tag: builtins.str, type: builtins.str) -> None:
        """
        :param tag: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "tag": tag,
            "type": type,
        }

    @builtins.property
    def tag(self) -> builtins.str:
        result = self._values.get("tag")
        assert result is not None, "Required property 'tag' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetOsDisk",
    jsii_struct_bases=[],
    name_mapping={
        "caching": "caching",
        "storage_account_type": "storageAccountType",
        "diff_disk_settings": "diffDiskSettings",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "disk_size_gb": "diskSizeGb",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class LinuxVirtualMachineScaleSetOsDisk:
    def __init__(
        self,
        *,
        caching: builtins.str,
        storage_account_type: builtins.str,
        diff_disk_settings: typing.Optional[typing.List["LinuxVirtualMachineScaleSetOsDiskDiffDiskSettings"]] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param caching: -
        :param storage_account_type: -
        :param diff_disk_settings: diff_disk_settings block.
        :param disk_encryption_set_id: -
        :param disk_size_gb: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "caching": caching,
            "storage_account_type": storage_account_type,
        }
        if diff_disk_settings is not None:
            self._values["diff_disk_settings"] = diff_disk_settings
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def caching(self) -> builtins.str:
        result = self._values.get("caching")
        assert result is not None, "Required property 'caching' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> builtins.str:
        result = self._values.get("storage_account_type")
        assert result is not None, "Required property 'storage_account_type' is missing"
        return result

    @builtins.property
    def diff_disk_settings(
        self,
    ) -> typing.Optional[typing.List["LinuxVirtualMachineScaleSetOsDiskDiffDiskSettings"]]:
        """diff_disk_settings block."""
        result = self._values.get("diff_disk_settings")
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetOsDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetOsDiskDiffDiskSettings",
    jsii_struct_bases=[],
    name_mapping={"option": "option"},
)
class LinuxVirtualMachineScaleSetOsDiskDiffDiskSettings:
    def __init__(self, *, option: builtins.str) -> None:
        """
        :param option: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "option": option,
        }

    @builtins.property
    def option(self) -> builtins.str:
        result = self._values.get("option")
        assert result is not None, "Required property 'option' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetOsDiskDiffDiskSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetPlan",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "product": "product", "publisher": "publisher"},
)
class LinuxVirtualMachineScaleSetPlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: builtins.str,
        publisher: builtins.str,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "product": product,
            "publisher": publisher,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetPlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetRollingUpgradePolicy",
    jsii_struct_bases=[],
    name_mapping={
        "max_batch_instance_percent": "maxBatchInstancePercent",
        "max_unhealthy_instance_percent": "maxUnhealthyInstancePercent",
        "max_unhealthy_upgraded_instance_percent": "maxUnhealthyUpgradedInstancePercent",
        "pause_time_between_batches": "pauseTimeBetweenBatches",
    },
)
class LinuxVirtualMachineScaleSetRollingUpgradePolicy:
    def __init__(
        self,
        *,
        max_batch_instance_percent: jsii.Number,
        max_unhealthy_instance_percent: jsii.Number,
        max_unhealthy_upgraded_instance_percent: jsii.Number,
        pause_time_between_batches: builtins.str,
    ) -> None:
        """
        :param max_batch_instance_percent: -
        :param max_unhealthy_instance_percent: -
        :param max_unhealthy_upgraded_instance_percent: -
        :param pause_time_between_batches: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "max_batch_instance_percent": max_batch_instance_percent,
            "max_unhealthy_instance_percent": max_unhealthy_instance_percent,
            "max_unhealthy_upgraded_instance_percent": max_unhealthy_upgraded_instance_percent,
            "pause_time_between_batches": pause_time_between_batches,
        }

    @builtins.property
    def max_batch_instance_percent(self) -> jsii.Number:
        result = self._values.get("max_batch_instance_percent")
        assert result is not None, "Required property 'max_batch_instance_percent' is missing"
        return result

    @builtins.property
    def max_unhealthy_instance_percent(self) -> jsii.Number:
        result = self._values.get("max_unhealthy_instance_percent")
        assert result is not None, "Required property 'max_unhealthy_instance_percent' is missing"
        return result

    @builtins.property
    def max_unhealthy_upgraded_instance_percent(self) -> jsii.Number:
        result = self._values.get("max_unhealthy_upgraded_instance_percent")
        assert result is not None, "Required property 'max_unhealthy_upgraded_instance_percent' is missing"
        return result

    @builtins.property
    def pause_time_between_batches(self) -> builtins.str:
        result = self._values.get("pause_time_between_batches")
        assert result is not None, "Required property 'pause_time_between_batches' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetRollingUpgradePolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetSecret",
    jsii_struct_bases=[],
    name_mapping={"certificate": "certificate", "key_vault_id": "keyVaultId"},
)
class LinuxVirtualMachineScaleSetSecret:
    def __init__(
        self,
        *,
        certificate: typing.List["LinuxVirtualMachineScaleSetSecretCertificate"],
        key_vault_id: builtins.str,
    ) -> None:
        """
        :param certificate: certificate block.
        :param key_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate": certificate,
            "key_vault_id": key_vault_id,
        }

    @builtins.property
    def certificate(
        self,
    ) -> typing.List["LinuxVirtualMachineScaleSetSecretCertificate"]:
        """certificate block."""
        result = self._values.get("certificate")
        assert result is not None, "Required property 'certificate' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetSecret(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetSecretCertificate",
    jsii_struct_bases=[],
    name_mapping={"url": "url"},
)
class LinuxVirtualMachineScaleSetSecretCertificate:
    def __init__(self, *, url: builtins.str) -> None:
        """
        :param url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "url": url,
        }

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetSecretCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetSourceImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class LinuxVirtualMachineScaleSetSourceImageReference:
    def __init__(
        self,
        *,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        version: builtins.str,
    ) -> None:
        """
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
            "version": version,
        }

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetSourceImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetTerminateNotification",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "timeout": "timeout"},
)
class LinuxVirtualMachineScaleSetTerminateNotification:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        timeout: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param timeout: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if timeout is not None:
            self._values["timeout"] = timeout

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def timeout(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timeout")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetTerminateNotification(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineScaleSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LinuxVirtualMachineScaleSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineScaleSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineSecret",
    jsii_struct_bases=[],
    name_mapping={"certificate": "certificate", "key_vault_id": "keyVaultId"},
)
class LinuxVirtualMachineSecret:
    def __init__(
        self,
        *,
        certificate: typing.List["LinuxVirtualMachineSecretCertificate"],
        key_vault_id: builtins.str,
    ) -> None:
        """
        :param certificate: certificate block.
        :param key_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate": certificate,
            "key_vault_id": key_vault_id,
        }

    @builtins.property
    def certificate(self) -> typing.List["LinuxVirtualMachineSecretCertificate"]:
        """certificate block."""
        result = self._values.get("certificate")
        assert result is not None, "Required property 'certificate' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineSecret(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineSecretCertificate",
    jsii_struct_bases=[],
    name_mapping={"url": "url"},
)
class LinuxVirtualMachineSecretCertificate:
    def __init__(self, *, url: builtins.str) -> None:
        """
        :param url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "url": url,
        }

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineSecretCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineSourceImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class LinuxVirtualMachineSourceImageReference:
    def __init__(
        self,
        *,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        version: builtins.str,
    ) -> None:
        """
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
            "version": version,
        }

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineSourceImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LinuxVirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LinuxVirtualMachineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LinuxVirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LocalNetworkGateway(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LocalNetworkGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        address_space: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        bgp_settings: typing.Optional[typing.List["LocalNetworkGatewayBgpSettings"]] = None,
        gateway_address: typing.Optional[builtins.str] = None,
        gateway_fqdn: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LocalNetworkGatewayTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param address_space: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param bgp_settings: bgp_settings block.
        :param gateway_address: -
        :param gateway_fqdn: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LocalNetworkGatewayConfig(
            address_space=address_space,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            bgp_settings=bgp_settings,
            gateway_address=gateway_address,
            gateway_fqdn=gateway_fqdn,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LocalNetworkGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetBgpSettings")
    def reset_bgp_settings(self) -> None:
        return jsii.invoke(self, "resetBgpSettings", [])

    @jsii.member(jsii_name="resetGatewayAddress")
    def reset_gateway_address(self) -> None:
        return jsii.invoke(self, "resetGatewayAddress", [])

    @jsii.member(jsii_name="resetGatewayFqdn")
    def reset_gateway_fqdn(self) -> None:
        return jsii.invoke(self, "resetGatewayFqdn", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressSpaceInput")
    def address_space_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressSpaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpSettingsInput")
    def bgp_settings_input(
        self,
    ) -> typing.Optional[typing.List["LocalNetworkGatewayBgpSettings"]]:
        return jsii.get(self, "bgpSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayAddressInput")
    def gateway_address_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "gatewayAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayFqdnInput")
    def gateway_fqdn_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "gatewayFqdnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LocalNetworkGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressSpace")
    def address_space(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressSpace")

    @address_space.setter # type: ignore
    def address_space(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "addressSpace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpSettings")
    def bgp_settings(self) -> typing.List["LocalNetworkGatewayBgpSettings"]:
        return jsii.get(self, "bgpSettings")

    @bgp_settings.setter # type: ignore
    def bgp_settings(
        self,
        value: typing.List["LocalNetworkGatewayBgpSettings"],
    ) -> None:
        jsii.set(self, "bgpSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayAddress")
    def gateway_address(self) -> builtins.str:
        return jsii.get(self, "gatewayAddress")

    @gateway_address.setter # type: ignore
    def gateway_address(self, value: builtins.str) -> None:
        jsii.set(self, "gatewayAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gatewayFqdn")
    def gateway_fqdn(self) -> builtins.str:
        return jsii.get(self, "gatewayFqdn")

    @gateway_fqdn.setter # type: ignore
    def gateway_fqdn(self, value: builtins.str) -> None:
        jsii.set(self, "gatewayFqdn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LocalNetworkGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LocalNetworkGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LocalNetworkGatewayBgpSettings",
    jsii_struct_bases=[],
    name_mapping={
        "asn": "asn",
        "bgp_peering_address": "bgpPeeringAddress",
        "peer_weight": "peerWeight",
    },
)
class LocalNetworkGatewayBgpSettings:
    def __init__(
        self,
        *,
        asn: jsii.Number,
        bgp_peering_address: builtins.str,
        peer_weight: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param asn: -
        :param bgp_peering_address: -
        :param peer_weight: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "asn": asn,
            "bgp_peering_address": bgp_peering_address,
        }
        if peer_weight is not None:
            self._values["peer_weight"] = peer_weight

    @builtins.property
    def asn(self) -> jsii.Number:
        result = self._values.get("asn")
        assert result is not None, "Required property 'asn' is missing"
        return result

    @builtins.property
    def bgp_peering_address(self) -> builtins.str:
        result = self._values.get("bgp_peering_address")
        assert result is not None, "Required property 'bgp_peering_address' is missing"
        return result

    @builtins.property
    def peer_weight(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("peer_weight")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LocalNetworkGatewayBgpSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LocalNetworkGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "address_space": "addressSpace",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "bgp_settings": "bgpSettings",
        "gateway_address": "gatewayAddress",
        "gateway_fqdn": "gatewayFqdn",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LocalNetworkGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        address_space: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        bgp_settings: typing.Optional[typing.List[LocalNetworkGatewayBgpSettings]] = None,
        gateway_address: typing.Optional[builtins.str] = None,
        gateway_fqdn: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LocalNetworkGatewayTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param address_space: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param bgp_settings: bgp_settings block.
        :param gateway_address: -
        :param gateway_fqdn: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LocalNetworkGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "address_space": address_space,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if bgp_settings is not None:
            self._values["bgp_settings"] = bgp_settings
        if gateway_address is not None:
            self._values["gateway_address"] = gateway_address
        if gateway_fqdn is not None:
            self._values["gateway_fqdn"] = gateway_fqdn
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def address_space(self) -> typing.List[builtins.str]:
        result = self._values.get("address_space")
        assert result is not None, "Required property 'address_space' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def bgp_settings(
        self,
    ) -> typing.Optional[typing.List[LocalNetworkGatewayBgpSettings]]:
        """bgp_settings block."""
        result = self._values.get("bgp_settings")
        return result

    @builtins.property
    def gateway_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("gateway_address")
        return result

    @builtins.property
    def gateway_fqdn(self) -> typing.Optional[builtins.str]:
        result = self._values.get("gateway_fqdn")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LocalNetworkGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LocalNetworkGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LocalNetworkGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LocalNetworkGatewayTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LocalNetworkGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        identity: typing.List["LogAnalyticsClusterIdentity"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        size_gb: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param identity: identity block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param size_gb: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsClusterConfig(
            identity=identity,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            size_gb=size_gb,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetSizeGb")
    def reset_size_gb(self) -> None:
        return jsii.invoke(self, "resetSizeGb", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterId")
    def cluster_id(self) -> builtins.str:
        return jsii.get(self, "clusterId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.List["LogAnalyticsClusterIdentity"]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeGbInput")
    def size_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "sizeGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogAnalyticsClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["LogAnalyticsClusterIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["LogAnalyticsClusterIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeGb")
    def size_gb(self) -> jsii.Number:
        return jsii.get(self, "sizeGb")

    @size_gb.setter # type: ignore
    def size_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "sizeGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "identity": "identity",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "size_gb": "sizeGb",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        identity: typing.List["LogAnalyticsClusterIdentity"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        size_gb: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param identity: identity block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param size_gb: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "identity": identity,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if size_gb is not None:
            self._values["size_gb"] = size_gb
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def identity(self) -> typing.List["LogAnalyticsClusterIdentity"]:
        """identity block."""
        result = self._values.get("identity")
        assert result is not None, "Required property 'identity' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("size_gb")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsClusterCustomerManagedKey(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsClusterCustomerManagedKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_key_id: builtins.str,
        log_analytics_cluster_id: builtins.str,
        timeouts: typing.Optional["LogAnalyticsClusterCustomerManagedKeyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_key_id: -
        :param log_analytics_cluster_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsClusterCustomerManagedKeyConfig(
            key_vault_key_id=key_vault_key_id,
            log_analytics_cluster_id=log_analytics_cluster_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsClusterCustomerManagedKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyIdInput")
    def key_vault_key_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsClusterIdInput")
    def log_analytics_cluster_id_input(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsClusterIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["LogAnalyticsClusterCustomerManagedKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @key_vault_key_id.setter # type: ignore
    def key_vault_key_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultKeyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsClusterId")
    def log_analytics_cluster_id(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsClusterId")

    @log_analytics_cluster_id.setter # type: ignore
    def log_analytics_cluster_id(self, value: builtins.str) -> None:
        jsii.set(self, "logAnalyticsClusterId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsClusterCustomerManagedKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsClusterCustomerManagedKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsClusterCustomerManagedKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_key_id": "keyVaultKeyId",
        "log_analytics_cluster_id": "logAnalyticsClusterId",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsClusterCustomerManagedKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_key_id: builtins.str,
        log_analytics_cluster_id: builtins.str,
        timeouts: typing.Optional["LogAnalyticsClusterCustomerManagedKeyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_key_id: -
        :param log_analytics_cluster_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsClusterCustomerManagedKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_key_id": key_vault_key_id,
            "log_analytics_cluster_id": log_analytics_cluster_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_key_id(self) -> builtins.str:
        result = self._values.get("key_vault_key_id")
        assert result is not None, "Required property 'key_vault_key_id' is missing"
        return result

    @builtins.property
    def log_analytics_cluster_id(self) -> builtins.str:
        result = self._values.get("log_analytics_cluster_id")
        assert result is not None, "Required property 'log_analytics_cluster_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["LogAnalyticsClusterCustomerManagedKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsClusterCustomerManagedKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsClusterCustomerManagedKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsClusterCustomerManagedKeyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsClusterCustomerManagedKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsClusterIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class LogAnalyticsClusterIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsClusterIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsDataExportRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsDataExportRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        destination_resource_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        table_names: typing.List[builtins.str],
        workspace_resource_id: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["LogAnalyticsDataExportRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param destination_resource_id: -
        :param name: -
        :param resource_group_name: -
        :param table_names: -
        :param workspace_resource_id: -
        :param enabled: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsDataExportRuleConfig(
            destination_resource_id=destination_resource_id,
            name=name,
            resource_group_name=resource_group_name,
            table_names=table_names,
            workspace_resource_id=workspace_resource_id,
            enabled=enabled,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsDataExportRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationResourceIdInput")
    def destination_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "destinationResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="exportRuleId")
    def export_rule_id(self) -> builtins.str:
        return jsii.get(self, "exportRuleId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNamesInput")
    def table_names_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "tableNamesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceResourceIdInput")
    def workspace_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "workspaceResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogAnalyticsDataExportRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationResourceId")
    def destination_resource_id(self) -> builtins.str:
        return jsii.get(self, "destinationResourceId")

    @destination_resource_id.setter # type: ignore
    def destination_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "destinationResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNames")
    def table_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "tableNames")

    @table_names.setter # type: ignore
    def table_names(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "tableNames", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsDataExportRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsDataExportRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceResourceId")
    def workspace_resource_id(self) -> builtins.str:
        return jsii.get(self, "workspaceResourceId")

    @workspace_resource_id.setter # type: ignore
    def workspace_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceResourceId", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsDataExportRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "destination_resource_id": "destinationResourceId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "table_names": "tableNames",
        "workspace_resource_id": "workspaceResourceId",
        "enabled": "enabled",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsDataExportRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        destination_resource_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        table_names: typing.List[builtins.str],
        workspace_resource_id: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["LogAnalyticsDataExportRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param destination_resource_id: -
        :param name: -
        :param resource_group_name: -
        :param table_names: -
        :param workspace_resource_id: -
        :param enabled: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsDataExportRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "destination_resource_id": destination_resource_id,
            "name": name,
            "resource_group_name": resource_group_name,
            "table_names": table_names,
            "workspace_resource_id": workspace_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enabled is not None:
            self._values["enabled"] = enabled
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def destination_resource_id(self) -> builtins.str:
        result = self._values.get("destination_resource_id")
        assert result is not None, "Required property 'destination_resource_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def table_names(self) -> typing.List[builtins.str]:
        result = self._values.get("table_names")
        assert result is not None, "Required property 'table_names' is missing"
        return result

    @builtins.property
    def workspace_resource_id(self) -> builtins.str:
        result = self._values.get("workspace_resource_id")
        assert result is not None, "Required property 'workspace_resource_id' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsDataExportRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsDataExportRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsDataExportRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsDataExportRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsDataExportRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsDatasourceWindowsEvent(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsDatasourceWindowsEvent",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        event_log_name: builtins.str,
        event_types: typing.List[builtins.str],
        name: builtins.str,
        resource_group_name: builtins.str,
        workspace_name: builtins.str,
        timeouts: typing.Optional["LogAnalyticsDatasourceWindowsEventTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param event_log_name: -
        :param event_types: -
        :param name: -
        :param resource_group_name: -
        :param workspace_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsDatasourceWindowsEventConfig(
            event_log_name=event_log_name,
            event_types=event_types,
            name=name,
            resource_group_name=resource_group_name,
            workspace_name=workspace_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsDatasourceWindowsEvent, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventLogNameInput")
    def event_log_name_input(self) -> builtins.str:
        return jsii.get(self, "eventLogNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventTypesInput")
    def event_types_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "eventTypesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceNameInput")
    def workspace_name_input(self) -> builtins.str:
        return jsii.get(self, "workspaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["LogAnalyticsDatasourceWindowsEventTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventLogName")
    def event_log_name(self) -> builtins.str:
        return jsii.get(self, "eventLogName")

    @event_log_name.setter # type: ignore
    def event_log_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventLogName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventTypes")
    def event_types(self) -> typing.List[builtins.str]:
        return jsii.get(self, "eventTypes")

    @event_types.setter # type: ignore
    def event_types(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "eventTypes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsDatasourceWindowsEventTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsDatasourceWindowsEventTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceName")
    def workspace_name(self) -> builtins.str:
        return jsii.get(self, "workspaceName")

    @workspace_name.setter # type: ignore
    def workspace_name(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceName", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsDatasourceWindowsEventConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "event_log_name": "eventLogName",
        "event_types": "eventTypes",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "workspace_name": "workspaceName",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsDatasourceWindowsEventConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        event_log_name: builtins.str,
        event_types: typing.List[builtins.str],
        name: builtins.str,
        resource_group_name: builtins.str,
        workspace_name: builtins.str,
        timeouts: typing.Optional["LogAnalyticsDatasourceWindowsEventTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param event_log_name: -
        :param event_types: -
        :param name: -
        :param resource_group_name: -
        :param workspace_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsDatasourceWindowsEventTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "event_log_name": event_log_name,
            "event_types": event_types,
            "name": name,
            "resource_group_name": resource_group_name,
            "workspace_name": workspace_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def event_log_name(self) -> builtins.str:
        result = self._values.get("event_log_name")
        assert result is not None, "Required property 'event_log_name' is missing"
        return result

    @builtins.property
    def event_types(self) -> typing.List[builtins.str]:
        result = self._values.get("event_types")
        assert result is not None, "Required property 'event_types' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def workspace_name(self) -> builtins.str:
        result = self._values.get("workspace_name")
        assert result is not None, "Required property 'workspace_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsDatasourceWindowsEventTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsDatasourceWindowsEventConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsDatasourceWindowsEventTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsDatasourceWindowsEventTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsDatasourceWindowsEventTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsDatasourceWindowsPerformanceCounter(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsDatasourceWindowsPerformanceCounter",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        counter_name: builtins.str,
        instance_name: builtins.str,
        interval_seconds: jsii.Number,
        name: builtins.str,
        object_name: builtins.str,
        resource_group_name: builtins.str,
        workspace_name: builtins.str,
        timeouts: typing.Optional["LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param counter_name: -
        :param instance_name: -
        :param interval_seconds: -
        :param name: -
        :param object_name: -
        :param resource_group_name: -
        :param workspace_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsDatasourceWindowsPerformanceCounterConfig(
            counter_name=counter_name,
            instance_name=instance_name,
            interval_seconds=interval_seconds,
            name=name,
            object_name=object_name,
            resource_group_name=resource_group_name,
            workspace_name=workspace_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsDatasourceWindowsPerformanceCounter, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="counterNameInput")
    def counter_name_input(self) -> builtins.str:
        return jsii.get(self, "counterNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instanceNameInput")
    def instance_name_input(self) -> builtins.str:
        return jsii.get(self, "instanceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalSecondsInput")
    def interval_seconds_input(self) -> jsii.Number:
        return jsii.get(self, "intervalSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectNameInput")
    def object_name_input(self) -> builtins.str:
        return jsii.get(self, "objectNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceNameInput")
    def workspace_name_input(self) -> builtins.str:
        return jsii.get(self, "workspaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="counterName")
    def counter_name(self) -> builtins.str:
        return jsii.get(self, "counterName")

    @counter_name.setter # type: ignore
    def counter_name(self, value: builtins.str) -> None:
        jsii.set(self, "counterName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instanceName")
    def instance_name(self) -> builtins.str:
        return jsii.get(self, "instanceName")

    @instance_name.setter # type: ignore
    def instance_name(self, value: builtins.str) -> None:
        jsii.set(self, "instanceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalSeconds")
    def interval_seconds(self) -> jsii.Number:
        return jsii.get(self, "intervalSeconds")

    @interval_seconds.setter # type: ignore
    def interval_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "intervalSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectName")
    def object_name(self) -> builtins.str:
        return jsii.get(self, "objectName")

    @object_name.setter # type: ignore
    def object_name(self, value: builtins.str) -> None:
        jsii.set(self, "objectName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceName")
    def workspace_name(self) -> builtins.str:
        return jsii.get(self, "workspaceName")

    @workspace_name.setter # type: ignore
    def workspace_name(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceName", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsDatasourceWindowsPerformanceCounterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "counter_name": "counterName",
        "instance_name": "instanceName",
        "interval_seconds": "intervalSeconds",
        "name": "name",
        "object_name": "objectName",
        "resource_group_name": "resourceGroupName",
        "workspace_name": "workspaceName",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsDatasourceWindowsPerformanceCounterConfig(
    cdktf.TerraformMetaArguments,
):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        counter_name: builtins.str,
        instance_name: builtins.str,
        interval_seconds: jsii.Number,
        name: builtins.str,
        object_name: builtins.str,
        resource_group_name: builtins.str,
        workspace_name: builtins.str,
        timeouts: typing.Optional["LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param counter_name: -
        :param instance_name: -
        :param interval_seconds: -
        :param name: -
        :param object_name: -
        :param resource_group_name: -
        :param workspace_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "counter_name": counter_name,
            "instance_name": instance_name,
            "interval_seconds": interval_seconds,
            "name": name,
            "object_name": object_name,
            "resource_group_name": resource_group_name,
            "workspace_name": workspace_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def counter_name(self) -> builtins.str:
        result = self._values.get("counter_name")
        assert result is not None, "Required property 'counter_name' is missing"
        return result

    @builtins.property
    def instance_name(self) -> builtins.str:
        result = self._values.get("instance_name")
        assert result is not None, "Required property 'instance_name' is missing"
        return result

    @builtins.property
    def interval_seconds(self) -> jsii.Number:
        result = self._values.get("interval_seconds")
        assert result is not None, "Required property 'interval_seconds' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def object_name(self) -> builtins.str:
        result = self._values.get("object_name")
        assert result is not None, "Required property 'object_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def workspace_name(self) -> builtins.str:
        result = self._values.get("workspace_name")
        assert result is not None, "Required property 'workspace_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsDatasourceWindowsPerformanceCounterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsLinkedService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsLinkedService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        resource_group_name: builtins.str,
        resource_id: builtins.str,
        workspace_name: builtins.str,
        linked_service_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsLinkedServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param resource_group_name: -
        :param resource_id: -
        :param workspace_name: -
        :param linked_service_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsLinkedServiceConfig(
            resource_group_name=resource_group_name,
            resource_id=resource_id,
            workspace_name=workspace_name,
            linked_service_name=linked_service_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsLinkedService, self, [scope, id, config])

    @jsii.member(jsii_name="resetLinkedServiceName")
    def reset_linked_service_name(self) -> None:
        return jsii.invoke(self, "resetLinkedServiceName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceIdInput")
    def resource_id_input(self) -> builtins.str:
        return jsii.get(self, "resourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceNameInput")
    def workspace_name_input(self) -> builtins.str:
        return jsii.get(self, "workspaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceNameInput")
    def linked_service_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "linkedServiceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogAnalyticsLinkedServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedServiceName")
    def linked_service_name(self) -> builtins.str:
        return jsii.get(self, "linkedServiceName")

    @linked_service_name.setter # type: ignore
    def linked_service_name(self, value: builtins.str) -> None:
        jsii.set(self, "linkedServiceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceId")
    def resource_id(self) -> builtins.str:
        return jsii.get(self, "resourceId")

    @resource_id.setter # type: ignore
    def resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "resourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsLinkedServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsLinkedServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceName")
    def workspace_name(self) -> builtins.str:
        return jsii.get(self, "workspaceName")

    @workspace_name.setter # type: ignore
    def workspace_name(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceName", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsLinkedServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "resource_group_name": "resourceGroupName",
        "resource_id": "resourceId",
        "workspace_name": "workspaceName",
        "linked_service_name": "linkedServiceName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsLinkedServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        resource_group_name: builtins.str,
        resource_id: builtins.str,
        workspace_name: builtins.str,
        linked_service_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsLinkedServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param resource_group_name: -
        :param resource_id: -
        :param workspace_name: -
        :param linked_service_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsLinkedServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "resource_group_name": resource_group_name,
            "resource_id": resource_id,
            "workspace_name": workspace_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if linked_service_name is not None:
            self._values["linked_service_name"] = linked_service_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def resource_id(self) -> builtins.str:
        result = self._values.get("resource_id")
        assert result is not None, "Required property 'resource_id' is missing"
        return result

    @builtins.property
    def workspace_name(self) -> builtins.str:
        result = self._values.get("workspace_name")
        assert result is not None, "Required property 'workspace_name' is missing"
        return result

    @builtins.property
    def linked_service_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("linked_service_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsLinkedServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsLinkedServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsLinkedServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsLinkedServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsLinkedServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsLinkedStorageAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsLinkedStorageAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        data_source_type: builtins.str,
        resource_group_name: builtins.str,
        storage_account_ids: typing.List[builtins.str],
        workspace_resource_id: builtins.str,
        timeouts: typing.Optional["LogAnalyticsLinkedStorageAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param data_source_type: -
        :param resource_group_name: -
        :param storage_account_ids: -
        :param workspace_resource_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsLinkedStorageAccountConfig(
            data_source_type=data_source_type,
            resource_group_name=resource_group_name,
            storage_account_ids=storage_account_ids,
            workspace_resource_id=workspace_resource_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsLinkedStorageAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceTypeInput")
    def data_source_type_input(self) -> builtins.str:
        return jsii.get(self, "dataSourceTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdsInput")
    def storage_account_ids_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "storageAccountIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceResourceIdInput")
    def workspace_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "workspaceResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["LogAnalyticsLinkedStorageAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceType")
    def data_source_type(self) -> builtins.str:
        return jsii.get(self, "dataSourceType")

    @data_source_type.setter # type: ignore
    def data_source_type(self, value: builtins.str) -> None:
        jsii.set(self, "dataSourceType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIds")
    def storage_account_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "storageAccountIds")

    @storage_account_ids.setter # type: ignore
    def storage_account_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "storageAccountIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsLinkedStorageAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsLinkedStorageAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceResourceId")
    def workspace_resource_id(self) -> builtins.str:
        return jsii.get(self, "workspaceResourceId")

    @workspace_resource_id.setter # type: ignore
    def workspace_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceResourceId", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsLinkedStorageAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "data_source_type": "dataSourceType",
        "resource_group_name": "resourceGroupName",
        "storage_account_ids": "storageAccountIds",
        "workspace_resource_id": "workspaceResourceId",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsLinkedStorageAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        data_source_type: builtins.str,
        resource_group_name: builtins.str,
        storage_account_ids: typing.List[builtins.str],
        workspace_resource_id: builtins.str,
        timeouts: typing.Optional["LogAnalyticsLinkedStorageAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_source_type: -
        :param resource_group_name: -
        :param storage_account_ids: -
        :param workspace_resource_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsLinkedStorageAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "data_source_type": data_source_type,
            "resource_group_name": resource_group_name,
            "storage_account_ids": storage_account_ids,
            "workspace_resource_id": workspace_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def data_source_type(self) -> builtins.str:
        result = self._values.get("data_source_type")
        assert result is not None, "Required property 'data_source_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("storage_account_ids")
        assert result is not None, "Required property 'storage_account_ids' is missing"
        return result

    @builtins.property
    def workspace_resource_id(self) -> builtins.str:
        result = self._values.get("workspace_resource_id")
        assert result is not None, "Required property 'workspace_resource_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsLinkedStorageAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsLinkedStorageAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsLinkedStorageAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsLinkedStorageAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsLinkedStorageAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsSavedSearch(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsSavedSearch",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        category: builtins.str,
        display_name: builtins.str,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        query: builtins.str,
        function_alias: typing.Optional[builtins.str] = None,
        function_parameters: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsSavedSearchTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param category: -
        :param display_name: -
        :param log_analytics_workspace_id: -
        :param name: -
        :param query: -
        :param function_alias: -
        :param function_parameters: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsSavedSearchConfig(
            category=category,
            display_name=display_name,
            log_analytics_workspace_id=log_analytics_workspace_id,
            name=name,
            query=query,
            function_alias=function_alias,
            function_parameters=function_parameters,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsSavedSearch, self, [scope, id, config])

    @jsii.member(jsii_name="resetFunctionAlias")
    def reset_function_alias(self) -> None:
        return jsii.invoke(self, "resetFunctionAlias", [])

    @jsii.member(jsii_name="resetFunctionParameters")
    def reset_function_parameters(self) -> None:
        return jsii.invoke(self, "resetFunctionParameters", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="categoryInput")
    def category_input(self) -> builtins.str:
        return jsii.get(self, "categoryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceIdInput")
    def log_analytics_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryInput")
    def query_input(self) -> builtins.str:
        return jsii.get(self, "queryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionAliasInput")
    def function_alias_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "functionAliasInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionParametersInput")
    def function_parameters_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "functionParametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogAnalyticsSavedSearchTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="category")
    def category(self) -> builtins.str:
        return jsii.get(self, "category")

    @category.setter # type: ignore
    def category(self, value: builtins.str) -> None:
        jsii.set(self, "category", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionAlias")
    def function_alias(self) -> builtins.str:
        return jsii.get(self, "functionAlias")

    @function_alias.setter # type: ignore
    def function_alias(self, value: builtins.str) -> None:
        jsii.set(self, "functionAlias", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="functionParameters")
    def function_parameters(self) -> typing.List[builtins.str]:
        return jsii.get(self, "functionParameters")

    @function_parameters.setter # type: ignore
    def function_parameters(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "functionParameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceId")
    def log_analytics_workspace_id(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceId")

    @log_analytics_workspace_id.setter # type: ignore
    def log_analytics_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "logAnalyticsWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="query")
    def query(self) -> builtins.str:
        return jsii.get(self, "query")

    @query.setter # type: ignore
    def query(self, value: builtins.str) -> None:
        jsii.set(self, "query", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsSavedSearchTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsSavedSearchTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsSavedSearchConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "category": "category",
        "display_name": "displayName",
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "name": "name",
        "query": "query",
        "function_alias": "functionAlias",
        "function_parameters": "functionParameters",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsSavedSearchConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        category: builtins.str,
        display_name: builtins.str,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        query: builtins.str,
        function_alias: typing.Optional[builtins.str] = None,
        function_parameters: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsSavedSearchTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param category: -
        :param display_name: -
        :param log_analytics_workspace_id: -
        :param name: -
        :param query: -
        :param function_alias: -
        :param function_parameters: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsSavedSearchTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "category": category,
            "display_name": display_name,
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "name": name,
            "query": query,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if function_alias is not None:
            self._values["function_alias"] = function_alias
        if function_parameters is not None:
            self._values["function_parameters"] = function_parameters
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def category(self) -> builtins.str:
        result = self._values.get("category")
        assert result is not None, "Required property 'category' is missing"
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def query(self) -> builtins.str:
        result = self._values.get("query")
        assert result is not None, "Required property 'query' is missing"
        return result

    @builtins.property
    def function_alias(self) -> typing.Optional[builtins.str]:
        result = self._values.get("function_alias")
        return result

    @builtins.property
    def function_parameters(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("function_parameters")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsSavedSearchTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsSavedSearchConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsSavedSearchTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsSavedSearchTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsSavedSearchTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsSolution(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsSolution",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        plan: typing.List["LogAnalyticsSolutionPlan"],
        resource_group_name: builtins.str,
        solution_name: builtins.str,
        workspace_name: builtins.str,
        workspace_resource_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsSolutionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param plan: plan block.
        :param resource_group_name: -
        :param solution_name: -
        :param workspace_name: -
        :param workspace_resource_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsSolutionConfig(
            location=location,
            plan=plan,
            resource_group_name=resource_group_name,
            solution_name=solution_name,
            workspace_name=workspace_name,
            workspace_resource_id=workspace_resource_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsSolution, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(self) -> typing.List["LogAnalyticsSolutionPlan"]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="solutionNameInput")
    def solution_name_input(self) -> builtins.str:
        return jsii.get(self, "solutionNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceNameInput")
    def workspace_name_input(self) -> builtins.str:
        return jsii.get(self, "workspaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceResourceIdInput")
    def workspace_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "workspaceResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogAnalyticsSolutionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["LogAnalyticsSolutionPlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["LogAnalyticsSolutionPlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="solutionName")
    def solution_name(self) -> builtins.str:
        return jsii.get(self, "solutionName")

    @solution_name.setter # type: ignore
    def solution_name(self, value: builtins.str) -> None:
        jsii.set(self, "solutionName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsSolutionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsSolutionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceName")
    def workspace_name(self) -> builtins.str:
        return jsii.get(self, "workspaceName")

    @workspace_name.setter # type: ignore
    def workspace_name(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceResourceId")
    def workspace_resource_id(self) -> builtins.str:
        return jsii.get(self, "workspaceResourceId")

    @workspace_resource_id.setter # type: ignore
    def workspace_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceResourceId", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsSolutionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "plan": "plan",
        "resource_group_name": "resourceGroupName",
        "solution_name": "solutionName",
        "workspace_name": "workspaceName",
        "workspace_resource_id": "workspaceResourceId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsSolutionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        plan: typing.List["LogAnalyticsSolutionPlan"],
        resource_group_name: builtins.str,
        solution_name: builtins.str,
        workspace_name: builtins.str,
        workspace_resource_id: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsSolutionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param plan: plan block.
        :param resource_group_name: -
        :param solution_name: -
        :param workspace_name: -
        :param workspace_resource_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsSolutionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "plan": plan,
            "resource_group_name": resource_group_name,
            "solution_name": solution_name,
            "workspace_name": workspace_name,
            "workspace_resource_id": workspace_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def plan(self) -> typing.List["LogAnalyticsSolutionPlan"]:
        """plan block."""
        result = self._values.get("plan")
        assert result is not None, "Required property 'plan' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def solution_name(self) -> builtins.str:
        result = self._values.get("solution_name")
        assert result is not None, "Required property 'solution_name' is missing"
        return result

    @builtins.property
    def workspace_name(self) -> builtins.str:
        result = self._values.get("workspace_name")
        assert result is not None, "Required property 'workspace_name' is missing"
        return result

    @builtins.property
    def workspace_resource_id(self) -> builtins.str:
        result = self._values.get("workspace_resource_id")
        assert result is not None, "Required property 'workspace_resource_id' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsSolutionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsSolutionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsSolutionPlan",
    jsii_struct_bases=[],
    name_mapping={
        "product": "product",
        "publisher": "publisher",
        "promotion_code": "promotionCode",
    },
)
class LogAnalyticsSolutionPlan:
    def __init__(
        self,
        *,
        product: builtins.str,
        publisher: builtins.str,
        promotion_code: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param product: -
        :param publisher: -
        :param promotion_code: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "product": product,
            "publisher": publisher,
        }
        if promotion_code is not None:
            self._values["promotion_code"] = promotion_code

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def promotion_code(self) -> typing.Optional[builtins.str]:
        result = self._values.get("promotion_code")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsSolutionPlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsSolutionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsSolutionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsSolutionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsStorageInsights(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsStorageInsights",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_id: builtins.str,
        storage_account_key: builtins.str,
        workspace_id: builtins.str,
        blob_container_names: typing.Optional[typing.List[builtins.str]] = None,
        table_names: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsStorageInsightsTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param storage_account_id: -
        :param storage_account_key: -
        :param workspace_id: -
        :param blob_container_names: -
        :param table_names: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsStorageInsightsConfig(
            name=name,
            resource_group_name=resource_group_name,
            storage_account_id=storage_account_id,
            storage_account_key=storage_account_key,
            workspace_id=workspace_id,
            blob_container_names=blob_container_names,
            table_names=table_names,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsStorageInsights, self, [scope, id, config])

    @jsii.member(jsii_name="resetBlobContainerNames")
    def reset_blob_container_names(self) -> None:
        return jsii.invoke(self, "resetBlobContainerNames", [])

    @jsii.member(jsii_name="resetTableNames")
    def reset_table_names(self) -> None:
        return jsii.invoke(self, "resetTableNames", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKeyInput")
    def storage_account_key_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceIdInput")
    def workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "workspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobContainerNamesInput")
    def blob_container_names_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "blobContainerNamesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNamesInput")
    def table_names_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "tableNamesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogAnalyticsStorageInsightsTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobContainerNames")
    def blob_container_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "blobContainerNames")

    @blob_container_names.setter # type: ignore
    def blob_container_names(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "blobContainerNames", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKey")
    def storage_account_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountKey")

    @storage_account_key.setter # type: ignore
    def storage_account_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNames")
    def table_names(self) -> typing.List[builtins.str]:
        return jsii.get(self, "tableNames")

    @table_names.setter # type: ignore
    def table_names(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "tableNames", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsStorageInsightsTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsStorageInsightsTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")

    @workspace_id.setter # type: ignore
    def workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceId", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsStorageInsightsConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "storage_account_id": "storageAccountId",
        "storage_account_key": "storageAccountKey",
        "workspace_id": "workspaceId",
        "blob_container_names": "blobContainerNames",
        "table_names": "tableNames",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsStorageInsightsConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_id: builtins.str,
        storage_account_key: builtins.str,
        workspace_id: builtins.str,
        blob_container_names: typing.Optional[typing.List[builtins.str]] = None,
        table_names: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsStorageInsightsTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param storage_account_id: -
        :param storage_account_key: -
        :param workspace_id: -
        :param blob_container_names: -
        :param table_names: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsStorageInsightsTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "storage_account_id": storage_account_id,
            "storage_account_key": storage_account_key,
            "workspace_id": workspace_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if blob_container_names is not None:
            self._values["blob_container_names"] = blob_container_names
        if table_names is not None:
            self._values["table_names"] = table_names
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def workspace_id(self) -> builtins.str:
        result = self._values.get("workspace_id")
        assert result is not None, "Required property 'workspace_id' is missing"
        return result

    @builtins.property
    def blob_container_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("blob_container_names")
        return result

    @builtins.property
    def table_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("table_names")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsStorageInsightsTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsStorageInsightsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsStorageInsightsTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsStorageInsightsTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsStorageInsightsTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogAnalyticsWorkspace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogAnalyticsWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        daily_quota_gb: typing.Optional[jsii.Number] = None,
        internet_ingestion_enabled: typing.Optional[builtins.bool] = None,
        internet_query_enabled: typing.Optional[builtins.bool] = None,
        retention_in_days: typing.Optional[jsii.Number] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param daily_quota_gb: -
        :param internet_ingestion_enabled: -
        :param internet_query_enabled: -
        :param retention_in_days: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogAnalyticsWorkspaceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            daily_quota_gb=daily_quota_gb,
            internet_ingestion_enabled=internet_ingestion_enabled,
            internet_query_enabled=internet_query_enabled,
            retention_in_days=retention_in_days,
            sku=sku,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogAnalyticsWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="resetDailyQuotaGb")
    def reset_daily_quota_gb(self) -> None:
        return jsii.invoke(self, "resetDailyQuotaGb", [])

    @jsii.member(jsii_name="resetInternetIngestionEnabled")
    def reset_internet_ingestion_enabled(self) -> None:
        return jsii.invoke(self, "resetInternetIngestionEnabled", [])

    @jsii.member(jsii_name="resetInternetQueryEnabled")
    def reset_internet_query_enabled(self) -> None:
        return jsii.invoke(self, "resetInternetQueryEnabled", [])

    @jsii.member(jsii_name="resetRetentionInDays")
    def reset_retention_in_days(self) -> None:
        return jsii.invoke(self, "resetRetentionInDays", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="portalUrl")
    def portal_url(self) -> builtins.str:
        return jsii.get(self, "portalUrl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primarySharedKey")
    def primary_shared_key(self) -> builtins.str:
        return jsii.get(self, "primarySharedKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondarySharedKey")
    def secondary_shared_key(self) -> builtins.str:
        return jsii.get(self, "secondarySharedKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyQuotaGbInput")
    def daily_quota_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dailyQuotaGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetIngestionEnabledInput")
    def internet_ingestion_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "internetIngestionEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetQueryEnabledInput")
    def internet_query_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "internetQueryEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDaysInput")
    def retention_in_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionInDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogAnalyticsWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dailyQuotaGb")
    def daily_quota_gb(self) -> jsii.Number:
        return jsii.get(self, "dailyQuotaGb")

    @daily_quota_gb.setter # type: ignore
    def daily_quota_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "dailyQuotaGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetIngestionEnabled")
    def internet_ingestion_enabled(self) -> builtins.bool:
        return jsii.get(self, "internetIngestionEnabled")

    @internet_ingestion_enabled.setter # type: ignore
    def internet_ingestion_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "internetIngestionEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetQueryEnabled")
    def internet_query_enabled(self) -> builtins.bool:
        return jsii.get(self, "internetQueryEnabled")

    @internet_query_enabled.setter # type: ignore
    def internet_query_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "internetQueryEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDays")
    def retention_in_days(self) -> jsii.Number:
        return jsii.get(self, "retentionInDays")

    @retention_in_days.setter # type: ignore
    def retention_in_days(self, value: jsii.Number) -> None:
        jsii.set(self, "retentionInDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogAnalyticsWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogAnalyticsWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "daily_quota_gb": "dailyQuotaGb",
        "internet_ingestion_enabled": "internetIngestionEnabled",
        "internet_query_enabled": "internetQueryEnabled",
        "retention_in_days": "retentionInDays",
        "sku": "sku",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LogAnalyticsWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        daily_quota_gb: typing.Optional[jsii.Number] = None,
        internet_ingestion_enabled: typing.Optional[builtins.bool] = None,
        internet_query_enabled: typing.Optional[builtins.bool] = None,
        retention_in_days: typing.Optional[jsii.Number] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogAnalyticsWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param daily_quota_gb: -
        :param internet_ingestion_enabled: -
        :param internet_query_enabled: -
        :param retention_in_days: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogAnalyticsWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if daily_quota_gb is not None:
            self._values["daily_quota_gb"] = daily_quota_gb
        if internet_ingestion_enabled is not None:
            self._values["internet_ingestion_enabled"] = internet_ingestion_enabled
        if internet_query_enabled is not None:
            self._values["internet_query_enabled"] = internet_query_enabled
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if sku is not None:
            self._values["sku"] = sku
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def daily_quota_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("daily_quota_gb")
        return result

    @builtins.property
    def internet_ingestion_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("internet_ingestion_enabled")
        return result

    @builtins.property
    def internet_query_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("internet_query_enabled")
        return result

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogAnalyticsWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogAnalyticsWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogAnalyticsWorkspaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogAnalyticsWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogicAppActionCustom(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogicAppActionCustom",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        body: builtins.str,
        logic_app_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["LogicAppActionCustomTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param body: -
        :param logic_app_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogicAppActionCustomConfig(
            body=body,
            logic_app_id=logic_app_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogicAppActionCustom, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bodyInput")
    def body_input(self) -> builtins.str:
        return jsii.get(self, "bodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIdInput")
    def logic_app_id_input(self) -> builtins.str:
        return jsii.get(self, "logicAppIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogicAppActionCustomTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="body")
    def body(self) -> builtins.str:
        return jsii.get(self, "body")

    @body.setter # type: ignore
    def body(self, value: builtins.str) -> None:
        jsii.set(self, "body", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppId")
    def logic_app_id(self) -> builtins.str:
        return jsii.get(self, "logicAppId")

    @logic_app_id.setter # type: ignore
    def logic_app_id(self, value: builtins.str) -> None:
        jsii.set(self, "logicAppId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogicAppActionCustomTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogicAppActionCustomTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogicAppActionCustomConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "body": "body",
        "logic_app_id": "logicAppId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class LogicAppActionCustomConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        body: builtins.str,
        logic_app_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["LogicAppActionCustomTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param body: -
        :param logic_app_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogicAppActionCustomTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "body": body,
            "logic_app_id": logic_app_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def body(self) -> builtins.str:
        result = self._values.get("body")
        assert result is not None, "Required property 'body' is missing"
        return result

    @builtins.property
    def logic_app_id(self) -> builtins.str:
        result = self._values.get("logic_app_id")
        assert result is not None, "Required property 'logic_app_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogicAppActionCustomTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppActionCustomConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppActionCustomTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogicAppActionCustomTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppActionCustomTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogicAppActionHttp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogicAppActionHttp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        logic_app_id: builtins.str,
        method: builtins.str,
        name: builtins.str,
        uri: builtins.str,
        body: typing.Optional[builtins.str] = None,
        headers: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        run_after: typing.Optional[typing.List["LogicAppActionHttpRunAfter"]] = None,
        timeouts: typing.Optional["LogicAppActionHttpTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param logic_app_id: -
        :param method: -
        :param name: -
        :param uri: -
        :param body: -
        :param headers: -
        :param run_after: run_after block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogicAppActionHttpConfig(
            logic_app_id=logic_app_id,
            method=method,
            name=name,
            uri=uri,
            body=body,
            headers=headers,
            run_after=run_after,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogicAppActionHttp, self, [scope, id, config])

    @jsii.member(jsii_name="resetBody")
    def reset_body(self) -> None:
        return jsii.invoke(self, "resetBody", [])

    @jsii.member(jsii_name="resetHeaders")
    def reset_headers(self) -> None:
        return jsii.invoke(self, "resetHeaders", [])

    @jsii.member(jsii_name="resetRunAfter")
    def reset_run_after(self) -> None:
        return jsii.invoke(self, "resetRunAfter", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIdInput")
    def logic_app_id_input(self) -> builtins.str:
        return jsii.get(self, "logicAppIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="methodInput")
    def method_input(self) -> builtins.str:
        return jsii.get(self, "methodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uriInput")
    def uri_input(self) -> builtins.str:
        return jsii.get(self, "uriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bodyInput")
    def body_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "bodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="headersInput")
    def headers_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "headersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runAfterInput")
    def run_after_input(
        self,
    ) -> typing.Optional[typing.List["LogicAppActionHttpRunAfter"]]:
        return jsii.get(self, "runAfterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogicAppActionHttpTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="body")
    def body(self) -> builtins.str:
        return jsii.get(self, "body")

    @body.setter # type: ignore
    def body(self, value: builtins.str) -> None:
        jsii.set(self, "body", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="headers")
    def headers(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "headers")

    @headers.setter # type: ignore
    def headers(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "headers", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppId")
    def logic_app_id(self) -> builtins.str:
        return jsii.get(self, "logicAppId")

    @logic_app_id.setter # type: ignore
    def logic_app_id(self, value: builtins.str) -> None:
        jsii.set(self, "logicAppId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="method")
    def method(self) -> builtins.str:
        return jsii.get(self, "method")

    @method.setter # type: ignore
    def method(self, value: builtins.str) -> None:
        jsii.set(self, "method", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="runAfter")
    def run_after(self) -> typing.List["LogicAppActionHttpRunAfter"]:
        return jsii.get(self, "runAfter")

    @run_after.setter # type: ignore
    def run_after(self, value: typing.List["LogicAppActionHttpRunAfter"]) -> None:
        jsii.set(self, "runAfter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogicAppActionHttpTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogicAppActionHttpTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uri")
    def uri(self) -> builtins.str:
        return jsii.get(self, "uri")

    @uri.setter # type: ignore
    def uri(self, value: builtins.str) -> None:
        jsii.set(self, "uri", value)


@jsii.data_type(
    jsii_type="azurerm.LogicAppActionHttpConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "logic_app_id": "logicAppId",
        "method": "method",
        "name": "name",
        "uri": "uri",
        "body": "body",
        "headers": "headers",
        "run_after": "runAfter",
        "timeouts": "timeouts",
    },
)
class LogicAppActionHttpConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        logic_app_id: builtins.str,
        method: builtins.str,
        name: builtins.str,
        uri: builtins.str,
        body: typing.Optional[builtins.str] = None,
        headers: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        run_after: typing.Optional[typing.List["LogicAppActionHttpRunAfter"]] = None,
        timeouts: typing.Optional["LogicAppActionHttpTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param logic_app_id: -
        :param method: -
        :param name: -
        :param uri: -
        :param body: -
        :param headers: -
        :param run_after: run_after block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogicAppActionHttpTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "logic_app_id": logic_app_id,
            "method": method,
            "name": name,
            "uri": uri,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if body is not None:
            self._values["body"] = body
        if headers is not None:
            self._values["headers"] = headers
        if run_after is not None:
            self._values["run_after"] = run_after
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def logic_app_id(self) -> builtins.str:
        result = self._values.get("logic_app_id")
        assert result is not None, "Required property 'logic_app_id' is missing"
        return result

    @builtins.property
    def method(self) -> builtins.str:
        result = self._values.get("method")
        assert result is not None, "Required property 'method' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def uri(self) -> builtins.str:
        result = self._values.get("uri")
        assert result is not None, "Required property 'uri' is missing"
        return result

    @builtins.property
    def body(self) -> typing.Optional[builtins.str]:
        result = self._values.get("body")
        return result

    @builtins.property
    def headers(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("headers")
        return result

    @builtins.property
    def run_after(self) -> typing.Optional[typing.List["LogicAppActionHttpRunAfter"]]:
        """run_after block."""
        result = self._values.get("run_after")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogicAppActionHttpTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppActionHttpConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppActionHttpRunAfter",
    jsii_struct_bases=[],
    name_mapping={"action_name": "actionName", "action_result": "actionResult"},
)
class LogicAppActionHttpRunAfter:
    def __init__(
        self,
        *,
        action_name: builtins.str,
        action_result: builtins.str,
    ) -> None:
        """
        :param action_name: -
        :param action_result: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action_name": action_name,
            "action_result": action_result,
        }

    @builtins.property
    def action_name(self) -> builtins.str:
        result = self._values.get("action_name")
        assert result is not None, "Required property 'action_name' is missing"
        return result

    @builtins.property
    def action_result(self) -> builtins.str:
        result = self._values.get("action_result")
        assert result is not None, "Required property 'action_result' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppActionHttpRunAfter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppActionHttpTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogicAppActionHttpTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppActionHttpTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogicAppIntegrationAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogicAppIntegrationAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogicAppIntegrationAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogicAppIntegrationAccountConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogicAppIntegrationAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogicAppIntegrationAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogicAppIntegrationAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogicAppIntegrationAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogicAppIntegrationAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class LogicAppIntegrationAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogicAppIntegrationAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogicAppIntegrationAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogicAppIntegrationAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppIntegrationAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppIntegrationAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogicAppIntegrationAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppIntegrationAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogicAppTriggerCustom(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogicAppTriggerCustom",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        body: builtins.str,
        logic_app_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["LogicAppTriggerCustomTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param body: -
        :param logic_app_id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogicAppTriggerCustomConfig(
            body=body,
            logic_app_id=logic_app_id,
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogicAppTriggerCustom, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bodyInput")
    def body_input(self) -> builtins.str:
        return jsii.get(self, "bodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIdInput")
    def logic_app_id_input(self) -> builtins.str:
        return jsii.get(self, "logicAppIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogicAppTriggerCustomTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="body")
    def body(self) -> builtins.str:
        return jsii.get(self, "body")

    @body.setter # type: ignore
    def body(self, value: builtins.str) -> None:
        jsii.set(self, "body", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppId")
    def logic_app_id(self) -> builtins.str:
        return jsii.get(self, "logicAppId")

    @logic_app_id.setter # type: ignore
    def logic_app_id(self, value: builtins.str) -> None:
        jsii.set(self, "logicAppId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogicAppTriggerCustomTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogicAppTriggerCustomTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogicAppTriggerCustomConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "body": "body",
        "logic_app_id": "logicAppId",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class LogicAppTriggerCustomConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        body: builtins.str,
        logic_app_id: builtins.str,
        name: builtins.str,
        timeouts: typing.Optional["LogicAppTriggerCustomTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param body: -
        :param logic_app_id: -
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogicAppTriggerCustomTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "body": body,
            "logic_app_id": logic_app_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def body(self) -> builtins.str:
        result = self._values.get("body")
        assert result is not None, "Required property 'body' is missing"
        return result

    @builtins.property
    def logic_app_id(self) -> builtins.str:
        result = self._values.get("logic_app_id")
        assert result is not None, "Required property 'logic_app_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogicAppTriggerCustomTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppTriggerCustomConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppTriggerCustomTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogicAppTriggerCustomTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppTriggerCustomTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogicAppTriggerHttpRequest(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogicAppTriggerHttpRequest",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        logic_app_id: builtins.str,
        name: builtins.str,
        schema: builtins.str,
        method: typing.Optional[builtins.str] = None,
        relative_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LogicAppTriggerHttpRequestTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param logic_app_id: -
        :param name: -
        :param schema: -
        :param method: -
        :param relative_path: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogicAppTriggerHttpRequestConfig(
            logic_app_id=logic_app_id,
            name=name,
            schema=schema,
            method=method,
            relative_path=relative_path,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogicAppTriggerHttpRequest, self, [scope, id, config])

    @jsii.member(jsii_name="resetMethod")
    def reset_method(self) -> None:
        return jsii.invoke(self, "resetMethod", [])

    @jsii.member(jsii_name="resetRelativePath")
    def reset_relative_path(self) -> None:
        return jsii.invoke(self, "resetRelativePath", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIdInput")
    def logic_app_id_input(self) -> builtins.str:
        return jsii.get(self, "logicAppIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schemaInput")
    def schema_input(self) -> builtins.str:
        return jsii.get(self, "schemaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="methodInput")
    def method_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "methodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relativePathInput")
    def relative_path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "relativePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogicAppTriggerHttpRequestTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppId")
    def logic_app_id(self) -> builtins.str:
        return jsii.get(self, "logicAppId")

    @logic_app_id.setter # type: ignore
    def logic_app_id(self, value: builtins.str) -> None:
        jsii.set(self, "logicAppId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="method")
    def method(self) -> builtins.str:
        return jsii.get(self, "method")

    @method.setter # type: ignore
    def method(self, value: builtins.str) -> None:
        jsii.set(self, "method", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relativePath")
    def relative_path(self) -> builtins.str:
        return jsii.get(self, "relativePath")

    @relative_path.setter # type: ignore
    def relative_path(self, value: builtins.str) -> None:
        jsii.set(self, "relativePath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="schema")
    def schema(self) -> builtins.str:
        return jsii.get(self, "schema")

    @schema.setter # type: ignore
    def schema(self, value: builtins.str) -> None:
        jsii.set(self, "schema", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogicAppTriggerHttpRequestTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogicAppTriggerHttpRequestTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.LogicAppTriggerHttpRequestConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "logic_app_id": "logicAppId",
        "name": "name",
        "schema": "schema",
        "method": "method",
        "relative_path": "relativePath",
        "timeouts": "timeouts",
    },
)
class LogicAppTriggerHttpRequestConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        logic_app_id: builtins.str,
        name: builtins.str,
        schema: builtins.str,
        method: typing.Optional[builtins.str] = None,
        relative_path: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LogicAppTriggerHttpRequestTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param logic_app_id: -
        :param name: -
        :param schema: -
        :param method: -
        :param relative_path: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogicAppTriggerHttpRequestTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "logic_app_id": logic_app_id,
            "name": name,
            "schema": schema,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if method is not None:
            self._values["method"] = method
        if relative_path is not None:
            self._values["relative_path"] = relative_path
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def logic_app_id(self) -> builtins.str:
        result = self._values.get("logic_app_id")
        assert result is not None, "Required property 'logic_app_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def schema(self) -> builtins.str:
        result = self._values.get("schema")
        assert result is not None, "Required property 'schema' is missing"
        return result

    @builtins.property
    def method(self) -> typing.Optional[builtins.str]:
        result = self._values.get("method")
        return result

    @builtins.property
    def relative_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("relative_path")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogicAppTriggerHttpRequestTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppTriggerHttpRequestConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppTriggerHttpRequestTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogicAppTriggerHttpRequestTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppTriggerHttpRequestTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogicAppTriggerRecurrence(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogicAppTriggerRecurrence",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        frequency: builtins.str,
        interval: jsii.Number,
        logic_app_id: builtins.str,
        name: builtins.str,
        start_time: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LogicAppTriggerRecurrenceTimeouts"] = None,
        time_zone: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param frequency: -
        :param interval: -
        :param logic_app_id: -
        :param name: -
        :param start_time: -
        :param timeouts: timeouts block.
        :param time_zone: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogicAppTriggerRecurrenceConfig(
            frequency=frequency,
            interval=interval,
            logic_app_id=logic_app_id,
            name=name,
            start_time=start_time,
            timeouts=timeouts,
            time_zone=time_zone,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogicAppTriggerRecurrence, self, [scope, id, config])

    @jsii.member(jsii_name="resetStartTime")
    def reset_start_time(self) -> None:
        return jsii.invoke(self, "resetStartTime", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTimeZone")
    def reset_time_zone(self) -> None:
        return jsii.invoke(self, "resetTimeZone", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequencyInput")
    def frequency_input(self) -> builtins.str:
        return jsii.get(self, "frequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInput")
    def interval_input(self) -> jsii.Number:
        return jsii.get(self, "intervalInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIdInput")
    def logic_app_id_input(self) -> builtins.str:
        return jsii.get(self, "logicAppIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTimeInput")
    def start_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "startTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogicAppTriggerRecurrenceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeZoneInput")
    def time_zone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "timeZoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> builtins.str:
        return jsii.get(self, "frequency")

    @frequency.setter # type: ignore
    def frequency(self, value: builtins.str) -> None:
        jsii.set(self, "frequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="interval")
    def interval(self) -> jsii.Number:
        return jsii.get(self, "interval")

    @interval.setter # type: ignore
    def interval(self, value: jsii.Number) -> None:
        jsii.set(self, "interval", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppId")
    def logic_app_id(self) -> builtins.str:
        return jsii.get(self, "logicAppId")

    @logic_app_id.setter # type: ignore
    def logic_app_id(self, value: builtins.str) -> None:
        jsii.set(self, "logicAppId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startTime")
    def start_time(self) -> builtins.str:
        return jsii.get(self, "startTime")

    @start_time.setter # type: ignore
    def start_time(self, value: builtins.str) -> None:
        jsii.set(self, "startTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogicAppTriggerRecurrenceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogicAppTriggerRecurrenceTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeZone")
    def time_zone(self) -> builtins.str:
        return jsii.get(self, "timeZone")

    @time_zone.setter # type: ignore
    def time_zone(self, value: builtins.str) -> None:
        jsii.set(self, "timeZone", value)


@jsii.data_type(
    jsii_type="azurerm.LogicAppTriggerRecurrenceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "frequency": "frequency",
        "interval": "interval",
        "logic_app_id": "logicAppId",
        "name": "name",
        "start_time": "startTime",
        "timeouts": "timeouts",
        "time_zone": "timeZone",
    },
)
class LogicAppTriggerRecurrenceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        frequency: builtins.str,
        interval: jsii.Number,
        logic_app_id: builtins.str,
        name: builtins.str,
        start_time: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["LogicAppTriggerRecurrenceTimeouts"] = None,
        time_zone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param frequency: -
        :param interval: -
        :param logic_app_id: -
        :param name: -
        :param start_time: -
        :param timeouts: timeouts block.
        :param time_zone: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogicAppTriggerRecurrenceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "frequency": frequency,
            "interval": interval,
            "logic_app_id": logic_app_id,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if start_time is not None:
            self._values["start_time"] = start_time
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if time_zone is not None:
            self._values["time_zone"] = time_zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def frequency(self) -> builtins.str:
        result = self._values.get("frequency")
        assert result is not None, "Required property 'frequency' is missing"
        return result

    @builtins.property
    def interval(self) -> jsii.Number:
        result = self._values.get("interval")
        assert result is not None, "Required property 'interval' is missing"
        return result

    @builtins.property
    def logic_app_id(self) -> builtins.str:
        result = self._values.get("logic_app_id")
        assert result is not None, "Required property 'logic_app_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def start_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("start_time")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogicAppTriggerRecurrenceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def time_zone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("time_zone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppTriggerRecurrenceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppTriggerRecurrenceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogicAppTriggerRecurrenceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppTriggerRecurrenceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class LogicAppWorkflow(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.LogicAppWorkflow",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        integration_service_environment_id: typing.Optional[builtins.str] = None,
        logic_app_integration_account_id: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogicAppWorkflowTimeouts"] = None,
        workflow_schema: typing.Optional[builtins.str] = None,
        workflow_version: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param integration_service_environment_id: -
        :param logic_app_integration_account_id: -
        :param parameters: -
        :param tags: -
        :param timeouts: timeouts block.
        :param workflow_schema: -
        :param workflow_version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LogicAppWorkflowConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            integration_service_environment_id=integration_service_environment_id,
            logic_app_integration_account_id=logic_app_integration_account_id,
            parameters=parameters,
            tags=tags,
            timeouts=timeouts,
            workflow_schema=workflow_schema,
            workflow_version=workflow_version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(LogicAppWorkflow, self, [scope, id, config])

    @jsii.member(jsii_name="resetIntegrationServiceEnvironmentId")
    def reset_integration_service_environment_id(self) -> None:
        return jsii.invoke(self, "resetIntegrationServiceEnvironmentId", [])

    @jsii.member(jsii_name="resetLogicAppIntegrationAccountId")
    def reset_logic_app_integration_account_id(self) -> None:
        return jsii.invoke(self, "resetLogicAppIntegrationAccountId", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWorkflowSchema")
    def reset_workflow_schema(self) -> None:
        return jsii.invoke(self, "resetWorkflowSchema", [])

    @jsii.member(jsii_name="resetWorkflowVersion")
    def reset_workflow_version(self) -> None:
        return jsii.invoke(self, "resetWorkflowVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessEndpoint")
    def access_endpoint(self) -> builtins.str:
        return jsii.get(self, "accessEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectorEndpointIpAddresses")
    def connector_endpoint_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "connectorEndpointIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectorOutboundIpAddresses")
    def connector_outbound_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "connectorOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowEndpointIpAddresses")
    def workflow_endpoint_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "workflowEndpointIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowOutboundIpAddresses")
    def workflow_outbound_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "workflowOutboundIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationServiceEnvironmentIdInput")
    def integration_service_environment_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "integrationServiceEnvironmentIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIntegrationAccountIdInput")
    def logic_app_integration_account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "logicAppIntegrationAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["LogicAppWorkflowTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowSchemaInput")
    def workflow_schema_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "workflowSchemaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowVersionInput")
    def workflow_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "workflowVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="integrationServiceEnvironmentId")
    def integration_service_environment_id(self) -> builtins.str:
        return jsii.get(self, "integrationServiceEnvironmentId")

    @integration_service_environment_id.setter # type: ignore
    def integration_service_environment_id(self, value: builtins.str) -> None:
        jsii.set(self, "integrationServiceEnvironmentId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppIntegrationAccountId")
    def logic_app_integration_account_id(self) -> builtins.str:
        return jsii.get(self, "logicAppIntegrationAccountId")

    @logic_app_integration_account_id.setter # type: ignore
    def logic_app_integration_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "logicAppIntegrationAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "LogicAppWorkflowTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "LogicAppWorkflowTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowSchema")
    def workflow_schema(self) -> builtins.str:
        return jsii.get(self, "workflowSchema")

    @workflow_schema.setter # type: ignore
    def workflow_schema(self, value: builtins.str) -> None:
        jsii.set(self, "workflowSchema", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workflowVersion")
    def workflow_version(self) -> builtins.str:
        return jsii.get(self, "workflowVersion")

    @workflow_version.setter # type: ignore
    def workflow_version(self, value: builtins.str) -> None:
        jsii.set(self, "workflowVersion", value)


@jsii.data_type(
    jsii_type="azurerm.LogicAppWorkflowConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "integration_service_environment_id": "integrationServiceEnvironmentId",
        "logic_app_integration_account_id": "logicAppIntegrationAccountId",
        "parameters": "parameters",
        "tags": "tags",
        "timeouts": "timeouts",
        "workflow_schema": "workflowSchema",
        "workflow_version": "workflowVersion",
    },
)
class LogicAppWorkflowConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        integration_service_environment_id: typing.Optional[builtins.str] = None,
        logic_app_integration_account_id: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["LogicAppWorkflowTimeouts"] = None,
        workflow_schema: typing.Optional[builtins.str] = None,
        workflow_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param integration_service_environment_id: -
        :param logic_app_integration_account_id: -
        :param parameters: -
        :param tags: -
        :param timeouts: timeouts block.
        :param workflow_schema: -
        :param workflow_version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = LogicAppWorkflowTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if integration_service_environment_id is not None:
            self._values["integration_service_environment_id"] = integration_service_environment_id
        if logic_app_integration_account_id is not None:
            self._values["logic_app_integration_account_id"] = logic_app_integration_account_id
        if parameters is not None:
            self._values["parameters"] = parameters
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if workflow_schema is not None:
            self._values["workflow_schema"] = workflow_schema
        if workflow_version is not None:
            self._values["workflow_version"] = workflow_version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def integration_service_environment_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("integration_service_environment_id")
        return result

    @builtins.property
    def logic_app_integration_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("logic_app_integration_account_id")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["LogicAppWorkflowTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def workflow_schema(self) -> typing.Optional[builtins.str]:
        result = self._values.get("workflow_schema")
        return result

    @builtins.property
    def workflow_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("workflow_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppWorkflowConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.LogicAppWorkflowTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class LogicAppWorkflowTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "LogicAppWorkflowTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MachineLearningWorkspace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MachineLearningWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_insights_id: builtins.str,
        identity: typing.List["MachineLearningWorkspaceIdentity"],
        key_vault_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_id: builtins.str,
        container_registry_id: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        high_business_impact: typing.Optional[builtins.bool] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MachineLearningWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_insights_id: -
        :param identity: identity block.
        :param key_vault_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account_id: -
        :param container_registry_id: -
        :param description: -
        :param friendly_name: -
        :param high_business_impact: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MachineLearningWorkspaceConfig(
            application_insights_id=application_insights_id,
            identity=identity,
            key_vault_id=key_vault_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            storage_account_id=storage_account_id,
            container_registry_id=container_registry_id,
            description=description,
            friendly_name=friendly_name,
            high_business_impact=high_business_impact,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MachineLearningWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="resetContainerRegistryId")
    def reset_container_registry_id(self) -> None:
        return jsii.invoke(self, "resetContainerRegistryId", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFriendlyName")
    def reset_friendly_name(self) -> None:
        return jsii.invoke(self, "resetFriendlyName", [])

    @jsii.member(jsii_name="resetHighBusinessImpact")
    def reset_high_business_impact(self) -> None:
        return jsii.invoke(self, "resetHighBusinessImpact", [])

    @jsii.member(jsii_name="resetSkuName")
    def reset_sku_name(self) -> None:
        return jsii.invoke(self, "resetSkuName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsIdInput")
    def application_insights_id_input(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.List["MachineLearningWorkspaceIdentity"]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerRegistryIdInput")
    def container_registry_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "containerRegistryIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyNameInput")
    def friendly_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "friendlyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="highBusinessImpactInput")
    def high_business_impact_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "highBusinessImpactInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MachineLearningWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsId")
    def application_insights_id(self) -> builtins.str:
        return jsii.get(self, "applicationInsightsId")

    @application_insights_id.setter # type: ignore
    def application_insights_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationInsightsId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerRegistryId")
    def container_registry_id(self) -> builtins.str:
        return jsii.get(self, "containerRegistryId")

    @container_registry_id.setter # type: ignore
    def container_registry_id(self, value: builtins.str) -> None:
        jsii.set(self, "containerRegistryId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @friendly_name.setter # type: ignore
    def friendly_name(self, value: builtins.str) -> None:
        jsii.set(self, "friendlyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="highBusinessImpact")
    def high_business_impact(self) -> builtins.bool:
        return jsii.get(self, "highBusinessImpact")

    @high_business_impact.setter # type: ignore
    def high_business_impact(self, value: builtins.bool) -> None:
        jsii.set(self, "highBusinessImpact", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["MachineLearningWorkspaceIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["MachineLearningWorkspaceIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MachineLearningWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MachineLearningWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MachineLearningWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_insights_id": "applicationInsightsId",
        "identity": "identity",
        "key_vault_id": "keyVaultId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "storage_account_id": "storageAccountId",
        "container_registry_id": "containerRegistryId",
        "description": "description",
        "friendly_name": "friendlyName",
        "high_business_impact": "highBusinessImpact",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MachineLearningWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_insights_id: builtins.str,
        identity: typing.List["MachineLearningWorkspaceIdentity"],
        key_vault_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_id: builtins.str,
        container_registry_id: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        high_business_impact: typing.Optional[builtins.bool] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MachineLearningWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_insights_id: -
        :param identity: identity block.
        :param key_vault_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account_id: -
        :param container_registry_id: -
        :param description: -
        :param friendly_name: -
        :param high_business_impact: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MachineLearningWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_insights_id": application_insights_id,
            "identity": identity,
            "key_vault_id": key_vault_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if container_registry_id is not None:
            self._values["container_registry_id"] = container_registry_id
        if description is not None:
            self._values["description"] = description
        if friendly_name is not None:
            self._values["friendly_name"] = friendly_name
        if high_business_impact is not None:
            self._values["high_business_impact"] = high_business_impact
        if sku_name is not None:
            self._values["sku_name"] = sku_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_insights_id(self) -> builtins.str:
        result = self._values.get("application_insights_id")
        assert result is not None, "Required property 'application_insights_id' is missing"
        return result

    @builtins.property
    def identity(self) -> typing.List["MachineLearningWorkspaceIdentity"]:
        """identity block."""
        result = self._values.get("identity")
        assert result is not None, "Required property 'identity' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def container_registry_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("container_registry_id")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def friendly_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("friendly_name")
        return result

    @builtins.property
    def high_business_impact(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("high_business_impact")
        return result

    @builtins.property
    def sku_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MachineLearningWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MachineLearningWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MachineLearningWorkspaceIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class MachineLearningWorkspaceIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MachineLearningWorkspaceIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MachineLearningWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MachineLearningWorkspaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MachineLearningWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MaintenanceAssignmentDedicatedHost(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MaintenanceAssignmentDedicatedHost",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        dedicated_host_id: builtins.str,
        location: builtins.str,
        maintenance_configuration_id: builtins.str,
        timeouts: typing.Optional["MaintenanceAssignmentDedicatedHostTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param dedicated_host_id: -
        :param location: -
        :param maintenance_configuration_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MaintenanceAssignmentDedicatedHostConfig(
            dedicated_host_id=dedicated_host_id,
            location=location,
            maintenance_configuration_id=maintenance_configuration_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MaintenanceAssignmentDedicatedHost, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostIdInput")
    def dedicated_host_id_input(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maintenanceConfigurationIdInput")
    def maintenance_configuration_id_input(self) -> builtins.str:
        return jsii.get(self, "maintenanceConfigurationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MaintenanceAssignmentDedicatedHostTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostId")
    def dedicated_host_id(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostId")

    @dedicated_host_id.setter # type: ignore
    def dedicated_host_id(self, value: builtins.str) -> None:
        jsii.set(self, "dedicatedHostId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maintenanceConfigurationId")
    def maintenance_configuration_id(self) -> builtins.str:
        return jsii.get(self, "maintenanceConfigurationId")

    @maintenance_configuration_id.setter # type: ignore
    def maintenance_configuration_id(self, value: builtins.str) -> None:
        jsii.set(self, "maintenanceConfigurationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MaintenanceAssignmentDedicatedHostTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MaintenanceAssignmentDedicatedHostTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MaintenanceAssignmentDedicatedHostConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "dedicated_host_id": "dedicatedHostId",
        "location": "location",
        "maintenance_configuration_id": "maintenanceConfigurationId",
        "timeouts": "timeouts",
    },
)
class MaintenanceAssignmentDedicatedHostConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        dedicated_host_id: builtins.str,
        location: builtins.str,
        maintenance_configuration_id: builtins.str,
        timeouts: typing.Optional["MaintenanceAssignmentDedicatedHostTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dedicated_host_id: -
        :param location: -
        :param maintenance_configuration_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MaintenanceAssignmentDedicatedHostTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "dedicated_host_id": dedicated_host_id,
            "location": location,
            "maintenance_configuration_id": maintenance_configuration_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def dedicated_host_id(self) -> builtins.str:
        result = self._values.get("dedicated_host_id")
        assert result is not None, "Required property 'dedicated_host_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def maintenance_configuration_id(self) -> builtins.str:
        result = self._values.get("maintenance_configuration_id")
        assert result is not None, "Required property 'maintenance_configuration_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MaintenanceAssignmentDedicatedHostTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MaintenanceAssignmentDedicatedHostConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MaintenanceAssignmentDedicatedHostTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class MaintenanceAssignmentDedicatedHostTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MaintenanceAssignmentDedicatedHostTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MaintenanceAssignmentVirtualMachine(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MaintenanceAssignmentVirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        maintenance_configuration_id: builtins.str,
        virtual_machine_id: builtins.str,
        timeouts: typing.Optional["MaintenanceAssignmentVirtualMachineTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param maintenance_configuration_id: -
        :param virtual_machine_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MaintenanceAssignmentVirtualMachineConfig(
            location=location,
            maintenance_configuration_id=maintenance_configuration_id,
            virtual_machine_id=virtual_machine_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MaintenanceAssignmentVirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maintenanceConfigurationIdInput")
    def maintenance_configuration_id_input(self) -> builtins.str:
        return jsii.get(self, "maintenanceConfigurationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineIdInput")
    def virtual_machine_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualMachineIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MaintenanceAssignmentVirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maintenanceConfigurationId")
    def maintenance_configuration_id(self) -> builtins.str:
        return jsii.get(self, "maintenanceConfigurationId")

    @maintenance_configuration_id.setter # type: ignore
    def maintenance_configuration_id(self, value: builtins.str) -> None:
        jsii.set(self, "maintenanceConfigurationId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MaintenanceAssignmentVirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MaintenanceAssignmentVirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @virtual_machine_id.setter # type: ignore
    def virtual_machine_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineId", value)


@jsii.data_type(
    jsii_type="azurerm.MaintenanceAssignmentVirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "maintenance_configuration_id": "maintenanceConfigurationId",
        "virtual_machine_id": "virtualMachineId",
        "timeouts": "timeouts",
    },
)
class MaintenanceAssignmentVirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        maintenance_configuration_id: builtins.str,
        virtual_machine_id: builtins.str,
        timeouts: typing.Optional["MaintenanceAssignmentVirtualMachineTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param maintenance_configuration_id: -
        :param virtual_machine_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MaintenanceAssignmentVirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "maintenance_configuration_id": maintenance_configuration_id,
            "virtual_machine_id": virtual_machine_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def maintenance_configuration_id(self) -> builtins.str:
        result = self._values.get("maintenance_configuration_id")
        assert result is not None, "Required property 'maintenance_configuration_id' is missing"
        return result

    @builtins.property
    def virtual_machine_id(self) -> builtins.str:
        result = self._values.get("virtual_machine_id")
        assert result is not None, "Required property 'virtual_machine_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["MaintenanceAssignmentVirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MaintenanceAssignmentVirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MaintenanceAssignmentVirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class MaintenanceAssignmentVirtualMachineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MaintenanceAssignmentVirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MaintenanceConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MaintenanceConfiguration",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scope: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MaintenanceConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scope: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MaintenanceConfigurationConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            scope=scope,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MaintenanceConfiguration, self, [scope_, id, config])

    @jsii.member(jsii_name="resetScope")
    def reset_scope(self) -> None:
        return jsii.invoke(self, "resetScope", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MaintenanceConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MaintenanceConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MaintenanceConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MaintenanceConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "scope": "scope",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MaintenanceConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scope: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MaintenanceConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scope: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MaintenanceConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if scope is not None:
            self._values["scope"] = scope
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def scope(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scope")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MaintenanceConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MaintenanceConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MaintenanceConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MaintenanceConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MaintenanceConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ManagedApplication(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ManagedApplication",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        kind: builtins.str,
        location: builtins.str,
        managed_resource_group_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        application_definition_id: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        plan: typing.Optional[typing.List["ManagedApplicationPlan"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ManagedApplicationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param kind: -
        :param location: -
        :param managed_resource_group_name: -
        :param name: -
        :param resource_group_name: -
        :param application_definition_id: -
        :param parameters: -
        :param plan: plan block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ManagedApplicationConfig(
            kind=kind,
            location=location,
            managed_resource_group_name=managed_resource_group_name,
            name=name,
            resource_group_name=resource_group_name,
            application_definition_id=application_definition_id,
            parameters=parameters,
            plan=plan,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ManagedApplication, self, [scope, id, config])

    @jsii.member(jsii_name="outputs")
    def outputs(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "outputs", [key])

    @jsii.member(jsii_name="resetApplicationDefinitionId")
    def reset_application_definition_id(self) -> None:
        return jsii.invoke(self, "resetApplicationDefinitionId", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetPlan")
    def reset_plan(self) -> None:
        return jsii.invoke(self, "resetPlan", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kindInput")
    def kind_input(self) -> builtins.str:
        return jsii.get(self, "kindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedResourceGroupNameInput")
    def managed_resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "managedResourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationDefinitionIdInput")
    def application_definition_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "applicationDefinitionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(self) -> typing.Optional[typing.List["ManagedApplicationPlan"]]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ManagedApplicationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationDefinitionId")
    def application_definition_id(self) -> builtins.str:
        return jsii.get(self, "applicationDefinitionId")

    @application_definition_id.setter # type: ignore
    def application_definition_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationDefinitionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="kind")
    def kind(self) -> builtins.str:
        return jsii.get(self, "kind")

    @kind.setter # type: ignore
    def kind(self, value: builtins.str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedResourceGroupName")
    def managed_resource_group_name(self) -> builtins.str:
        return jsii.get(self, "managedResourceGroupName")

    @managed_resource_group_name.setter # type: ignore
    def managed_resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "managedResourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["ManagedApplicationPlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["ManagedApplicationPlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ManagedApplicationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ManagedApplicationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ManagedApplicationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "kind": "kind",
        "location": "location",
        "managed_resource_group_name": "managedResourceGroupName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "application_definition_id": "applicationDefinitionId",
        "parameters": "parameters",
        "plan": "plan",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ManagedApplicationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        kind: builtins.str,
        location: builtins.str,
        managed_resource_group_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        application_definition_id: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        plan: typing.Optional[typing.List["ManagedApplicationPlan"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ManagedApplicationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param kind: -
        :param location: -
        :param managed_resource_group_name: -
        :param name: -
        :param resource_group_name: -
        :param application_definition_id: -
        :param parameters: -
        :param plan: plan block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ManagedApplicationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "kind": kind,
            "location": location,
            "managed_resource_group_name": managed_resource_group_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if application_definition_id is not None:
            self._values["application_definition_id"] = application_definition_id
        if parameters is not None:
            self._values["parameters"] = parameters
        if plan is not None:
            self._values["plan"] = plan
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def kind(self) -> builtins.str:
        result = self._values.get("kind")
        assert result is not None, "Required property 'kind' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def managed_resource_group_name(self) -> builtins.str:
        result = self._values.get("managed_resource_group_name")
        assert result is not None, "Required property 'managed_resource_group_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def application_definition_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("application_definition_id")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def plan(self) -> typing.Optional[typing.List["ManagedApplicationPlan"]]:
        """plan block."""
        result = self._values.get("plan")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ManagedApplicationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedApplicationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ManagedApplicationDefinition(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ManagedApplicationDefinition",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: builtins.str,
        location: builtins.str,
        lock_level: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        authorization: typing.Optional[typing.List["ManagedApplicationDefinitionAuthorization"]] = None,
        create_ui_definition: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        main_template: typing.Optional[builtins.str] = None,
        package_enabled: typing.Optional[builtins.bool] = None,
        package_file_uri: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ManagedApplicationDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param location: -
        :param lock_level: -
        :param name: -
        :param resource_group_name: -
        :param authorization: authorization block.
        :param create_ui_definition: -
        :param description: -
        :param main_template: -
        :param package_enabled: -
        :param package_file_uri: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ManagedApplicationDefinitionConfig(
            display_name=display_name,
            location=location,
            lock_level=lock_level,
            name=name,
            resource_group_name=resource_group_name,
            authorization=authorization,
            create_ui_definition=create_ui_definition,
            description=description,
            main_template=main_template,
            package_enabled=package_enabled,
            package_file_uri=package_file_uri,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ManagedApplicationDefinition, self, [scope, id, config])

    @jsii.member(jsii_name="resetAuthorization")
    def reset_authorization(self) -> None:
        return jsii.invoke(self, "resetAuthorization", [])

    @jsii.member(jsii_name="resetCreateUiDefinition")
    def reset_create_ui_definition(self) -> None:
        return jsii.invoke(self, "resetCreateUiDefinition", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetMainTemplate")
    def reset_main_template(self) -> None:
        return jsii.invoke(self, "resetMainTemplate", [])

    @jsii.member(jsii_name="resetPackageEnabled")
    def reset_package_enabled(self) -> None:
        return jsii.invoke(self, "resetPackageEnabled", [])

    @jsii.member(jsii_name="resetPackageFileUri")
    def reset_package_file_uri(self) -> None:
        return jsii.invoke(self, "resetPackageFileUri", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockLevelInput")
    def lock_level_input(self) -> builtins.str:
        return jsii.get(self, "lockLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationInput")
    def authorization_input(
        self,
    ) -> typing.Optional[typing.List["ManagedApplicationDefinitionAuthorization"]]:
        return jsii.get(self, "authorizationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createUiDefinitionInput")
    def create_ui_definition_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createUiDefinitionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mainTemplateInput")
    def main_template_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "mainTemplateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="packageEnabledInput")
    def package_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "packageEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="packageFileUriInput")
    def package_file_uri_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "packageFileUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ManagedApplicationDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorization")
    def authorization(self) -> typing.List["ManagedApplicationDefinitionAuthorization"]:
        return jsii.get(self, "authorization")

    @authorization.setter # type: ignore
    def authorization(
        self,
        value: typing.List["ManagedApplicationDefinitionAuthorization"],
    ) -> None:
        jsii.set(self, "authorization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createUiDefinition")
    def create_ui_definition(self) -> builtins.str:
        return jsii.get(self, "createUiDefinition")

    @create_ui_definition.setter # type: ignore
    def create_ui_definition(self, value: builtins.str) -> None:
        jsii.set(self, "createUiDefinition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockLevel")
    def lock_level(self) -> builtins.str:
        return jsii.get(self, "lockLevel")

    @lock_level.setter # type: ignore
    def lock_level(self, value: builtins.str) -> None:
        jsii.set(self, "lockLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mainTemplate")
    def main_template(self) -> builtins.str:
        return jsii.get(self, "mainTemplate")

    @main_template.setter # type: ignore
    def main_template(self, value: builtins.str) -> None:
        jsii.set(self, "mainTemplate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="packageEnabled")
    def package_enabled(self) -> builtins.bool:
        return jsii.get(self, "packageEnabled")

    @package_enabled.setter # type: ignore
    def package_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "packageEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="packageFileUri")
    def package_file_uri(self) -> builtins.str:
        return jsii.get(self, "packageFileUri")

    @package_file_uri.setter # type: ignore
    def package_file_uri(self, value: builtins.str) -> None:
        jsii.set(self, "packageFileUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ManagedApplicationDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ManagedApplicationDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ManagedApplicationDefinitionAuthorization",
    jsii_struct_bases=[],
    name_mapping={
        "role_definition_id": "roleDefinitionId",
        "service_principal_id": "servicePrincipalId",
    },
)
class ManagedApplicationDefinitionAuthorization:
    def __init__(
        self,
        *,
        role_definition_id: builtins.str,
        service_principal_id: builtins.str,
    ) -> None:
        """
        :param role_definition_id: -
        :param service_principal_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "role_definition_id": role_definition_id,
            "service_principal_id": service_principal_id,
        }

    @builtins.property
    def role_definition_id(self) -> builtins.str:
        result = self._values.get("role_definition_id")
        assert result is not None, "Required property 'role_definition_id' is missing"
        return result

    @builtins.property
    def service_principal_id(self) -> builtins.str:
        result = self._values.get("service_principal_id")
        assert result is not None, "Required property 'service_principal_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedApplicationDefinitionAuthorization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedApplicationDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "location": "location",
        "lock_level": "lockLevel",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "authorization": "authorization",
        "create_ui_definition": "createUiDefinition",
        "description": "description",
        "main_template": "mainTemplate",
        "package_enabled": "packageEnabled",
        "package_file_uri": "packageFileUri",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ManagedApplicationDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: builtins.str,
        location: builtins.str,
        lock_level: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        authorization: typing.Optional[typing.List[ManagedApplicationDefinitionAuthorization]] = None,
        create_ui_definition: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        main_template: typing.Optional[builtins.str] = None,
        package_enabled: typing.Optional[builtins.bool] = None,
        package_file_uri: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ManagedApplicationDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param location: -
        :param lock_level: -
        :param name: -
        :param resource_group_name: -
        :param authorization: authorization block.
        :param create_ui_definition: -
        :param description: -
        :param main_template: -
        :param package_enabled: -
        :param package_file_uri: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ManagedApplicationDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "display_name": display_name,
            "location": location,
            "lock_level": lock_level,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if authorization is not None:
            self._values["authorization"] = authorization
        if create_ui_definition is not None:
            self._values["create_ui_definition"] = create_ui_definition
        if description is not None:
            self._values["description"] = description
        if main_template is not None:
            self._values["main_template"] = main_template
        if package_enabled is not None:
            self._values["package_enabled"] = package_enabled
        if package_file_uri is not None:
            self._values["package_file_uri"] = package_file_uri
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def lock_level(self) -> builtins.str:
        result = self._values.get("lock_level")
        assert result is not None, "Required property 'lock_level' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def authorization(
        self,
    ) -> typing.Optional[typing.List[ManagedApplicationDefinitionAuthorization]]:
        """authorization block."""
        result = self._values.get("authorization")
        return result

    @builtins.property
    def create_ui_definition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_ui_definition")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def main_template(self) -> typing.Optional[builtins.str]:
        result = self._values.get("main_template")
        return result

    @builtins.property
    def package_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("package_enabled")
        return result

    @builtins.property
    def package_file_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("package_file_uri")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ManagedApplicationDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedApplicationDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedApplicationDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ManagedApplicationDefinitionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedApplicationDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedApplicationPlan",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "product": "product",
        "publisher": "publisher",
        "version": "version",
        "promotion_code": "promotionCode",
    },
)
class ManagedApplicationPlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: builtins.str,
        publisher: builtins.str,
        version: builtins.str,
        promotion_code: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        :param version: -
        :param promotion_code: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "product": product,
            "publisher": publisher,
            "version": version,
        }
        if promotion_code is not None:
            self._values["promotion_code"] = promotion_code

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def promotion_code(self) -> typing.Optional[builtins.str]:
        result = self._values.get("promotion_code")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedApplicationPlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedApplicationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ManagedApplicationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedApplicationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ManagedDisk(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ManagedDisk",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        create_option: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_type: builtins.str,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_iops_read_write: typing.Optional[jsii.Number] = None,
        disk_mbps_read_write: typing.Optional[jsii.Number] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        encryption_settings: typing.Optional[typing.List["ManagedDiskEncryptionSettings"]] = None,
        image_reference_id: typing.Optional[builtins.str] = None,
        os_type: typing.Optional[builtins.str] = None,
        source_resource_id: typing.Optional[builtins.str] = None,
        source_uri: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ManagedDiskTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param create_option: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account_type: -
        :param disk_encryption_set_id: -
        :param disk_iops_read_write: -
        :param disk_mbps_read_write: -
        :param disk_size_gb: -
        :param encryption_settings: encryption_settings block.
        :param image_reference_id: -
        :param os_type: -
        :param source_resource_id: -
        :param source_uri: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ManagedDiskConfig(
            create_option=create_option,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            storage_account_type=storage_account_type,
            disk_encryption_set_id=disk_encryption_set_id,
            disk_iops_read_write=disk_iops_read_write,
            disk_mbps_read_write=disk_mbps_read_write,
            disk_size_gb=disk_size_gb,
            encryption_settings=encryption_settings,
            image_reference_id=image_reference_id,
            os_type=os_type,
            source_resource_id=source_resource_id,
            source_uri=source_uri,
            storage_account_id=storage_account_id,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ManagedDisk, self, [scope, id, config])

    @jsii.member(jsii_name="resetDiskEncryptionSetId")
    def reset_disk_encryption_set_id(self) -> None:
        return jsii.invoke(self, "resetDiskEncryptionSetId", [])

    @jsii.member(jsii_name="resetDiskIopsReadWrite")
    def reset_disk_iops_read_write(self) -> None:
        return jsii.invoke(self, "resetDiskIopsReadWrite", [])

    @jsii.member(jsii_name="resetDiskMbpsReadWrite")
    def reset_disk_mbps_read_write(self) -> None:
        return jsii.invoke(self, "resetDiskMbpsReadWrite", [])

    @jsii.member(jsii_name="resetDiskSizeGb")
    def reset_disk_size_gb(self) -> None:
        return jsii.invoke(self, "resetDiskSizeGb", [])

    @jsii.member(jsii_name="resetEncryptionSettings")
    def reset_encryption_settings(self) -> None:
        return jsii.invoke(self, "resetEncryptionSettings", [])

    @jsii.member(jsii_name="resetImageReferenceId")
    def reset_image_reference_id(self) -> None:
        return jsii.invoke(self, "resetImageReferenceId", [])

    @jsii.member(jsii_name="resetOsType")
    def reset_os_type(self) -> None:
        return jsii.invoke(self, "resetOsType", [])

    @jsii.member(jsii_name="resetSourceResourceId")
    def reset_source_resource_id(self) -> None:
        return jsii.invoke(self, "resetSourceResourceId", [])

    @jsii.member(jsii_name="resetSourceUri")
    def reset_source_uri(self) -> None:
        return jsii.invoke(self, "resetSourceUri", [])

    @jsii.member(jsii_name="resetStorageAccountId")
    def reset_storage_account_id(self) -> None:
        return jsii.invoke(self, "resetStorageAccountId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createOptionInput")
    def create_option_input(self) -> builtins.str:
        return jsii.get(self, "createOptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountTypeInput")
    def storage_account_type_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskEncryptionSetIdInput")
    def disk_encryption_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "diskEncryptionSetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskIopsReadWriteInput")
    def disk_iops_read_write_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "diskIopsReadWriteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskMbpsReadWriteInput")
    def disk_mbps_read_write_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "diskMbpsReadWriteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskSizeGbInput")
    def disk_size_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "diskSizeGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionSettingsInput")
    def encryption_settings_input(
        self,
    ) -> typing.Optional[typing.List["ManagedDiskEncryptionSettings"]]:
        return jsii.get(self, "encryptionSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageReferenceIdInput")
    def image_reference_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "imageReferenceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osTypeInput")
    def os_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "osTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceResourceIdInput")
    def source_resource_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUriInput")
    def source_uri_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ManagedDiskTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createOption")
    def create_option(self) -> builtins.str:
        return jsii.get(self, "createOption")

    @create_option.setter # type: ignore
    def create_option(self, value: builtins.str) -> None:
        jsii.set(self, "createOption", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskEncryptionSetId")
    def disk_encryption_set_id(self) -> builtins.str:
        return jsii.get(self, "diskEncryptionSetId")

    @disk_encryption_set_id.setter # type: ignore
    def disk_encryption_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "diskEncryptionSetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskIopsReadWrite")
    def disk_iops_read_write(self) -> jsii.Number:
        return jsii.get(self, "diskIopsReadWrite")

    @disk_iops_read_write.setter # type: ignore
    def disk_iops_read_write(self, value: jsii.Number) -> None:
        jsii.set(self, "diskIopsReadWrite", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskMbpsReadWrite")
    def disk_mbps_read_write(self) -> jsii.Number:
        return jsii.get(self, "diskMbpsReadWrite")

    @disk_mbps_read_write.setter # type: ignore
    def disk_mbps_read_write(self, value: jsii.Number) -> None:
        jsii.set(self, "diskMbpsReadWrite", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @disk_size_gb.setter # type: ignore
    def disk_size_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "diskSizeGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionSettings")
    def encryption_settings(self) -> typing.List["ManagedDiskEncryptionSettings"]:
        return jsii.get(self, "encryptionSettings")

    @encryption_settings.setter # type: ignore
    def encryption_settings(
        self,
        value: typing.List["ManagedDiskEncryptionSettings"],
    ) -> None:
        jsii.set(self, "encryptionSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageReferenceId")
    def image_reference_id(self) -> builtins.str:
        return jsii.get(self, "imageReferenceId")

    @image_reference_id.setter # type: ignore
    def image_reference_id(self, value: builtins.str) -> None:
        jsii.set(self, "imageReferenceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @os_type.setter # type: ignore
    def os_type(self, value: builtins.str) -> None:
        jsii.set(self, "osType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceResourceId")
    def source_resource_id(self) -> builtins.str:
        return jsii.get(self, "sourceResourceId")

    @source_resource_id.setter # type: ignore
    def source_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUri")
    def source_uri(self) -> builtins.str:
        return jsii.get(self, "sourceUri")

    @source_uri.setter # type: ignore
    def source_uri(self, value: builtins.str) -> None:
        jsii.set(self, "sourceUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountType")
    def storage_account_type(self) -> builtins.str:
        return jsii.get(self, "storageAccountType")

    @storage_account_type.setter # type: ignore
    def storage_account_type(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ManagedDiskTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ManagedDiskTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.ManagedDiskConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "create_option": "createOption",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "storage_account_type": "storageAccountType",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "disk_iops_read_write": "diskIopsReadWrite",
        "disk_mbps_read_write": "diskMbpsReadWrite",
        "disk_size_gb": "diskSizeGb",
        "encryption_settings": "encryptionSettings",
        "image_reference_id": "imageReferenceId",
        "os_type": "osType",
        "source_resource_id": "sourceResourceId",
        "source_uri": "sourceUri",
        "storage_account_id": "storageAccountId",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class ManagedDiskConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        create_option: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account_type: builtins.str,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_iops_read_write: typing.Optional[jsii.Number] = None,
        disk_mbps_read_write: typing.Optional[jsii.Number] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        encryption_settings: typing.Optional[typing.List["ManagedDiskEncryptionSettings"]] = None,
        image_reference_id: typing.Optional[builtins.str] = None,
        os_type: typing.Optional[builtins.str] = None,
        source_resource_id: typing.Optional[builtins.str] = None,
        source_uri: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ManagedDiskTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param create_option: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account_type: -
        :param disk_encryption_set_id: -
        :param disk_iops_read_write: -
        :param disk_mbps_read_write: -
        :param disk_size_gb: -
        :param encryption_settings: encryption_settings block.
        :param image_reference_id: -
        :param os_type: -
        :param source_resource_id: -
        :param source_uri: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ManagedDiskTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "create_option": create_option,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "storage_account_type": storage_account_type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if disk_iops_read_write is not None:
            self._values["disk_iops_read_write"] = disk_iops_read_write
        if disk_mbps_read_write is not None:
            self._values["disk_mbps_read_write"] = disk_mbps_read_write
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if encryption_settings is not None:
            self._values["encryption_settings"] = encryption_settings
        if image_reference_id is not None:
            self._values["image_reference_id"] = image_reference_id
        if os_type is not None:
            self._values["os_type"] = os_type
        if source_resource_id is not None:
            self._values["source_resource_id"] = source_resource_id
        if source_uri is not None:
            self._values["source_uri"] = source_uri
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def create_option(self) -> builtins.str:
        result = self._values.get("create_option")
        assert result is not None, "Required property 'create_option' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> builtins.str:
        result = self._values.get("storage_account_type")
        assert result is not None, "Required property 'storage_account_type' is missing"
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def disk_iops_read_write(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_iops_read_write")
        return result

    @builtins.property
    def disk_mbps_read_write(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_mbps_read_write")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def encryption_settings(
        self,
    ) -> typing.Optional[typing.List["ManagedDiskEncryptionSettings"]]:
        """encryption_settings block."""
        result = self._values.get("encryption_settings")
        return result

    @builtins.property
    def image_reference_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("image_reference_id")
        return result

    @builtins.property
    def os_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_type")
        return result

    @builtins.property
    def source_resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_resource_id")
        return result

    @builtins.property
    def source_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_uri")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ManagedDiskTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedDiskConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedDiskEncryptionSettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "disk_encryption_key": "diskEncryptionKey",
        "key_encryption_key": "keyEncryptionKey",
    },
)
class ManagedDiskEncryptionSettings:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        disk_encryption_key: typing.Optional[typing.List["ManagedDiskEncryptionSettingsDiskEncryptionKey"]] = None,
        key_encryption_key: typing.Optional[typing.List["ManagedDiskEncryptionSettingsKeyEncryptionKey"]] = None,
    ) -> None:
        """
        :param enabled: -
        :param disk_encryption_key: disk_encryption_key block.
        :param key_encryption_key: key_encryption_key block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if disk_encryption_key is not None:
            self._values["disk_encryption_key"] = disk_encryption_key
        if key_encryption_key is not None:
            self._values["key_encryption_key"] = key_encryption_key

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def disk_encryption_key(
        self,
    ) -> typing.Optional[typing.List["ManagedDiskEncryptionSettingsDiskEncryptionKey"]]:
        """disk_encryption_key block."""
        result = self._values.get("disk_encryption_key")
        return result

    @builtins.property
    def key_encryption_key(
        self,
    ) -> typing.Optional[typing.List["ManagedDiskEncryptionSettingsKeyEncryptionKey"]]:
        """key_encryption_key block."""
        result = self._values.get("key_encryption_key")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedDiskEncryptionSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedDiskEncryptionSettingsDiskEncryptionKey",
    jsii_struct_bases=[],
    name_mapping={"secret_url": "secretUrl", "source_vault_id": "sourceVaultId"},
)
class ManagedDiskEncryptionSettingsDiskEncryptionKey:
    def __init__(
        self,
        *,
        secret_url: builtins.str,
        source_vault_id: builtins.str,
    ) -> None:
        """
        :param secret_url: -
        :param source_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "secret_url": secret_url,
            "source_vault_id": source_vault_id,
        }

    @builtins.property
    def secret_url(self) -> builtins.str:
        result = self._values.get("secret_url")
        assert result is not None, "Required property 'secret_url' is missing"
        return result

    @builtins.property
    def source_vault_id(self) -> builtins.str:
        result = self._values.get("source_vault_id")
        assert result is not None, "Required property 'source_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedDiskEncryptionSettingsDiskEncryptionKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedDiskEncryptionSettingsKeyEncryptionKey",
    jsii_struct_bases=[],
    name_mapping={"key_url": "keyUrl", "source_vault_id": "sourceVaultId"},
)
class ManagedDiskEncryptionSettingsKeyEncryptionKey:
    def __init__(self, *, key_url: builtins.str, source_vault_id: builtins.str) -> None:
        """
        :param key_url: -
        :param source_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key_url": key_url,
            "source_vault_id": source_vault_id,
        }

    @builtins.property
    def key_url(self) -> builtins.str:
        result = self._values.get("key_url")
        assert result is not None, "Required property 'key_url' is missing"
        return result

    @builtins.property
    def source_vault_id(self) -> builtins.str:
        result = self._values.get("source_vault_id")
        assert result is not None, "Required property 'source_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedDiskEncryptionSettingsKeyEncryptionKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagedDiskTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ManagedDiskTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagedDiskTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ManagementGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ManagementGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: typing.Optional[builtins.str] = None,
        group_id: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        parent_management_group_id: typing.Optional[builtins.str] = None,
        subscription_ids: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ManagementGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param group_id: -
        :param name: -
        :param parent_management_group_id: -
        :param subscription_ids: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ManagementGroupConfig(
            display_name=display_name,
            group_id=group_id,
            name=name,
            parent_management_group_id=parent_management_group_id,
            subscription_ids=subscription_ids,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ManagementGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetGroupId")
    def reset_group_id(self) -> None:
        return jsii.invoke(self, "resetGroupId", [])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetParentManagementGroupId")
    def reset_parent_management_group_id(self) -> None:
        return jsii.invoke(self, "resetParentManagementGroupId", [])

    @jsii.member(jsii_name="resetSubscriptionIds")
    def reset_subscription_ids(self) -> None:
        return jsii.invoke(self, "resetSubscriptionIds", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupIdInput")
    def group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "groupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parentManagementGroupIdInput")
    def parent_management_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parentManagementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIdsInput")
    def subscription_ids_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "subscriptionIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ManagementGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupId")
    def group_id(self) -> builtins.str:
        return jsii.get(self, "groupId")

    @group_id.setter # type: ignore
    def group_id(self, value: builtins.str) -> None:
        jsii.set(self, "groupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parentManagementGroupId")
    def parent_management_group_id(self) -> builtins.str:
        return jsii.get(self, "parentManagementGroupId")

    @parent_management_group_id.setter # type: ignore
    def parent_management_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "parentManagementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionIds")
    def subscription_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "subscriptionIds")

    @subscription_ids.setter # type: ignore
    def subscription_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "subscriptionIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ManagementGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ManagementGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ManagementGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "group_id": "groupId",
        "name": "name",
        "parent_management_group_id": "parentManagementGroupId",
        "subscription_ids": "subscriptionIds",
        "timeouts": "timeouts",
    },
)
class ManagementGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: typing.Optional[builtins.str] = None,
        group_id: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        parent_management_group_id: typing.Optional[builtins.str] = None,
        subscription_ids: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["ManagementGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param group_id: -
        :param name: -
        :param parent_management_group_id: -
        :param subscription_ids: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ManagementGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {}
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if display_name is not None:
            self._values["display_name"] = display_name
        if group_id is not None:
            self._values["group_id"] = group_id
        if name is not None:
            self._values["name"] = name
        if parent_management_group_id is not None:
            self._values["parent_management_group_id"] = parent_management_group_id
        if subscription_ids is not None:
            self._values["subscription_ids"] = subscription_ids
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("group_id")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def parent_management_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parent_management_group_id")
        return result

    @builtins.property
    def subscription_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("subscription_ids")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ManagementGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagementGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagementGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ManagementGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagementGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ManagementLock(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ManagementLock",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        lock_level: builtins.str,
        name: builtins.str,
        scope: builtins.str,
        notes: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ManagementLockTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param lock_level: -
        :param name: -
        :param scope: -
        :param notes: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ManagementLockConfig(
            lock_level=lock_level,
            name=name,
            scope=scope,
            notes=notes,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ManagementLock, self, [scope_, id, config])

    @jsii.member(jsii_name="resetNotes")
    def reset_notes(self) -> None:
        return jsii.invoke(self, "resetNotes", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockLevelInput")
    def lock_level_input(self) -> builtins.str:
        return jsii.get(self, "lockLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notesInput")
    def notes_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "notesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ManagementLockTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockLevel")
    def lock_level(self) -> builtins.str:
        return jsii.get(self, "lockLevel")

    @lock_level.setter # type: ignore
    def lock_level(self, value: builtins.str) -> None:
        jsii.set(self, "lockLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notes")
    def notes(self) -> builtins.str:
        return jsii.get(self, "notes")

    @notes.setter # type: ignore
    def notes(self, value: builtins.str) -> None:
        jsii.set(self, "notes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ManagementLockTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ManagementLockTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ManagementLockConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "lock_level": "lockLevel",
        "name": "name",
        "scope": "scope",
        "notes": "notes",
        "timeouts": "timeouts",
    },
)
class ManagementLockConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        lock_level: builtins.str,
        name: builtins.str,
        scope: builtins.str,
        notes: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ManagementLockTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param lock_level: -
        :param name: -
        :param scope: -
        :param notes: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ManagementLockTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "lock_level": lock_level,
            "name": name,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if notes is not None:
            self._values["notes"] = notes
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def lock_level(self) -> builtins.str:
        result = self._values.get("lock_level")
        assert result is not None, "Required property 'lock_level' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def notes(self) -> typing.Optional[builtins.str]:
        result = self._values.get("notes")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ManagementLockTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagementLockConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ManagementLockTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ManagementLockTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ManagementLockTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MapsAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MapsAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MapsAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MapsAccountConfig(
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MapsAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="xMsClientId")
    def x_ms_client_id(self) -> builtins.str:
        return jsii.get(self, "xMsClientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MapsAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MapsAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MapsAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MapsAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MapsAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MapsAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MapsAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MapsAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MapsAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MapsAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MapsAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MapsAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MariadbConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MariadbConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["MariadbConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param value: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MariadbConfigurationConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            value=value,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MariadbConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MariadbConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MariadbConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MariadbConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.MariadbConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "value": "value",
        "timeouts": "timeouts",
    },
)
class MariadbConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["MariadbConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param value: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MariadbConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MariadbConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MariadbConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MariadbConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MariadbDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MariadbDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        charset: builtins.str,
        collation: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["MariadbDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param charset: -
        :param collation: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MariadbDatabaseConfig(
            charset=charset,
            collation=collation,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MariadbDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="charsetInput")
    def charset_input(self) -> builtins.str:
        return jsii.get(self, "charsetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collationInput")
    def collation_input(self) -> builtins.str:
        return jsii.get(self, "collationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MariadbDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="charset")
    def charset(self) -> builtins.str:
        return jsii.get(self, "charset")

    @charset.setter # type: ignore
    def charset(self, value: builtins.str) -> None:
        jsii.set(self, "charset", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @collation.setter # type: ignore
    def collation(self, value: builtins.str) -> None:
        jsii.set(self, "collation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MariadbDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MariadbDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MariadbDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "charset": "charset",
        "collation": "collation",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "timeouts": "timeouts",
    },
)
class MariadbDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        charset: builtins.str,
        collation: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["MariadbDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param charset: -
        :param collation: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MariadbDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "charset": charset,
            "collation": collation,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def charset(self) -> builtins.str:
        result = self._values.get("charset")
        assert result is not None, "Required property 'charset' is missing"
        return result

    @builtins.property
    def collation(self) -> builtins.str:
        result = self._values.get("collation")
        assert result is not None, "Required property 'collation' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MariadbDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MariadbDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MariadbDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MariadbFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MariadbFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["MariadbFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MariadbFirewallRuleConfig(
            end_ip_address=end_ip_address,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            start_ip_address=start_ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MariadbFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddressInput")
    def end_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "endIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddressInput")
    def start_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "startIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MariadbFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddress")
    def end_ip_address(self) -> builtins.str:
        return jsii.get(self, "endIpAddress")

    @end_ip_address.setter # type: ignore
    def end_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "endIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddress")
    def start_ip_address(self) -> builtins.str:
        return jsii.get(self, "startIpAddress")

    @start_ip_address.setter # type: ignore
    def start_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "startIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MariadbFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MariadbFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MariadbFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "end_ip_address": "endIpAddress",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "start_ip_address": "startIpAddress",
        "timeouts": "timeouts",
    },
)
class MariadbFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["MariadbFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MariadbFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "end_ip_address": end_ip_address,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "start_ip_address": start_ip_address,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def end_ip_address(self) -> builtins.str:
        result = self._values.get("end_ip_address")
        assert result is not None, "Required property 'end_ip_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def start_ip_address(self) -> builtins.str:
        result = self._values.get("start_ip_address")
        assert result is not None, "Required property 'start_ip_address' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MariadbFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MariadbFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MariadbFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MariadbServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MariadbServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        version: builtins.str,
        administrator_login: typing.Optional[builtins.str] = None,
        administrator_login_password: typing.Optional[builtins.str] = None,
        auto_grow_enabled: typing.Optional[builtins.bool] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_server_id: typing.Optional[builtins.str] = None,
        geo_redundant_backup_enabled: typing.Optional[builtins.bool] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        ssl_enforcement: typing.Optional[builtins.str] = None,
        ssl_enforcement_enabled: typing.Optional[builtins.bool] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
        storage_profile: typing.Optional[typing.List["MariadbServerStorageProfile"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MariadbServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param version: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param auto_grow_enabled: -
        :param backup_retention_days: -
        :param create_mode: -
        :param creation_source_server_id: -
        :param geo_redundant_backup_enabled: -
        :param public_network_access_enabled: -
        :param restore_point_in_time: -
        :param ssl_enforcement: -
        :param ssl_enforcement_enabled: -
        :param storage_mb: -
        :param storage_profile: storage_profile block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MariadbServerConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            version=version,
            administrator_login=administrator_login,
            administrator_login_password=administrator_login_password,
            auto_grow_enabled=auto_grow_enabled,
            backup_retention_days=backup_retention_days,
            create_mode=create_mode,
            creation_source_server_id=creation_source_server_id,
            geo_redundant_backup_enabled=geo_redundant_backup_enabled,
            public_network_access_enabled=public_network_access_enabled,
            restore_point_in_time=restore_point_in_time,
            ssl_enforcement=ssl_enforcement,
            ssl_enforcement_enabled=ssl_enforcement_enabled,
            storage_mb=storage_mb,
            storage_profile=storage_profile,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MariadbServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdministratorLogin")
    def reset_administrator_login(self) -> None:
        return jsii.invoke(self, "resetAdministratorLogin", [])

    @jsii.member(jsii_name="resetAdministratorLoginPassword")
    def reset_administrator_login_password(self) -> None:
        return jsii.invoke(self, "resetAdministratorLoginPassword", [])

    @jsii.member(jsii_name="resetAutoGrowEnabled")
    def reset_auto_grow_enabled(self) -> None:
        return jsii.invoke(self, "resetAutoGrowEnabled", [])

    @jsii.member(jsii_name="resetBackupRetentionDays")
    def reset_backup_retention_days(self) -> None:
        return jsii.invoke(self, "resetBackupRetentionDays", [])

    @jsii.member(jsii_name="resetCreateMode")
    def reset_create_mode(self) -> None:
        return jsii.invoke(self, "resetCreateMode", [])

    @jsii.member(jsii_name="resetCreationSourceServerId")
    def reset_creation_source_server_id(self) -> None:
        return jsii.invoke(self, "resetCreationSourceServerId", [])

    @jsii.member(jsii_name="resetGeoRedundantBackupEnabled")
    def reset_geo_redundant_backup_enabled(self) -> None:
        return jsii.invoke(self, "resetGeoRedundantBackupEnabled", [])

    @jsii.member(jsii_name="resetPublicNetworkAccessEnabled")
    def reset_public_network_access_enabled(self) -> None:
        return jsii.invoke(self, "resetPublicNetworkAccessEnabled", [])

    @jsii.member(jsii_name="resetRestorePointInTime")
    def reset_restore_point_in_time(self) -> None:
        return jsii.invoke(self, "resetRestorePointInTime", [])

    @jsii.member(jsii_name="resetSslEnforcement")
    def reset_ssl_enforcement(self) -> None:
        return jsii.invoke(self, "resetSslEnforcement", [])

    @jsii.member(jsii_name="resetSslEnforcementEnabled")
    def reset_ssl_enforcement_enabled(self) -> None:
        return jsii.invoke(self, "resetSslEnforcementEnabled", [])

    @jsii.member(jsii_name="resetStorageMb")
    def reset_storage_mb(self) -> None:
        return jsii.invoke(self, "resetStorageMb", [])

    @jsii.member(jsii_name="resetStorageProfile")
    def reset_storage_profile(self) -> None:
        return jsii.invoke(self, "resetStorageProfile", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> builtins.str:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginInput")
    def administrator_login_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "administratorLoginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPasswordInput")
    def administrator_login_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "administratorLoginPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrowEnabledInput")
    def auto_grow_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoGrowEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDaysInput")
    def backup_retention_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "backupRetentionDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createModeInput")
    def create_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceServerIdInput")
    def creation_source_server_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "creationSourceServerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackupEnabledInput")
    def geo_redundant_backup_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "geoRedundantBackupEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabledInput")
    def public_network_access_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "publicNetworkAccessEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTimeInput")
    def restore_point_in_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "restorePointInTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementEnabledInput")
    def ssl_enforcement_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sslEnforcementEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementInput")
    def ssl_enforcement_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sslEnforcementInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMbInput")
    def storage_mb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "storageMbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileInput")
    def storage_profile_input(
        self,
    ) -> typing.Optional[typing.List["MariadbServerStorageProfile"]]:
        return jsii.get(self, "storageProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MariadbServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @administrator_login.setter # type: ignore
    def administrator_login(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLogin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPassword")
    def administrator_login_password(self) -> builtins.str:
        return jsii.get(self, "administratorLoginPassword")

    @administrator_login_password.setter # type: ignore
    def administrator_login_password(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLoginPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrowEnabled")
    def auto_grow_enabled(self) -> builtins.bool:
        return jsii.get(self, "autoGrowEnabled")

    @auto_grow_enabled.setter # type: ignore
    def auto_grow_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "autoGrowEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDays")
    def backup_retention_days(self) -> jsii.Number:
        return jsii.get(self, "backupRetentionDays")

    @backup_retention_days.setter # type: ignore
    def backup_retention_days(self, value: jsii.Number) -> None:
        jsii.set(self, "backupRetentionDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createMode")
    def create_mode(self) -> builtins.str:
        return jsii.get(self, "createMode")

    @create_mode.setter # type: ignore
    def create_mode(self, value: builtins.str) -> None:
        jsii.set(self, "createMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceServerId")
    def creation_source_server_id(self) -> builtins.str:
        return jsii.get(self, "creationSourceServerId")

    @creation_source_server_id.setter # type: ignore
    def creation_source_server_id(self, value: builtins.str) -> None:
        jsii.set(self, "creationSourceServerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackupEnabled")
    def geo_redundant_backup_enabled(self) -> builtins.bool:
        return jsii.get(self, "geoRedundantBackupEnabled")

    @geo_redundant_backup_enabled.setter # type: ignore
    def geo_redundant_backup_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "geoRedundantBackupEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @public_network_access_enabled.setter # type: ignore
    def public_network_access_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "publicNetworkAccessEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTime")
    def restore_point_in_time(self) -> builtins.str:
        return jsii.get(self, "restorePointInTime")

    @restore_point_in_time.setter # type: ignore
    def restore_point_in_time(self, value: builtins.str) -> None:
        jsii.set(self, "restorePointInTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcement")
    def ssl_enforcement(self) -> builtins.str:
        return jsii.get(self, "sslEnforcement")

    @ssl_enforcement.setter # type: ignore
    def ssl_enforcement(self, value: builtins.str) -> None:
        jsii.set(self, "sslEnforcement", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementEnabled")
    def ssl_enforcement_enabled(self) -> builtins.bool:
        return jsii.get(self, "sslEnforcementEnabled")

    @ssl_enforcement_enabled.setter # type: ignore
    def ssl_enforcement_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "sslEnforcementEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMb")
    def storage_mb(self) -> jsii.Number:
        return jsii.get(self, "storageMb")

    @storage_mb.setter # type: ignore
    def storage_mb(self, value: jsii.Number) -> None:
        jsii.set(self, "storageMb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfile")
    def storage_profile(self) -> typing.List["MariadbServerStorageProfile"]:
        return jsii.get(self, "storageProfile")

    @storage_profile.setter # type: ignore
    def storage_profile(
        self,
        value: typing.List["MariadbServerStorageProfile"],
    ) -> None:
        jsii.set(self, "storageProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MariadbServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MariadbServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.MariadbServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "version": "version",
        "administrator_login": "administratorLogin",
        "administrator_login_password": "administratorLoginPassword",
        "auto_grow_enabled": "autoGrowEnabled",
        "backup_retention_days": "backupRetentionDays",
        "create_mode": "createMode",
        "creation_source_server_id": "creationSourceServerId",
        "geo_redundant_backup_enabled": "geoRedundantBackupEnabled",
        "public_network_access_enabled": "publicNetworkAccessEnabled",
        "restore_point_in_time": "restorePointInTime",
        "ssl_enforcement": "sslEnforcement",
        "ssl_enforcement_enabled": "sslEnforcementEnabled",
        "storage_mb": "storageMb",
        "storage_profile": "storageProfile",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MariadbServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        version: builtins.str,
        administrator_login: typing.Optional[builtins.str] = None,
        administrator_login_password: typing.Optional[builtins.str] = None,
        auto_grow_enabled: typing.Optional[builtins.bool] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_server_id: typing.Optional[builtins.str] = None,
        geo_redundant_backup_enabled: typing.Optional[builtins.bool] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        ssl_enforcement: typing.Optional[builtins.str] = None,
        ssl_enforcement_enabled: typing.Optional[builtins.bool] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
        storage_profile: typing.Optional[typing.List["MariadbServerStorageProfile"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MariadbServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param version: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param auto_grow_enabled: -
        :param backup_retention_days: -
        :param create_mode: -
        :param creation_source_server_id: -
        :param geo_redundant_backup_enabled: -
        :param public_network_access_enabled: -
        :param restore_point_in_time: -
        :param ssl_enforcement: -
        :param ssl_enforcement_enabled: -
        :param storage_mb: -
        :param storage_profile: storage_profile block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MariadbServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "version": version,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if administrator_login is not None:
            self._values["administrator_login"] = administrator_login
        if administrator_login_password is not None:
            self._values["administrator_login_password"] = administrator_login_password
        if auto_grow_enabled is not None:
            self._values["auto_grow_enabled"] = auto_grow_enabled
        if backup_retention_days is not None:
            self._values["backup_retention_days"] = backup_retention_days
        if create_mode is not None:
            self._values["create_mode"] = create_mode
        if creation_source_server_id is not None:
            self._values["creation_source_server_id"] = creation_source_server_id
        if geo_redundant_backup_enabled is not None:
            self._values["geo_redundant_backup_enabled"] = geo_redundant_backup_enabled
        if public_network_access_enabled is not None:
            self._values["public_network_access_enabled"] = public_network_access_enabled
        if restore_point_in_time is not None:
            self._values["restore_point_in_time"] = restore_point_in_time
        if ssl_enforcement is not None:
            self._values["ssl_enforcement"] = ssl_enforcement
        if ssl_enforcement_enabled is not None:
            self._values["ssl_enforcement_enabled"] = ssl_enforcement_enabled
        if storage_mb is not None:
            self._values["storage_mb"] = storage_mb
        if storage_profile is not None:
            self._values["storage_profile"] = storage_profile
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def administrator_login(self) -> typing.Optional[builtins.str]:
        result = self._values.get("administrator_login")
        return result

    @builtins.property
    def administrator_login_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("administrator_login_password")
        return result

    @builtins.property
    def auto_grow_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_grow_enabled")
        return result

    @builtins.property
    def backup_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("backup_retention_days")
        return result

    @builtins.property
    def create_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_mode")
        return result

    @builtins.property
    def creation_source_server_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("creation_source_server_id")
        return result

    @builtins.property
    def geo_redundant_backup_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("geo_redundant_backup_enabled")
        return result

    @builtins.property
    def public_network_access_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("public_network_access_enabled")
        return result

    @builtins.property
    def restore_point_in_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("restore_point_in_time")
        return result

    @builtins.property
    def ssl_enforcement(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssl_enforcement")
        return result

    @builtins.property
    def ssl_enforcement_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ssl_enforcement_enabled")
        return result

    @builtins.property
    def storage_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("storage_mb")
        return result

    @builtins.property
    def storage_profile(
        self,
    ) -> typing.Optional[typing.List["MariadbServerStorageProfile"]]:
        """storage_profile block."""
        result = self._values.get("storage_profile")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MariadbServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MariadbServerStorageProfile",
    jsii_struct_bases=[],
    name_mapping={
        "auto_grow": "autoGrow",
        "backup_retention_days": "backupRetentionDays",
        "geo_redundant_backup": "geoRedundantBackup",
        "storage_mb": "storageMb",
    },
)
class MariadbServerStorageProfile:
    def __init__(
        self,
        *,
        auto_grow: typing.Optional[builtins.str] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        geo_redundant_backup: typing.Optional[builtins.str] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param auto_grow: -
        :param backup_retention_days: -
        :param geo_redundant_backup: -
        :param storage_mb: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if auto_grow is not None:
            self._values["auto_grow"] = auto_grow
        if backup_retention_days is not None:
            self._values["backup_retention_days"] = backup_retention_days
        if geo_redundant_backup is not None:
            self._values["geo_redundant_backup"] = geo_redundant_backup
        if storage_mb is not None:
            self._values["storage_mb"] = storage_mb

    @builtins.property
    def auto_grow(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_grow")
        return result

    @builtins.property
    def backup_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("backup_retention_days")
        return result

    @builtins.property
    def geo_redundant_backup(self) -> typing.Optional[builtins.str]:
        result = self._values.get("geo_redundant_backup")
        return result

    @builtins.property
    def storage_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("storage_mb")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbServerStorageProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MariadbServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MariadbServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MariadbVirtualNetworkRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MariadbVirtualNetworkRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["MariadbVirtualNetworkRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MariadbVirtualNetworkRuleConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            subnet_id=subnet_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MariadbVirtualNetworkRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MariadbVirtualNetworkRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MariadbVirtualNetworkRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MariadbVirtualNetworkRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MariadbVirtualNetworkRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "subnet_id": "subnetId",
        "timeouts": "timeouts",
    },
)
class MariadbVirtualNetworkRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["MariadbVirtualNetworkRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MariadbVirtualNetworkRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MariadbVirtualNetworkRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbVirtualNetworkRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MariadbVirtualNetworkRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MariadbVirtualNetworkRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MariadbVirtualNetworkRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MarketplaceAgreement(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MarketplaceAgreement",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        offer: builtins.str,
        plan: builtins.str,
        publisher: builtins.str,
        timeouts: typing.Optional["MarketplaceAgreementTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param offer: -
        :param plan: -
        :param publisher: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MarketplaceAgreementConfig(
            offer=offer,
            plan=plan,
            publisher=publisher,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MarketplaceAgreement, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTextLink")
    def license_text_link(self) -> builtins.str:
        return jsii.get(self, "licenseTextLink")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offerInput")
    def offer_input(self) -> builtins.str:
        return jsii.get(self, "offerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(self) -> builtins.str:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privacyPolicyLink")
    def privacy_policy_link(self) -> builtins.str:
        return jsii.get(self, "privacyPolicyLink")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherInput")
    def publisher_input(self) -> builtins.str:
        return jsii.get(self, "publisherInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MarketplaceAgreementTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="offer")
    def offer(self) -> builtins.str:
        return jsii.get(self, "offer")

    @offer.setter # type: ignore
    def offer(self, value: builtins.str) -> None:
        jsii.set(self, "offer", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> builtins.str:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: builtins.str) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisher")
    def publisher(self) -> builtins.str:
        return jsii.get(self, "publisher")

    @publisher.setter # type: ignore
    def publisher(self, value: builtins.str) -> None:
        jsii.set(self, "publisher", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MarketplaceAgreementTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MarketplaceAgreementTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MarketplaceAgreementConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "offer": "offer",
        "plan": "plan",
        "publisher": "publisher",
        "timeouts": "timeouts",
    },
)
class MarketplaceAgreementConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        offer: builtins.str,
        plan: builtins.str,
        publisher: builtins.str,
        timeouts: typing.Optional["MarketplaceAgreementTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param offer: -
        :param plan: -
        :param publisher: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MarketplaceAgreementTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "plan": plan,
            "publisher": publisher,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def plan(self) -> builtins.str:
        result = self._values.get("plan")
        assert result is not None, "Required property 'plan' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MarketplaceAgreementTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MarketplaceAgreementConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MarketplaceAgreementTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MarketplaceAgreementTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MarketplaceAgreementTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MediaAsset(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MediaAsset",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        media_services_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        alternate_id: typing.Optional[builtins.str] = None,
        container: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        storage_account_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MediaAssetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param media_services_account_name: -
        :param name: -
        :param resource_group_name: -
        :param alternate_id: -
        :param container: -
        :param description: -
        :param storage_account_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MediaAssetConfig(
            media_services_account_name=media_services_account_name,
            name=name,
            resource_group_name=resource_group_name,
            alternate_id=alternate_id,
            container=container,
            description=description,
            storage_account_name=storage_account_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MediaAsset, self, [scope, id, config])

    @jsii.member(jsii_name="resetAlternateId")
    def reset_alternate_id(self) -> None:
        return jsii.invoke(self, "resetAlternateId", [])

    @jsii.member(jsii_name="resetContainer")
    def reset_container(self) -> None:
        return jsii.invoke(self, "resetContainer", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetStorageAccountName")
    def reset_storage_account_name(self) -> None:
        return jsii.invoke(self, "resetStorageAccountName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mediaServicesAccountNameInput")
    def media_services_account_name_input(self) -> builtins.str:
        return jsii.get(self, "mediaServicesAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alternateIdInput")
    def alternate_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "alternateIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerInput")
    def container_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "containerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MediaAssetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alternateId")
    def alternate_id(self) -> builtins.str:
        return jsii.get(self, "alternateId")

    @alternate_id.setter # type: ignore
    def alternate_id(self, value: builtins.str) -> None:
        jsii.set(self, "alternateId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="container")
    def container(self) -> builtins.str:
        return jsii.get(self, "container")

    @container.setter # type: ignore
    def container(self, value: builtins.str) -> None:
        jsii.set(self, "container", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mediaServicesAccountName")
    def media_services_account_name(self) -> builtins.str:
        return jsii.get(self, "mediaServicesAccountName")

    @media_services_account_name.setter # type: ignore
    def media_services_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "mediaServicesAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MediaAssetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MediaAssetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MediaAssetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "media_services_account_name": "mediaServicesAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "alternate_id": "alternateId",
        "container": "container",
        "description": "description",
        "storage_account_name": "storageAccountName",
        "timeouts": "timeouts",
    },
)
class MediaAssetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        media_services_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        alternate_id: typing.Optional[builtins.str] = None,
        container: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        storage_account_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MediaAssetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param media_services_account_name: -
        :param name: -
        :param resource_group_name: -
        :param alternate_id: -
        :param container: -
        :param description: -
        :param storage_account_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MediaAssetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "media_services_account_name": media_services_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if alternate_id is not None:
            self._values["alternate_id"] = alternate_id
        if container is not None:
            self._values["container"] = container
        if description is not None:
            self._values["description"] = description
        if storage_account_name is not None:
            self._values["storage_account_name"] = storage_account_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def media_services_account_name(self) -> builtins.str:
        result = self._values.get("media_services_account_name")
        assert result is not None, "Required property 'media_services_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def alternate_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("alternate_id")
        return result

    @builtins.property
    def container(self) -> typing.Optional[builtins.str]:
        result = self._values.get("container")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def storage_account_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_name")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MediaAssetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaAssetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaAssetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MediaAssetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaAssetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MediaServicesAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MediaServicesAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account: typing.List["MediaServicesAccountStorageAccount"],
        identity: typing.Optional[typing.List["MediaServicesAccountIdentity"]] = None,
        storage_authentication_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MediaServicesAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account: storage_account block.
        :param identity: identity block.
        :param storage_authentication_type: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MediaServicesAccountConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            storage_account=storage_account,
            identity=identity,
            storage_authentication_type=storage_authentication_type,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MediaServicesAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetStorageAuthenticationType")
    def reset_storage_authentication_type(self) -> None:
        return jsii.invoke(self, "resetStorageAuthenticationType", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountInput")
    def storage_account_input(
        self,
    ) -> typing.List["MediaServicesAccountStorageAccount"]:
        return jsii.get(self, "storageAccountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["MediaServicesAccountIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAuthenticationTypeInput")
    def storage_authentication_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAuthenticationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MediaServicesAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["MediaServicesAccountIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["MediaServicesAccountIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccount")
    def storage_account(self) -> typing.List["MediaServicesAccountStorageAccount"]:
        return jsii.get(self, "storageAccount")

    @storage_account.setter # type: ignore
    def storage_account(
        self,
        value: typing.List["MediaServicesAccountStorageAccount"],
    ) -> None:
        jsii.set(self, "storageAccount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAuthenticationType")
    def storage_authentication_type(self) -> builtins.str:
        return jsii.get(self, "storageAuthenticationType")

    @storage_authentication_type.setter # type: ignore
    def storage_authentication_type(self, value: builtins.str) -> None:
        jsii.set(self, "storageAuthenticationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MediaServicesAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MediaServicesAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MediaServicesAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "storage_account": "storageAccount",
        "identity": "identity",
        "storage_authentication_type": "storageAuthenticationType",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MediaServicesAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        storage_account: typing.List["MediaServicesAccountStorageAccount"],
        identity: typing.Optional[typing.List["MediaServicesAccountIdentity"]] = None,
        storage_authentication_type: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MediaServicesAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param storage_account: storage_account block.
        :param identity: identity block.
        :param storage_authentication_type: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MediaServicesAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "storage_account": storage_account,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if identity is not None:
            self._values["identity"] = identity
        if storage_authentication_type is not None:
            self._values["storage_authentication_type"] = storage_authentication_type
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account(self) -> typing.List["MediaServicesAccountStorageAccount"]:
        """storage_account block."""
        result = self._values.get("storage_account")
        assert result is not None, "Required property 'storage_account' is missing"
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["MediaServicesAccountIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def storage_authentication_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_authentication_type")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MediaServicesAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaServicesAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaServicesAccountIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class MediaServicesAccountIdentity:
    def __init__(self, *, type: typing.Optional[builtins.str] = None) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaServicesAccountIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaServicesAccountStorageAccount",
    jsii_struct_bases=[],
    name_mapping={"id": "id", "is_primary": "isPrimary"},
)
class MediaServicesAccountStorageAccount:
    def __init__(
        self,
        *,
        id: builtins.str,
        is_primary: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param id: -
        :param is_primary: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
        }
        if is_primary is not None:
            self._values["is_primary"] = is_primary

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    @builtins.property
    def is_primary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("is_primary")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaServicesAccountStorageAccount(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaServicesAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MediaServicesAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaServicesAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MediaTransform(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MediaTransform",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        media_services_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        output: typing.Optional[typing.List["MediaTransformOutput"]] = None,
        timeouts: typing.Optional["MediaTransformTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param media_services_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param output: output block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MediaTransformConfig(
            media_services_account_name=media_services_account_name,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            output=output,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MediaTransform, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetOutput")
    def reset_output(self) -> None:
        return jsii.invoke(self, "resetOutput", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mediaServicesAccountNameInput")
    def media_services_account_name_input(self) -> builtins.str:
        return jsii.get(self, "mediaServicesAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputInput")
    def output_input(self) -> typing.Optional[typing.List["MediaTransformOutput"]]:
        return jsii.get(self, "outputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MediaTransformTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mediaServicesAccountName")
    def media_services_account_name(self) -> builtins.str:
        return jsii.get(self, "mediaServicesAccountName")

    @media_services_account_name.setter # type: ignore
    def media_services_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "mediaServicesAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="output")
    def output(self) -> typing.List["MediaTransformOutput"]:
        return jsii.get(self, "output")

    @output.setter # type: ignore
    def output(self, value: typing.List["MediaTransformOutput"]) -> None:
        jsii.set(self, "output", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MediaTransformTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MediaTransformTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MediaTransformConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "media_services_account_name": "mediaServicesAccountName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "output": "output",
        "timeouts": "timeouts",
    },
)
class MediaTransformConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        media_services_account_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        output: typing.Optional[typing.List["MediaTransformOutput"]] = None,
        timeouts: typing.Optional["MediaTransformTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param media_services_account_name: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param output: output block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MediaTransformTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "media_services_account_name": media_services_account_name,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if output is not None:
            self._values["output"] = output
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def media_services_account_name(self) -> builtins.str:
        result = self._values.get("media_services_account_name")
        assert result is not None, "Required property 'media_services_account_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def output(self) -> typing.Optional[typing.List["MediaTransformOutput"]]:
        """output block."""
        result = self._values.get("output")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MediaTransformTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaTransformConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaTransformOutput",
    jsii_struct_bases=[],
    name_mapping={
        "audio_analyzer_preset": "audioAnalyzerPreset",
        "builtin_preset": "builtinPreset",
        "face_detector_preset": "faceDetectorPreset",
        "on_error_action": "onErrorAction",
        "relative_priority": "relativePriority",
        "video_analyzer_preset": "videoAnalyzerPreset",
    },
)
class MediaTransformOutput:
    def __init__(
        self,
        *,
        audio_analyzer_preset: typing.Optional[typing.List["MediaTransformOutputAudioAnalyzerPreset"]] = None,
        builtin_preset: typing.Optional[typing.List["MediaTransformOutputBuiltinPreset"]] = None,
        face_detector_preset: typing.Optional[typing.List["MediaTransformOutputFaceDetectorPreset"]] = None,
        on_error_action: typing.Optional[builtins.str] = None,
        relative_priority: typing.Optional[builtins.str] = None,
        video_analyzer_preset: typing.Optional[typing.List["MediaTransformOutputVideoAnalyzerPreset"]] = None,
    ) -> None:
        """
        :param audio_analyzer_preset: audio_analyzer_preset block.
        :param builtin_preset: builtin_preset block.
        :param face_detector_preset: face_detector_preset block.
        :param on_error_action: -
        :param relative_priority: -
        :param video_analyzer_preset: video_analyzer_preset block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if audio_analyzer_preset is not None:
            self._values["audio_analyzer_preset"] = audio_analyzer_preset
        if builtin_preset is not None:
            self._values["builtin_preset"] = builtin_preset
        if face_detector_preset is not None:
            self._values["face_detector_preset"] = face_detector_preset
        if on_error_action is not None:
            self._values["on_error_action"] = on_error_action
        if relative_priority is not None:
            self._values["relative_priority"] = relative_priority
        if video_analyzer_preset is not None:
            self._values["video_analyzer_preset"] = video_analyzer_preset

    @builtins.property
    def audio_analyzer_preset(
        self,
    ) -> typing.Optional[typing.List["MediaTransformOutputAudioAnalyzerPreset"]]:
        """audio_analyzer_preset block."""
        result = self._values.get("audio_analyzer_preset")
        return result

    @builtins.property
    def builtin_preset(
        self,
    ) -> typing.Optional[typing.List["MediaTransformOutputBuiltinPreset"]]:
        """builtin_preset block."""
        result = self._values.get("builtin_preset")
        return result

    @builtins.property
    def face_detector_preset(
        self,
    ) -> typing.Optional[typing.List["MediaTransformOutputFaceDetectorPreset"]]:
        """face_detector_preset block."""
        result = self._values.get("face_detector_preset")
        return result

    @builtins.property
    def on_error_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("on_error_action")
        return result

    @builtins.property
    def relative_priority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("relative_priority")
        return result

    @builtins.property
    def video_analyzer_preset(
        self,
    ) -> typing.Optional[typing.List["MediaTransformOutputVideoAnalyzerPreset"]]:
        """video_analyzer_preset block."""
        result = self._values.get("video_analyzer_preset")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaTransformOutput(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaTransformOutputAudioAnalyzerPreset",
    jsii_struct_bases=[],
    name_mapping={
        "audio_analysis_mode": "audioAnalysisMode",
        "audio_language": "audioLanguage",
    },
)
class MediaTransformOutputAudioAnalyzerPreset:
    def __init__(
        self,
        *,
        audio_analysis_mode: typing.Optional[builtins.str] = None,
        audio_language: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param audio_analysis_mode: -
        :param audio_language: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if audio_analysis_mode is not None:
            self._values["audio_analysis_mode"] = audio_analysis_mode
        if audio_language is not None:
            self._values["audio_language"] = audio_language

    @builtins.property
    def audio_analysis_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("audio_analysis_mode")
        return result

    @builtins.property
    def audio_language(self) -> typing.Optional[builtins.str]:
        result = self._values.get("audio_language")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaTransformOutputAudioAnalyzerPreset(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaTransformOutputBuiltinPreset",
    jsii_struct_bases=[],
    name_mapping={"preset_name": "presetName"},
)
class MediaTransformOutputBuiltinPreset:
    def __init__(self, *, preset_name: typing.Optional[builtins.str] = None) -> None:
        """
        :param preset_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if preset_name is not None:
            self._values["preset_name"] = preset_name

    @builtins.property
    def preset_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("preset_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaTransformOutputBuiltinPreset(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaTransformOutputFaceDetectorPreset",
    jsii_struct_bases=[],
    name_mapping={"analysis_resolution": "analysisResolution"},
)
class MediaTransformOutputFaceDetectorPreset:
    def __init__(
        self,
        *,
        analysis_resolution: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param analysis_resolution: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if analysis_resolution is not None:
            self._values["analysis_resolution"] = analysis_resolution

    @builtins.property
    def analysis_resolution(self) -> typing.Optional[builtins.str]:
        result = self._values.get("analysis_resolution")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaTransformOutputFaceDetectorPreset(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaTransformOutputVideoAnalyzerPreset",
    jsii_struct_bases=[],
    name_mapping={
        "audio_analysis_mode": "audioAnalysisMode",
        "audio_language": "audioLanguage",
        "insights_type": "insightsType",
    },
)
class MediaTransformOutputVideoAnalyzerPreset:
    def __init__(
        self,
        *,
        audio_analysis_mode: typing.Optional[builtins.str] = None,
        audio_language: typing.Optional[builtins.str] = None,
        insights_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param audio_analysis_mode: -
        :param audio_language: -
        :param insights_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if audio_analysis_mode is not None:
            self._values["audio_analysis_mode"] = audio_analysis_mode
        if audio_language is not None:
            self._values["audio_language"] = audio_language
        if insights_type is not None:
            self._values["insights_type"] = insights_type

    @builtins.property
    def audio_analysis_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("audio_analysis_mode")
        return result

    @builtins.property
    def audio_language(self) -> typing.Optional[builtins.str]:
        result = self._values.get("audio_language")
        return result

    @builtins.property
    def insights_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("insights_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaTransformOutputVideoAnalyzerPreset(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MediaTransformTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MediaTransformTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MediaTransformTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorActionGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorActionGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        short_name: builtins.str,
        arm_role_receiver: typing.Optional[typing.List["MonitorActionGroupArmRoleReceiver"]] = None,
        automation_runbook_receiver: typing.Optional[typing.List["MonitorActionGroupAutomationRunbookReceiver"]] = None,
        azure_app_push_receiver: typing.Optional[typing.List["MonitorActionGroupAzureAppPushReceiver"]] = None,
        azure_function_receiver: typing.Optional[typing.List["MonitorActionGroupAzureFunctionReceiver"]] = None,
        email_receiver: typing.Optional[typing.List["MonitorActionGroupEmailReceiver"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        itsm_receiver: typing.Optional[typing.List["MonitorActionGroupItsmReceiver"]] = None,
        logic_app_receiver: typing.Optional[typing.List["MonitorActionGroupLogicAppReceiver"]] = None,
        sms_receiver: typing.Optional[typing.List["MonitorActionGroupSmsReceiver"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActionGroupTimeouts"] = None,
        voice_receiver: typing.Optional[typing.List["MonitorActionGroupVoiceReceiver"]] = None,
        webhook_receiver: typing.Optional[typing.List["MonitorActionGroupWebhookReceiver"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param short_name: -
        :param arm_role_receiver: arm_role_receiver block.
        :param automation_runbook_receiver: automation_runbook_receiver block.
        :param azure_app_push_receiver: azure_app_push_receiver block.
        :param azure_function_receiver: azure_function_receiver block.
        :param email_receiver: email_receiver block.
        :param enabled: -
        :param itsm_receiver: itsm_receiver block.
        :param logic_app_receiver: logic_app_receiver block.
        :param sms_receiver: sms_receiver block.
        :param tags: -
        :param timeouts: timeouts block.
        :param voice_receiver: voice_receiver block.
        :param webhook_receiver: webhook_receiver block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorActionGroupConfig(
            name=name,
            resource_group_name=resource_group_name,
            short_name=short_name,
            arm_role_receiver=arm_role_receiver,
            automation_runbook_receiver=automation_runbook_receiver,
            azure_app_push_receiver=azure_app_push_receiver,
            azure_function_receiver=azure_function_receiver,
            email_receiver=email_receiver,
            enabled=enabled,
            itsm_receiver=itsm_receiver,
            logic_app_receiver=logic_app_receiver,
            sms_receiver=sms_receiver,
            tags=tags,
            timeouts=timeouts,
            voice_receiver=voice_receiver,
            webhook_receiver=webhook_receiver,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorActionGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetArmRoleReceiver")
    def reset_arm_role_receiver(self) -> None:
        return jsii.invoke(self, "resetArmRoleReceiver", [])

    @jsii.member(jsii_name="resetAutomationRunbookReceiver")
    def reset_automation_runbook_receiver(self) -> None:
        return jsii.invoke(self, "resetAutomationRunbookReceiver", [])

    @jsii.member(jsii_name="resetAzureAppPushReceiver")
    def reset_azure_app_push_receiver(self) -> None:
        return jsii.invoke(self, "resetAzureAppPushReceiver", [])

    @jsii.member(jsii_name="resetAzureFunctionReceiver")
    def reset_azure_function_receiver(self) -> None:
        return jsii.invoke(self, "resetAzureFunctionReceiver", [])

    @jsii.member(jsii_name="resetEmailReceiver")
    def reset_email_receiver(self) -> None:
        return jsii.invoke(self, "resetEmailReceiver", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetItsmReceiver")
    def reset_itsm_receiver(self) -> None:
        return jsii.invoke(self, "resetItsmReceiver", [])

    @jsii.member(jsii_name="resetLogicAppReceiver")
    def reset_logic_app_receiver(self) -> None:
        return jsii.invoke(self, "resetLogicAppReceiver", [])

    @jsii.member(jsii_name="resetSmsReceiver")
    def reset_sms_receiver(self) -> None:
        return jsii.invoke(self, "resetSmsReceiver", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVoiceReceiver")
    def reset_voice_receiver(self) -> None:
        return jsii.invoke(self, "resetVoiceReceiver", [])

    @jsii.member(jsii_name="resetWebhookReceiver")
    def reset_webhook_receiver(self) -> None:
        return jsii.invoke(self, "resetWebhookReceiver", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shortNameInput")
    def short_name_input(self) -> builtins.str:
        return jsii.get(self, "shortNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="armRoleReceiverInput")
    def arm_role_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupArmRoleReceiver"]]:
        return jsii.get(self, "armRoleReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationRunbookReceiverInput")
    def automation_runbook_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupAutomationRunbookReceiver"]]:
        return jsii.get(self, "automationRunbookReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureAppPushReceiverInput")
    def azure_app_push_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupAzureAppPushReceiver"]]:
        return jsii.get(self, "azureAppPushReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFunctionReceiverInput")
    def azure_function_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupAzureFunctionReceiver"]]:
        return jsii.get(self, "azureFunctionReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailReceiverInput")
    def email_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupEmailReceiver"]]:
        return jsii.get(self, "emailReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="itsmReceiverInput")
    def itsm_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupItsmReceiver"]]:
        return jsii.get(self, "itsmReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppReceiverInput")
    def logic_app_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupLogicAppReceiver"]]:
        return jsii.get(self, "logicAppReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="smsReceiverInput")
    def sms_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupSmsReceiver"]]:
        return jsii.get(self, "smsReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorActionGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="voiceReceiverInput")
    def voice_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupVoiceReceiver"]]:
        return jsii.get(self, "voiceReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="webhookReceiverInput")
    def webhook_receiver_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupWebhookReceiver"]]:
        return jsii.get(self, "webhookReceiverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="armRoleReceiver")
    def arm_role_receiver(self) -> typing.List["MonitorActionGroupArmRoleReceiver"]:
        return jsii.get(self, "armRoleReceiver")

    @arm_role_receiver.setter # type: ignore
    def arm_role_receiver(
        self,
        value: typing.List["MonitorActionGroupArmRoleReceiver"],
    ) -> None:
        jsii.set(self, "armRoleReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automationRunbookReceiver")
    def automation_runbook_receiver(
        self,
    ) -> typing.List["MonitorActionGroupAutomationRunbookReceiver"]:
        return jsii.get(self, "automationRunbookReceiver")

    @automation_runbook_receiver.setter # type: ignore
    def automation_runbook_receiver(
        self,
        value: typing.List["MonitorActionGroupAutomationRunbookReceiver"],
    ) -> None:
        jsii.set(self, "automationRunbookReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureAppPushReceiver")
    def azure_app_push_receiver(
        self,
    ) -> typing.List["MonitorActionGroupAzureAppPushReceiver"]:
        return jsii.get(self, "azureAppPushReceiver")

    @azure_app_push_receiver.setter # type: ignore
    def azure_app_push_receiver(
        self,
        value: typing.List["MonitorActionGroupAzureAppPushReceiver"],
    ) -> None:
        jsii.set(self, "azureAppPushReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureFunctionReceiver")
    def azure_function_receiver(
        self,
    ) -> typing.List["MonitorActionGroupAzureFunctionReceiver"]:
        return jsii.get(self, "azureFunctionReceiver")

    @azure_function_receiver.setter # type: ignore
    def azure_function_receiver(
        self,
        value: typing.List["MonitorActionGroupAzureFunctionReceiver"],
    ) -> None:
        jsii.set(self, "azureFunctionReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailReceiver")
    def email_receiver(self) -> typing.List["MonitorActionGroupEmailReceiver"]:
        return jsii.get(self, "emailReceiver")

    @email_receiver.setter # type: ignore
    def email_receiver(
        self,
        value: typing.List["MonitorActionGroupEmailReceiver"],
    ) -> None:
        jsii.set(self, "emailReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="itsmReceiver")
    def itsm_receiver(self) -> typing.List["MonitorActionGroupItsmReceiver"]:
        return jsii.get(self, "itsmReceiver")

    @itsm_receiver.setter # type: ignore
    def itsm_receiver(
        self,
        value: typing.List["MonitorActionGroupItsmReceiver"],
    ) -> None:
        jsii.set(self, "itsmReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logicAppReceiver")
    def logic_app_receiver(self) -> typing.List["MonitorActionGroupLogicAppReceiver"]:
        return jsii.get(self, "logicAppReceiver")

    @logic_app_receiver.setter # type: ignore
    def logic_app_receiver(
        self,
        value: typing.List["MonitorActionGroupLogicAppReceiver"],
    ) -> None:
        jsii.set(self, "logicAppReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shortName")
    def short_name(self) -> builtins.str:
        return jsii.get(self, "shortName")

    @short_name.setter # type: ignore
    def short_name(self, value: builtins.str) -> None:
        jsii.set(self, "shortName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="smsReceiver")
    def sms_receiver(self) -> typing.List["MonitorActionGroupSmsReceiver"]:
        return jsii.get(self, "smsReceiver")

    @sms_receiver.setter # type: ignore
    def sms_receiver(self, value: typing.List["MonitorActionGroupSmsReceiver"]) -> None:
        jsii.set(self, "smsReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorActionGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorActionGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="voiceReceiver")
    def voice_receiver(self) -> typing.List["MonitorActionGroupVoiceReceiver"]:
        return jsii.get(self, "voiceReceiver")

    @voice_receiver.setter # type: ignore
    def voice_receiver(
        self,
        value: typing.List["MonitorActionGroupVoiceReceiver"],
    ) -> None:
        jsii.set(self, "voiceReceiver", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="webhookReceiver")
    def webhook_receiver(self) -> typing.List["MonitorActionGroupWebhookReceiver"]:
        return jsii.get(self, "webhookReceiver")

    @webhook_receiver.setter # type: ignore
    def webhook_receiver(
        self,
        value: typing.List["MonitorActionGroupWebhookReceiver"],
    ) -> None:
        jsii.set(self, "webhookReceiver", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupArmRoleReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "role_id": "roleId",
        "use_common_alert_schema": "useCommonAlertSchema",
    },
)
class MonitorActionGroupArmRoleReceiver:
    def __init__(
        self,
        *,
        name: builtins.str,
        role_id: builtins.str,
        use_common_alert_schema: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param name: -
        :param role_id: -
        :param use_common_alert_schema: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "role_id": role_id,
        }
        if use_common_alert_schema is not None:
            self._values["use_common_alert_schema"] = use_common_alert_schema

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def role_id(self) -> builtins.str:
        result = self._values.get("role_id")
        assert result is not None, "Required property 'role_id' is missing"
        return result

    @builtins.property
    def use_common_alert_schema(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_common_alert_schema")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupArmRoleReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupAutomationRunbookReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "automation_account_id": "automationAccountId",
        "is_global_runbook": "isGlobalRunbook",
        "name": "name",
        "runbook_name": "runbookName",
        "service_uri": "serviceUri",
        "webhook_resource_id": "webhookResourceId",
        "use_common_alert_schema": "useCommonAlertSchema",
    },
)
class MonitorActionGroupAutomationRunbookReceiver:
    def __init__(
        self,
        *,
        automation_account_id: builtins.str,
        is_global_runbook: builtins.bool,
        name: builtins.str,
        runbook_name: builtins.str,
        service_uri: builtins.str,
        webhook_resource_id: builtins.str,
        use_common_alert_schema: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param automation_account_id: -
        :param is_global_runbook: -
        :param name: -
        :param runbook_name: -
        :param service_uri: -
        :param webhook_resource_id: -
        :param use_common_alert_schema: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "automation_account_id": automation_account_id,
            "is_global_runbook": is_global_runbook,
            "name": name,
            "runbook_name": runbook_name,
            "service_uri": service_uri,
            "webhook_resource_id": webhook_resource_id,
        }
        if use_common_alert_schema is not None:
            self._values["use_common_alert_schema"] = use_common_alert_schema

    @builtins.property
    def automation_account_id(self) -> builtins.str:
        result = self._values.get("automation_account_id")
        assert result is not None, "Required property 'automation_account_id' is missing"
        return result

    @builtins.property
    def is_global_runbook(self) -> builtins.bool:
        result = self._values.get("is_global_runbook")
        assert result is not None, "Required property 'is_global_runbook' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def runbook_name(self) -> builtins.str:
        result = self._values.get("runbook_name")
        assert result is not None, "Required property 'runbook_name' is missing"
        return result

    @builtins.property
    def service_uri(self) -> builtins.str:
        result = self._values.get("service_uri")
        assert result is not None, "Required property 'service_uri' is missing"
        return result

    @builtins.property
    def webhook_resource_id(self) -> builtins.str:
        result = self._values.get("webhook_resource_id")
        assert result is not None, "Required property 'webhook_resource_id' is missing"
        return result

    @builtins.property
    def use_common_alert_schema(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_common_alert_schema")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupAutomationRunbookReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupAzureAppPushReceiver",
    jsii_struct_bases=[],
    name_mapping={"email_address": "emailAddress", "name": "name"},
)
class MonitorActionGroupAzureAppPushReceiver:
    def __init__(self, *, email_address: builtins.str, name: builtins.str) -> None:
        """
        :param email_address: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "email_address": email_address,
            "name": name,
        }

    @builtins.property
    def email_address(self) -> builtins.str:
        result = self._values.get("email_address")
        assert result is not None, "Required property 'email_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupAzureAppPushReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupAzureFunctionReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "function_app_resource_id": "functionAppResourceId",
        "function_name": "functionName",
        "http_trigger_url": "httpTriggerUrl",
        "name": "name",
        "use_common_alert_schema": "useCommonAlertSchema",
    },
)
class MonitorActionGroupAzureFunctionReceiver:
    def __init__(
        self,
        *,
        function_app_resource_id: builtins.str,
        function_name: builtins.str,
        http_trigger_url: builtins.str,
        name: builtins.str,
        use_common_alert_schema: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param function_app_resource_id: -
        :param function_name: -
        :param http_trigger_url: -
        :param name: -
        :param use_common_alert_schema: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "function_app_resource_id": function_app_resource_id,
            "function_name": function_name,
            "http_trigger_url": http_trigger_url,
            "name": name,
        }
        if use_common_alert_schema is not None:
            self._values["use_common_alert_schema"] = use_common_alert_schema

    @builtins.property
    def function_app_resource_id(self) -> builtins.str:
        result = self._values.get("function_app_resource_id")
        assert result is not None, "Required property 'function_app_resource_id' is missing"
        return result

    @builtins.property
    def function_name(self) -> builtins.str:
        result = self._values.get("function_name")
        assert result is not None, "Required property 'function_name' is missing"
        return result

    @builtins.property
    def http_trigger_url(self) -> builtins.str:
        result = self._values.get("http_trigger_url")
        assert result is not None, "Required property 'http_trigger_url' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def use_common_alert_schema(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_common_alert_schema")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupAzureFunctionReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "short_name": "shortName",
        "arm_role_receiver": "armRoleReceiver",
        "automation_runbook_receiver": "automationRunbookReceiver",
        "azure_app_push_receiver": "azureAppPushReceiver",
        "azure_function_receiver": "azureFunctionReceiver",
        "email_receiver": "emailReceiver",
        "enabled": "enabled",
        "itsm_receiver": "itsmReceiver",
        "logic_app_receiver": "logicAppReceiver",
        "sms_receiver": "smsReceiver",
        "tags": "tags",
        "timeouts": "timeouts",
        "voice_receiver": "voiceReceiver",
        "webhook_receiver": "webhookReceiver",
    },
)
class MonitorActionGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        short_name: builtins.str,
        arm_role_receiver: typing.Optional[typing.List[MonitorActionGroupArmRoleReceiver]] = None,
        automation_runbook_receiver: typing.Optional[typing.List[MonitorActionGroupAutomationRunbookReceiver]] = None,
        azure_app_push_receiver: typing.Optional[typing.List[MonitorActionGroupAzureAppPushReceiver]] = None,
        azure_function_receiver: typing.Optional[typing.List[MonitorActionGroupAzureFunctionReceiver]] = None,
        email_receiver: typing.Optional[typing.List["MonitorActionGroupEmailReceiver"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        itsm_receiver: typing.Optional[typing.List["MonitorActionGroupItsmReceiver"]] = None,
        logic_app_receiver: typing.Optional[typing.List["MonitorActionGroupLogicAppReceiver"]] = None,
        sms_receiver: typing.Optional[typing.List["MonitorActionGroupSmsReceiver"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActionGroupTimeouts"] = None,
        voice_receiver: typing.Optional[typing.List["MonitorActionGroupVoiceReceiver"]] = None,
        webhook_receiver: typing.Optional[typing.List["MonitorActionGroupWebhookReceiver"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param short_name: -
        :param arm_role_receiver: arm_role_receiver block.
        :param automation_runbook_receiver: automation_runbook_receiver block.
        :param azure_app_push_receiver: azure_app_push_receiver block.
        :param azure_function_receiver: azure_function_receiver block.
        :param email_receiver: email_receiver block.
        :param enabled: -
        :param itsm_receiver: itsm_receiver block.
        :param logic_app_receiver: logic_app_receiver block.
        :param sms_receiver: sms_receiver block.
        :param tags: -
        :param timeouts: timeouts block.
        :param voice_receiver: voice_receiver block.
        :param webhook_receiver: webhook_receiver block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorActionGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "short_name": short_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if arm_role_receiver is not None:
            self._values["arm_role_receiver"] = arm_role_receiver
        if automation_runbook_receiver is not None:
            self._values["automation_runbook_receiver"] = automation_runbook_receiver
        if azure_app_push_receiver is not None:
            self._values["azure_app_push_receiver"] = azure_app_push_receiver
        if azure_function_receiver is not None:
            self._values["azure_function_receiver"] = azure_function_receiver
        if email_receiver is not None:
            self._values["email_receiver"] = email_receiver
        if enabled is not None:
            self._values["enabled"] = enabled
        if itsm_receiver is not None:
            self._values["itsm_receiver"] = itsm_receiver
        if logic_app_receiver is not None:
            self._values["logic_app_receiver"] = logic_app_receiver
        if sms_receiver is not None:
            self._values["sms_receiver"] = sms_receiver
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if voice_receiver is not None:
            self._values["voice_receiver"] = voice_receiver
        if webhook_receiver is not None:
            self._values["webhook_receiver"] = webhook_receiver

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def short_name(self) -> builtins.str:
        result = self._values.get("short_name")
        assert result is not None, "Required property 'short_name' is missing"
        return result

    @builtins.property
    def arm_role_receiver(
        self,
    ) -> typing.Optional[typing.List[MonitorActionGroupArmRoleReceiver]]:
        """arm_role_receiver block."""
        result = self._values.get("arm_role_receiver")
        return result

    @builtins.property
    def automation_runbook_receiver(
        self,
    ) -> typing.Optional[typing.List[MonitorActionGroupAutomationRunbookReceiver]]:
        """automation_runbook_receiver block."""
        result = self._values.get("automation_runbook_receiver")
        return result

    @builtins.property
    def azure_app_push_receiver(
        self,
    ) -> typing.Optional[typing.List[MonitorActionGroupAzureAppPushReceiver]]:
        """azure_app_push_receiver block."""
        result = self._values.get("azure_app_push_receiver")
        return result

    @builtins.property
    def azure_function_receiver(
        self,
    ) -> typing.Optional[typing.List[MonitorActionGroupAzureFunctionReceiver]]:
        """azure_function_receiver block."""
        result = self._values.get("azure_function_receiver")
        return result

    @builtins.property
    def email_receiver(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupEmailReceiver"]]:
        """email_receiver block."""
        result = self._values.get("email_receiver")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def itsm_receiver(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupItsmReceiver"]]:
        """itsm_receiver block."""
        result = self._values.get("itsm_receiver")
        return result

    @builtins.property
    def logic_app_receiver(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupLogicAppReceiver"]]:
        """logic_app_receiver block."""
        result = self._values.get("logic_app_receiver")
        return result

    @builtins.property
    def sms_receiver(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupSmsReceiver"]]:
        """sms_receiver block."""
        result = self._values.get("sms_receiver")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorActionGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def voice_receiver(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupVoiceReceiver"]]:
        """voice_receiver block."""
        result = self._values.get("voice_receiver")
        return result

    @builtins.property
    def webhook_receiver(
        self,
    ) -> typing.Optional[typing.List["MonitorActionGroupWebhookReceiver"]]:
        """webhook_receiver block."""
        result = self._values.get("webhook_receiver")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupEmailReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "email_address": "emailAddress",
        "name": "name",
        "use_common_alert_schema": "useCommonAlertSchema",
    },
)
class MonitorActionGroupEmailReceiver:
    def __init__(
        self,
        *,
        email_address: builtins.str,
        name: builtins.str,
        use_common_alert_schema: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param email_address: -
        :param name: -
        :param use_common_alert_schema: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "email_address": email_address,
            "name": name,
        }
        if use_common_alert_schema is not None:
            self._values["use_common_alert_schema"] = use_common_alert_schema

    @builtins.property
    def email_address(self) -> builtins.str:
        result = self._values.get("email_address")
        assert result is not None, "Required property 'email_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def use_common_alert_schema(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_common_alert_schema")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupEmailReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupItsmReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "connection_id": "connectionId",
        "name": "name",
        "region": "region",
        "ticket_configuration": "ticketConfiguration",
        "workspace_id": "workspaceId",
    },
)
class MonitorActionGroupItsmReceiver:
    def __init__(
        self,
        *,
        connection_id: builtins.str,
        name: builtins.str,
        region: builtins.str,
        ticket_configuration: builtins.str,
        workspace_id: builtins.str,
    ) -> None:
        """
        :param connection_id: -
        :param name: -
        :param region: -
        :param ticket_configuration: -
        :param workspace_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "connection_id": connection_id,
            "name": name,
            "region": region,
            "ticket_configuration": ticket_configuration,
            "workspace_id": workspace_id,
        }

    @builtins.property
    def connection_id(self) -> builtins.str:
        result = self._values.get("connection_id")
        assert result is not None, "Required property 'connection_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def region(self) -> builtins.str:
        result = self._values.get("region")
        assert result is not None, "Required property 'region' is missing"
        return result

    @builtins.property
    def ticket_configuration(self) -> builtins.str:
        result = self._values.get("ticket_configuration")
        assert result is not None, "Required property 'ticket_configuration' is missing"
        return result

    @builtins.property
    def workspace_id(self) -> builtins.str:
        result = self._values.get("workspace_id")
        assert result is not None, "Required property 'workspace_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupItsmReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupLogicAppReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "callback_url": "callbackUrl",
        "name": "name",
        "resource_id": "resourceId",
        "use_common_alert_schema": "useCommonAlertSchema",
    },
)
class MonitorActionGroupLogicAppReceiver:
    def __init__(
        self,
        *,
        callback_url: builtins.str,
        name: builtins.str,
        resource_id: builtins.str,
        use_common_alert_schema: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param callback_url: -
        :param name: -
        :param resource_id: -
        :param use_common_alert_schema: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "callback_url": callback_url,
            "name": name,
            "resource_id": resource_id,
        }
        if use_common_alert_schema is not None:
            self._values["use_common_alert_schema"] = use_common_alert_schema

    @builtins.property
    def callback_url(self) -> builtins.str:
        result = self._values.get("callback_url")
        assert result is not None, "Required property 'callback_url' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_id(self) -> builtins.str:
        result = self._values.get("resource_id")
        assert result is not None, "Required property 'resource_id' is missing"
        return result

    @builtins.property
    def use_common_alert_schema(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_common_alert_schema")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupLogicAppReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupSmsReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "country_code": "countryCode",
        "name": "name",
        "phone_number": "phoneNumber",
    },
)
class MonitorActionGroupSmsReceiver:
    def __init__(
        self,
        *,
        country_code: builtins.str,
        name: builtins.str,
        phone_number: builtins.str,
    ) -> None:
        """
        :param country_code: -
        :param name: -
        :param phone_number: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "country_code": country_code,
            "name": name,
            "phone_number": phone_number,
        }

    @builtins.property
    def country_code(self) -> builtins.str:
        result = self._values.get("country_code")
        assert result is not None, "Required property 'country_code' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def phone_number(self) -> builtins.str:
        result = self._values.get("phone_number")
        assert result is not None, "Required property 'phone_number' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupSmsReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorActionGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupVoiceReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "country_code": "countryCode",
        "name": "name",
        "phone_number": "phoneNumber",
    },
)
class MonitorActionGroupVoiceReceiver:
    def __init__(
        self,
        *,
        country_code: builtins.str,
        name: builtins.str,
        phone_number: builtins.str,
    ) -> None:
        """
        :param country_code: -
        :param name: -
        :param phone_number: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "country_code": country_code,
            "name": name,
            "phone_number": phone_number,
        }

    @builtins.property
    def country_code(self) -> builtins.str:
        result = self._values.get("country_code")
        assert result is not None, "Required property 'country_code' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def phone_number(self) -> builtins.str:
        result = self._values.get("phone_number")
        assert result is not None, "Required property 'phone_number' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupVoiceReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionGroupWebhookReceiver",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "service_uri": "serviceUri",
        "use_common_alert_schema": "useCommonAlertSchema",
    },
)
class MonitorActionGroupWebhookReceiver:
    def __init__(
        self,
        *,
        name: builtins.str,
        service_uri: builtins.str,
        use_common_alert_schema: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param name: -
        :param service_uri: -
        :param use_common_alert_schema: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "service_uri": service_uri,
        }
        if use_common_alert_schema is not None:
            self._values["use_common_alert_schema"] = use_common_alert_schema

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def service_uri(self) -> builtins.str:
        result = self._values.get("service_uri")
        assert result is not None, "Required property 'service_uri' is missing"
        return result

    @builtins.property
    def use_common_alert_schema(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_common_alert_schema")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionGroupWebhookReceiver(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorActionRuleActionGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorActionRuleActionGroup",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        action_group_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        condition: typing.Optional[typing.List["MonitorActionRuleActionGroupCondition"]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        scope: typing.Optional[typing.List["MonitorActionRuleActionGroupScope"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActionRuleActionGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param action_group_id: -
        :param name: -
        :param resource_group_name: -
        :param condition: condition block.
        :param description: -
        :param enabled: -
        :param scope: scope block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorActionRuleActionGroupConfig(
            action_group_id=action_group_id,
            name=name,
            resource_group_name=resource_group_name,
            condition=condition,
            description=description,
            enabled=enabled,
            scope=scope,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorActionRuleActionGroup, self, [scope_, id, config])

    @jsii.member(jsii_name="resetCondition")
    def reset_condition(self) -> None:
        return jsii.invoke(self, "resetCondition", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetScope")
    def reset_scope(self) -> None:
        return jsii.invoke(self, "resetScope", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionGroupIdInput")
    def action_group_id_input(self) -> builtins.str:
        return jsii.get(self, "actionGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="conditionInput")
    def condition_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupCondition"]]:
        return jsii.get(self, "conditionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupScope"]]:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorActionRuleActionGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionGroupId")
    def action_group_id(self) -> builtins.str:
        return jsii.get(self, "actionGroupId")

    @action_group_id.setter # type: ignore
    def action_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "actionGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.List["MonitorActionRuleActionGroupCondition"]:
        return jsii.get(self, "condition")

    @condition.setter # type: ignore
    def condition(
        self,
        value: typing.List["MonitorActionRuleActionGroupCondition"],
    ) -> None:
        jsii.set(self, "condition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> typing.List["MonitorActionRuleActionGroupScope"]:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: typing.List["MonitorActionRuleActionGroupScope"]) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorActionRuleActionGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorActionRuleActionGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupCondition",
    jsii_struct_bases=[],
    name_mapping={
        "alert_context": "alertContext",
        "alert_rule_id": "alertRuleId",
        "description": "description",
        "monitor": "monitor",
        "monitor_service": "monitorService",
        "severity": "severity",
        "target_resource_type": "targetResourceType",
    },
)
class MonitorActionRuleActionGroupCondition:
    def __init__(
        self,
        *,
        alert_context: typing.Optional[typing.List["MonitorActionRuleActionGroupConditionAlertContext"]] = None,
        alert_rule_id: typing.Optional[typing.List["MonitorActionRuleActionGroupConditionAlertRuleId"]] = None,
        description: typing.Optional[typing.List["MonitorActionRuleActionGroupConditionDescription"]] = None,
        monitor: typing.Optional[typing.List["MonitorActionRuleActionGroupConditionMonitor"]] = None,
        monitor_service: typing.Optional[typing.List["MonitorActionRuleActionGroupConditionMonitorService"]] = None,
        severity: typing.Optional[typing.List["MonitorActionRuleActionGroupConditionSeverity"]] = None,
        target_resource_type: typing.Optional[typing.List["MonitorActionRuleActionGroupConditionTargetResourceType"]] = None,
    ) -> None:
        """
        :param alert_context: alert_context block.
        :param alert_rule_id: alert_rule_id block.
        :param description: description block.
        :param monitor: monitor block.
        :param monitor_service: monitor_service block.
        :param severity: severity block.
        :param target_resource_type: target_resource_type block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if alert_context is not None:
            self._values["alert_context"] = alert_context
        if alert_rule_id is not None:
            self._values["alert_rule_id"] = alert_rule_id
        if description is not None:
            self._values["description"] = description
        if monitor is not None:
            self._values["monitor"] = monitor
        if monitor_service is not None:
            self._values["monitor_service"] = monitor_service
        if severity is not None:
            self._values["severity"] = severity
        if target_resource_type is not None:
            self._values["target_resource_type"] = target_resource_type

    @builtins.property
    def alert_context(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupConditionAlertContext"]]:
        """alert_context block."""
        result = self._values.get("alert_context")
        return result

    @builtins.property
    def alert_rule_id(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupConditionAlertRuleId"]]:
        """alert_rule_id block."""
        result = self._values.get("alert_rule_id")
        return result

    @builtins.property
    def description(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupConditionDescription"]]:
        """description block."""
        result = self._values.get("description")
        return result

    @builtins.property
    def monitor(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupConditionMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def monitor_service(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupConditionMonitorService"]]:
        """monitor_service block."""
        result = self._values.get("monitor_service")
        return result

    @builtins.property
    def severity(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupConditionSeverity"]]:
        """severity block."""
        result = self._values.get("severity")
        return result

    @builtins.property
    def target_resource_type(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupConditionTargetResourceType"]]:
        """target_resource_type block."""
        result = self._values.get("target_resource_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConditionAlertContext",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleActionGroupConditionAlertContext:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConditionAlertContext(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConditionAlertRuleId",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleActionGroupConditionAlertRuleId:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConditionAlertRuleId(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConditionDescription",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleActionGroupConditionDescription:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConditionDescription(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConditionMonitor",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleActionGroupConditionMonitor:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConditionMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConditionMonitorService",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleActionGroupConditionMonitorService:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConditionMonitorService(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConditionSeverity",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleActionGroupConditionSeverity:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConditionSeverity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConditionTargetResourceType",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleActionGroupConditionTargetResourceType:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConditionTargetResourceType(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "action_group_id": "actionGroupId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "condition": "condition",
        "description": "description",
        "enabled": "enabled",
        "scope": "scope",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MonitorActionRuleActionGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        action_group_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        condition: typing.Optional[typing.List[MonitorActionRuleActionGroupCondition]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        scope: typing.Optional[typing.List["MonitorActionRuleActionGroupScope"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActionRuleActionGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action_group_id: -
        :param name: -
        :param resource_group_name: -
        :param condition: condition block.
        :param description: -
        :param enabled: -
        :param scope: scope block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorActionRuleActionGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "action_group_id": action_group_id,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if condition is not None:
            self._values["condition"] = condition
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if scope is not None:
            self._values["scope"] = scope
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def action_group_id(self) -> builtins.str:
        result = self._values.get("action_group_id")
        assert result is not None, "Required property 'action_group_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def condition(
        self,
    ) -> typing.Optional[typing.List[MonitorActionRuleActionGroupCondition]]:
        """condition block."""
        result = self._values.get("condition")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def scope(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleActionGroupScope"]]:
        """scope block."""
        result = self._values.get("scope")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorActionRuleActionGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupScope",
    jsii_struct_bases=[],
    name_mapping={"resource_ids": "resourceIds", "type": "type"},
)
class MonitorActionRuleActionGroupScope:
    def __init__(
        self,
        *,
        resource_ids: typing.List[builtins.str],
        type: builtins.str,
    ) -> None:
        """
        :param resource_ids: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "resource_ids": resource_ids,
            "type": type,
        }

    @builtins.property
    def resource_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("resource_ids")
        assert result is not None, "Required property 'resource_ids' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupScope(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleActionGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorActionRuleActionGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleActionGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorActionRuleSuppression(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorActionRuleSuppression",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        suppression: typing.List["MonitorActionRuleSuppressionSuppression"],
        condition: typing.Optional[typing.List["MonitorActionRuleSuppressionCondition"]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        scope: typing.Optional[typing.List["MonitorActionRuleSuppressionScope"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActionRuleSuppressionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param suppression: suppression block.
        :param condition: condition block.
        :param description: -
        :param enabled: -
        :param scope: scope block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorActionRuleSuppressionConfig(
            name=name,
            resource_group_name=resource_group_name,
            suppression=suppression,
            condition=condition,
            description=description,
            enabled=enabled,
            scope=scope,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorActionRuleSuppression, self, [scope_, id, config])

    @jsii.member(jsii_name="resetCondition")
    def reset_condition(self) -> None:
        return jsii.invoke(self, "resetCondition", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetScope")
    def reset_scope(self) -> None:
        return jsii.invoke(self, "resetScope", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="suppressionInput")
    def suppression_input(
        self,
    ) -> typing.List["MonitorActionRuleSuppressionSuppression"]:
        return jsii.get(self, "suppressionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="conditionInput")
    def condition_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionCondition"]]:
        return jsii.get(self, "conditionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionScope"]]:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorActionRuleSuppressionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.List["MonitorActionRuleSuppressionCondition"]:
        return jsii.get(self, "condition")

    @condition.setter # type: ignore
    def condition(
        self,
        value: typing.List["MonitorActionRuleSuppressionCondition"],
    ) -> None:
        jsii.set(self, "condition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> typing.List["MonitorActionRuleSuppressionScope"]:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: typing.List["MonitorActionRuleSuppressionScope"]) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="suppression")
    def suppression(self) -> typing.List["MonitorActionRuleSuppressionSuppression"]:
        return jsii.get(self, "suppression")

    @suppression.setter # type: ignore
    def suppression(
        self,
        value: typing.List["MonitorActionRuleSuppressionSuppression"],
    ) -> None:
        jsii.set(self, "suppression", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorActionRuleSuppressionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorActionRuleSuppressionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionCondition",
    jsii_struct_bases=[],
    name_mapping={
        "alert_context": "alertContext",
        "alert_rule_id": "alertRuleId",
        "description": "description",
        "monitor": "monitor",
        "monitor_service": "monitorService",
        "severity": "severity",
        "target_resource_type": "targetResourceType",
    },
)
class MonitorActionRuleSuppressionCondition:
    def __init__(
        self,
        *,
        alert_context: typing.Optional[typing.List["MonitorActionRuleSuppressionConditionAlertContext"]] = None,
        alert_rule_id: typing.Optional[typing.List["MonitorActionRuleSuppressionConditionAlertRuleId"]] = None,
        description: typing.Optional[typing.List["MonitorActionRuleSuppressionConditionDescription"]] = None,
        monitor: typing.Optional[typing.List["MonitorActionRuleSuppressionConditionMonitor"]] = None,
        monitor_service: typing.Optional[typing.List["MonitorActionRuleSuppressionConditionMonitorService"]] = None,
        severity: typing.Optional[typing.List["MonitorActionRuleSuppressionConditionSeverity"]] = None,
        target_resource_type: typing.Optional[typing.List["MonitorActionRuleSuppressionConditionTargetResourceType"]] = None,
    ) -> None:
        """
        :param alert_context: alert_context block.
        :param alert_rule_id: alert_rule_id block.
        :param description: description block.
        :param monitor: monitor block.
        :param monitor_service: monitor_service block.
        :param severity: severity block.
        :param target_resource_type: target_resource_type block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if alert_context is not None:
            self._values["alert_context"] = alert_context
        if alert_rule_id is not None:
            self._values["alert_rule_id"] = alert_rule_id
        if description is not None:
            self._values["description"] = description
        if monitor is not None:
            self._values["monitor"] = monitor
        if monitor_service is not None:
            self._values["monitor_service"] = monitor_service
        if severity is not None:
            self._values["severity"] = severity
        if target_resource_type is not None:
            self._values["target_resource_type"] = target_resource_type

    @builtins.property
    def alert_context(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionConditionAlertContext"]]:
        """alert_context block."""
        result = self._values.get("alert_context")
        return result

    @builtins.property
    def alert_rule_id(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionConditionAlertRuleId"]]:
        """alert_rule_id block."""
        result = self._values.get("alert_rule_id")
        return result

    @builtins.property
    def description(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionConditionDescription"]]:
        """description block."""
        result = self._values.get("description")
        return result

    @builtins.property
    def monitor(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionConditionMonitor"]]:
        """monitor block."""
        result = self._values.get("monitor")
        return result

    @builtins.property
    def monitor_service(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionConditionMonitorService"]]:
        """monitor_service block."""
        result = self._values.get("monitor_service")
        return result

    @builtins.property
    def severity(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionConditionSeverity"]]:
        """severity block."""
        result = self._values.get("severity")
        return result

    @builtins.property
    def target_resource_type(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionConditionTargetResourceType"]]:
        """target_resource_type block."""
        result = self._values.get("target_resource_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionCondition(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConditionAlertContext",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleSuppressionConditionAlertContext:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConditionAlertContext(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConditionAlertRuleId",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleSuppressionConditionAlertRuleId:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConditionAlertRuleId(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConditionDescription",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleSuppressionConditionDescription:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConditionDescription(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConditionMonitor",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleSuppressionConditionMonitor:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConditionMonitor(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConditionMonitorService",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleSuppressionConditionMonitorService:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConditionMonitorService(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConditionSeverity",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleSuppressionConditionSeverity:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConditionSeverity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConditionTargetResourceType",
    jsii_struct_bases=[],
    name_mapping={"operator": "operator", "values": "values"},
)
class MonitorActionRuleSuppressionConditionTargetResourceType:
    def __init__(
        self,
        *,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConditionTargetResourceType(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "suppression": "suppression",
        "condition": "condition",
        "description": "description",
        "enabled": "enabled",
        "scope": "scope",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MonitorActionRuleSuppressionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        suppression: typing.List["MonitorActionRuleSuppressionSuppression"],
        condition: typing.Optional[typing.List[MonitorActionRuleSuppressionCondition]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        scope: typing.Optional[typing.List["MonitorActionRuleSuppressionScope"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActionRuleSuppressionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param suppression: suppression block.
        :param condition: condition block.
        :param description: -
        :param enabled: -
        :param scope: scope block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorActionRuleSuppressionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "suppression": suppression,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if condition is not None:
            self._values["condition"] = condition
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if scope is not None:
            self._values["scope"] = scope
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def suppression(self) -> typing.List["MonitorActionRuleSuppressionSuppression"]:
        """suppression block."""
        result = self._values.get("suppression")
        assert result is not None, "Required property 'suppression' is missing"
        return result

    @builtins.property
    def condition(
        self,
    ) -> typing.Optional[typing.List[MonitorActionRuleSuppressionCondition]]:
        """condition block."""
        result = self._values.get("condition")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def scope(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionScope"]]:
        """scope block."""
        result = self._values.get("scope")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorActionRuleSuppressionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionScope",
    jsii_struct_bases=[],
    name_mapping={"resource_ids": "resourceIds", "type": "type"},
)
class MonitorActionRuleSuppressionScope:
    def __init__(
        self,
        *,
        resource_ids: typing.List[builtins.str],
        type: builtins.str,
    ) -> None:
        """
        :param resource_ids: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "resource_ids": resource_ids,
            "type": type,
        }

    @builtins.property
    def resource_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("resource_ids")
        assert result is not None, "Required property 'resource_ids' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionScope(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionSuppression",
    jsii_struct_bases=[],
    name_mapping={"recurrence_type": "recurrenceType", "schedule": "schedule"},
)
class MonitorActionRuleSuppressionSuppression:
    def __init__(
        self,
        *,
        recurrence_type: builtins.str,
        schedule: typing.Optional[typing.List["MonitorActionRuleSuppressionSuppressionSchedule"]] = None,
    ) -> None:
        """
        :param recurrence_type: -
        :param schedule: schedule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "recurrence_type": recurrence_type,
        }
        if schedule is not None:
            self._values["schedule"] = schedule

    @builtins.property
    def recurrence_type(self) -> builtins.str:
        result = self._values.get("recurrence_type")
        assert result is not None, "Required property 'recurrence_type' is missing"
        return result

    @builtins.property
    def schedule(
        self,
    ) -> typing.Optional[typing.List["MonitorActionRuleSuppressionSuppressionSchedule"]]:
        """schedule block."""
        result = self._values.get("schedule")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionSuppression(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionSuppressionSchedule",
    jsii_struct_bases=[],
    name_mapping={
        "end_date_utc": "endDateUtc",
        "start_date_utc": "startDateUtc",
        "recurrence_monthly": "recurrenceMonthly",
        "recurrence_weekly": "recurrenceWeekly",
    },
)
class MonitorActionRuleSuppressionSuppressionSchedule:
    def __init__(
        self,
        *,
        end_date_utc: builtins.str,
        start_date_utc: builtins.str,
        recurrence_monthly: typing.Optional[typing.List[jsii.Number]] = None,
        recurrence_weekly: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param end_date_utc: -
        :param start_date_utc: -
        :param recurrence_monthly: -
        :param recurrence_weekly: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "end_date_utc": end_date_utc,
            "start_date_utc": start_date_utc,
        }
        if recurrence_monthly is not None:
            self._values["recurrence_monthly"] = recurrence_monthly
        if recurrence_weekly is not None:
            self._values["recurrence_weekly"] = recurrence_weekly

    @builtins.property
    def end_date_utc(self) -> builtins.str:
        result = self._values.get("end_date_utc")
        assert result is not None, "Required property 'end_date_utc' is missing"
        return result

    @builtins.property
    def start_date_utc(self) -> builtins.str:
        result = self._values.get("start_date_utc")
        assert result is not None, "Required property 'start_date_utc' is missing"
        return result

    @builtins.property
    def recurrence_monthly(self) -> typing.Optional[typing.List[jsii.Number]]:
        result = self._values.get("recurrence_monthly")
        return result

    @builtins.property
    def recurrence_weekly(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("recurrence_weekly")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionSuppressionSchedule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActionRuleSuppressionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorActionRuleSuppressionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActionRuleSuppressionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorActivityLogAlert(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorActivityLogAlert",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        criteria: typing.List["MonitorActivityLogAlertCriteria"],
        name: builtins.str,
        resource_group_name: builtins.str,
        scopes: typing.List[builtins.str],
        action: typing.Optional[typing.List["MonitorActivityLogAlertAction"]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActivityLogAlertTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param criteria: criteria block.
        :param name: -
        :param resource_group_name: -
        :param scopes: -
        :param action: action block.
        :param description: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorActivityLogAlertConfig(
            criteria=criteria,
            name=name,
            resource_group_name=resource_group_name,
            scopes=scopes,
            action=action,
            description=description,
            enabled=enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorActivityLogAlert, self, [scope, id, config])

    @jsii.member(jsii_name="resetAction")
    def reset_action(self) -> None:
        return jsii.invoke(self, "resetAction", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="criteriaInput")
    def criteria_input(self) -> typing.List["MonitorActivityLogAlertCriteria"]:
        return jsii.get(self, "criteriaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopesInput")
    def scopes_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(
        self,
    ) -> typing.Optional[typing.List["MonitorActivityLogAlertAction"]]:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorActivityLogAlertTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> typing.List["MonitorActivityLogAlertAction"]:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: typing.List["MonitorActivityLogAlertAction"]) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="criteria")
    def criteria(self) -> typing.List["MonitorActivityLogAlertCriteria"]:
        return jsii.get(self, "criteria")

    @criteria.setter # type: ignore
    def criteria(self, value: typing.List["MonitorActivityLogAlertCriteria"]) -> None:
        jsii.set(self, "criteria", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopes")
    def scopes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopes")

    @scopes.setter # type: ignore
    def scopes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "scopes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorActivityLogAlertTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorActivityLogAlertTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorActivityLogAlertAction",
    jsii_struct_bases=[],
    name_mapping={
        "action_group_id": "actionGroupId",
        "webhook_properties": "webhookProperties",
    },
)
class MonitorActivityLogAlertAction:
    def __init__(
        self,
        *,
        action_group_id: builtins.str,
        webhook_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
    ) -> None:
        """
        :param action_group_id: -
        :param webhook_properties: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action_group_id": action_group_id,
        }
        if webhook_properties is not None:
            self._values["webhook_properties"] = webhook_properties

    @builtins.property
    def action_group_id(self) -> builtins.str:
        result = self._values.get("action_group_id")
        assert result is not None, "Required property 'action_group_id' is missing"
        return result

    @builtins.property
    def webhook_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("webhook_properties")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActivityLogAlertAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActivityLogAlertConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "criteria": "criteria",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "scopes": "scopes",
        "action": "action",
        "description": "description",
        "enabled": "enabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MonitorActivityLogAlertConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        criteria: typing.List["MonitorActivityLogAlertCriteria"],
        name: builtins.str,
        resource_group_name: builtins.str,
        scopes: typing.List[builtins.str],
        action: typing.Optional[typing.List[MonitorActivityLogAlertAction]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorActivityLogAlertTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param criteria: criteria block.
        :param name: -
        :param resource_group_name: -
        :param scopes: -
        :param action: action block.
        :param description: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorActivityLogAlertTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "criteria": criteria,
            "name": name,
            "resource_group_name": resource_group_name,
            "scopes": scopes,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if action is not None:
            self._values["action"] = action
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def criteria(self) -> typing.List["MonitorActivityLogAlertCriteria"]:
        """criteria block."""
        result = self._values.get("criteria")
        assert result is not None, "Required property 'criteria' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def scopes(self) -> typing.List[builtins.str]:
        result = self._values.get("scopes")
        assert result is not None, "Required property 'scopes' is missing"
        return result

    @builtins.property
    def action(self) -> typing.Optional[typing.List[MonitorActivityLogAlertAction]]:
        """action block."""
        result = self._values.get("action")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorActivityLogAlertTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActivityLogAlertConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActivityLogAlertCriteria",
    jsii_struct_bases=[],
    name_mapping={
        "category": "category",
        "caller": "caller",
        "level": "level",
        "operation_name": "operationName",
        "recommendation_category": "recommendationCategory",
        "recommendation_impact": "recommendationImpact",
        "recommendation_type": "recommendationType",
        "resource_group": "resourceGroup",
        "resource_id": "resourceId",
        "resource_provider": "resourceProvider",
        "resource_type": "resourceType",
        "status": "status",
        "sub_status": "subStatus",
    },
)
class MonitorActivityLogAlertCriteria:
    def __init__(
        self,
        *,
        category: builtins.str,
        caller: typing.Optional[builtins.str] = None,
        level: typing.Optional[builtins.str] = None,
        operation_name: typing.Optional[builtins.str] = None,
        recommendation_category: typing.Optional[builtins.str] = None,
        recommendation_impact: typing.Optional[builtins.str] = None,
        recommendation_type: typing.Optional[builtins.str] = None,
        resource_group: typing.Optional[builtins.str] = None,
        resource_id: typing.Optional[builtins.str] = None,
        resource_provider: typing.Optional[builtins.str] = None,
        resource_type: typing.Optional[builtins.str] = None,
        status: typing.Optional[builtins.str] = None,
        sub_status: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param category: -
        :param caller: -
        :param level: -
        :param operation_name: -
        :param recommendation_category: -
        :param recommendation_impact: -
        :param recommendation_type: -
        :param resource_group: -
        :param resource_id: -
        :param resource_provider: -
        :param resource_type: -
        :param status: -
        :param sub_status: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "category": category,
        }
        if caller is not None:
            self._values["caller"] = caller
        if level is not None:
            self._values["level"] = level
        if operation_name is not None:
            self._values["operation_name"] = operation_name
        if recommendation_category is not None:
            self._values["recommendation_category"] = recommendation_category
        if recommendation_impact is not None:
            self._values["recommendation_impact"] = recommendation_impact
        if recommendation_type is not None:
            self._values["recommendation_type"] = recommendation_type
        if resource_group is not None:
            self._values["resource_group"] = resource_group
        if resource_id is not None:
            self._values["resource_id"] = resource_id
        if resource_provider is not None:
            self._values["resource_provider"] = resource_provider
        if resource_type is not None:
            self._values["resource_type"] = resource_type
        if status is not None:
            self._values["status"] = status
        if sub_status is not None:
            self._values["sub_status"] = sub_status

    @builtins.property
    def category(self) -> builtins.str:
        result = self._values.get("category")
        assert result is not None, "Required property 'category' is missing"
        return result

    @builtins.property
    def caller(self) -> typing.Optional[builtins.str]:
        result = self._values.get("caller")
        return result

    @builtins.property
    def level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("level")
        return result

    @builtins.property
    def operation_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("operation_name")
        return result

    @builtins.property
    def recommendation_category(self) -> typing.Optional[builtins.str]:
        result = self._values.get("recommendation_category")
        return result

    @builtins.property
    def recommendation_impact(self) -> typing.Optional[builtins.str]:
        result = self._values.get("recommendation_impact")
        return result

    @builtins.property
    def recommendation_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("recommendation_type")
        return result

    @builtins.property
    def resource_group(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_group")
        return result

    @builtins.property
    def resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_id")
        return result

    @builtins.property
    def resource_provider(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_provider")
        return result

    @builtins.property
    def resource_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_type")
        return result

    @builtins.property
    def status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("status")
        return result

    @builtins.property
    def sub_status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sub_status")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActivityLogAlertCriteria(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorActivityLogAlertTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorActivityLogAlertTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorActivityLogAlertTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorAutoscaleSetting(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorAutoscaleSetting",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        profile: typing.List["MonitorAutoscaleSettingProfile"],
        resource_group_name: builtins.str,
        target_resource_id: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        notification: typing.Optional[typing.List["MonitorAutoscaleSettingNotification"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorAutoscaleSettingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param profile: profile block.
        :param resource_group_name: -
        :param target_resource_id: -
        :param enabled: -
        :param notification: notification block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorAutoscaleSettingConfig(
            location=location,
            name=name,
            profile=profile,
            resource_group_name=resource_group_name,
            target_resource_id=target_resource_id,
            enabled=enabled,
            notification=notification,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorAutoscaleSetting, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetNotification")
    def reset_notification(self) -> None:
        return jsii.invoke(self, "resetNotification", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileInput")
    def profile_input(self) -> typing.List["MonitorAutoscaleSettingProfile"]:
        return jsii.get(self, "profileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationInput")
    def notification_input(
        self,
    ) -> typing.Optional[typing.List["MonitorAutoscaleSettingNotification"]]:
        return jsii.get(self, "notificationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorAutoscaleSettingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notification")
    def notification(self) -> typing.List["MonitorAutoscaleSettingNotification"]:
        return jsii.get(self, "notification")

    @notification.setter # type: ignore
    def notification(
        self,
        value: typing.List["MonitorAutoscaleSettingNotification"],
    ) -> None:
        jsii.set(self, "notification", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profile")
    def profile(self) -> typing.List["MonitorAutoscaleSettingProfile"]:
        return jsii.get(self, "profile")

    @profile.setter # type: ignore
    def profile(self, value: typing.List["MonitorAutoscaleSettingProfile"]) -> None:
        jsii.set(self, "profile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorAutoscaleSettingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorAutoscaleSettingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "profile": "profile",
        "resource_group_name": "resourceGroupName",
        "target_resource_id": "targetResourceId",
        "enabled": "enabled",
        "notification": "notification",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MonitorAutoscaleSettingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        profile: typing.List["MonitorAutoscaleSettingProfile"],
        resource_group_name: builtins.str,
        target_resource_id: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        notification: typing.Optional[typing.List["MonitorAutoscaleSettingNotification"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorAutoscaleSettingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param profile: profile block.
        :param resource_group_name: -
        :param target_resource_id: -
        :param enabled: -
        :param notification: notification block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorAutoscaleSettingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "profile": profile,
            "resource_group_name": resource_group_name,
            "target_resource_id": target_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enabled is not None:
            self._values["enabled"] = enabled
        if notification is not None:
            self._values["notification"] = notification
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def profile(self) -> typing.List["MonitorAutoscaleSettingProfile"]:
        """profile block."""
        result = self._values.get("profile")
        assert result is not None, "Required property 'profile' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def target_resource_id(self) -> builtins.str:
        result = self._values.get("target_resource_id")
        assert result is not None, "Required property 'target_resource_id' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def notification(
        self,
    ) -> typing.Optional[typing.List["MonitorAutoscaleSettingNotification"]]:
        """notification block."""
        result = self._values.get("notification")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorAutoscaleSettingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingNotification",
    jsii_struct_bases=[],
    name_mapping={"email": "email", "webhook": "webhook"},
)
class MonitorAutoscaleSettingNotification:
    def __init__(
        self,
        *,
        email: typing.Optional[typing.List["MonitorAutoscaleSettingNotificationEmail"]] = None,
        webhook: typing.Optional[typing.List["MonitorAutoscaleSettingNotificationWebhook"]] = None,
    ) -> None:
        """
        :param email: email block.
        :param webhook: webhook block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if email is not None:
            self._values["email"] = email
        if webhook is not None:
            self._values["webhook"] = webhook

    @builtins.property
    def email(
        self,
    ) -> typing.Optional[typing.List["MonitorAutoscaleSettingNotificationEmail"]]:
        """email block."""
        result = self._values.get("email")
        return result

    @builtins.property
    def webhook(
        self,
    ) -> typing.Optional[typing.List["MonitorAutoscaleSettingNotificationWebhook"]]:
        """webhook block."""
        result = self._values.get("webhook")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingNotification(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingNotificationEmail",
    jsii_struct_bases=[],
    name_mapping={
        "custom_emails": "customEmails",
        "send_to_subscription_administrator": "sendToSubscriptionAdministrator",
        "send_to_subscription_co_administrator": "sendToSubscriptionCoAdministrator",
    },
)
class MonitorAutoscaleSettingNotificationEmail:
    def __init__(
        self,
        *,
        custom_emails: typing.Optional[typing.List[builtins.str]] = None,
        send_to_subscription_administrator: typing.Optional[builtins.bool] = None,
        send_to_subscription_co_administrator: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param custom_emails: -
        :param send_to_subscription_administrator: -
        :param send_to_subscription_co_administrator: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if custom_emails is not None:
            self._values["custom_emails"] = custom_emails
        if send_to_subscription_administrator is not None:
            self._values["send_to_subscription_administrator"] = send_to_subscription_administrator
        if send_to_subscription_co_administrator is not None:
            self._values["send_to_subscription_co_administrator"] = send_to_subscription_co_administrator

    @builtins.property
    def custom_emails(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("custom_emails")
        return result

    @builtins.property
    def send_to_subscription_administrator(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send_to_subscription_administrator")
        return result

    @builtins.property
    def send_to_subscription_co_administrator(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send_to_subscription_co_administrator")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingNotificationEmail(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingNotificationWebhook",
    jsii_struct_bases=[],
    name_mapping={"service_uri": "serviceUri", "properties": "properties"},
)
class MonitorAutoscaleSettingNotificationWebhook:
    def __init__(
        self,
        *,
        service_uri: builtins.str,
        properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
    ) -> None:
        """
        :param service_uri: -
        :param properties: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "service_uri": service_uri,
        }
        if properties is not None:
            self._values["properties"] = properties

    @builtins.property
    def service_uri(self) -> builtins.str:
        result = self._values.get("service_uri")
        assert result is not None, "Required property 'service_uri' is missing"
        return result

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("properties")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingNotificationWebhook(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingProfile",
    jsii_struct_bases=[],
    name_mapping={
        "capacity": "capacity",
        "name": "name",
        "fixed_date": "fixedDate",
        "recurrence": "recurrence",
        "rule": "rule",
    },
)
class MonitorAutoscaleSettingProfile:
    def __init__(
        self,
        *,
        capacity: typing.List["MonitorAutoscaleSettingProfileCapacity"],
        name: builtins.str,
        fixed_date: typing.Optional[typing.List["MonitorAutoscaleSettingProfileFixedDate"]] = None,
        recurrence: typing.Optional[typing.List["MonitorAutoscaleSettingProfileRecurrence"]] = None,
        rule: typing.Optional[typing.List["MonitorAutoscaleSettingProfileRule"]] = None,
    ) -> None:
        """
        :param capacity: capacity block.
        :param name: -
        :param fixed_date: fixed_date block.
        :param recurrence: recurrence block.
        :param rule: rule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "capacity": capacity,
            "name": name,
        }
        if fixed_date is not None:
            self._values["fixed_date"] = fixed_date
        if recurrence is not None:
            self._values["recurrence"] = recurrence
        if rule is not None:
            self._values["rule"] = rule

    @builtins.property
    def capacity(self) -> typing.List["MonitorAutoscaleSettingProfileCapacity"]:
        """capacity block."""
        result = self._values.get("capacity")
        assert result is not None, "Required property 'capacity' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def fixed_date(
        self,
    ) -> typing.Optional[typing.List["MonitorAutoscaleSettingProfileFixedDate"]]:
        """fixed_date block."""
        result = self._values.get("fixed_date")
        return result

    @builtins.property
    def recurrence(
        self,
    ) -> typing.Optional[typing.List["MonitorAutoscaleSettingProfileRecurrence"]]:
        """recurrence block."""
        result = self._values.get("recurrence")
        return result

    @builtins.property
    def rule(
        self,
    ) -> typing.Optional[typing.List["MonitorAutoscaleSettingProfileRule"]]:
        """rule block."""
        result = self._values.get("rule")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingProfileCapacity",
    jsii_struct_bases=[],
    name_mapping={"default": "default", "maximum": "maximum", "minimum": "minimum"},
)
class MonitorAutoscaleSettingProfileCapacity:
    def __init__(
        self,
        *,
        default: jsii.Number,
        maximum: jsii.Number,
        minimum: jsii.Number,
    ) -> None:
        """
        :param default: -
        :param maximum: -
        :param minimum: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "default": default,
            "maximum": maximum,
            "minimum": minimum,
        }

    @builtins.property
    def default(self) -> jsii.Number:
        result = self._values.get("default")
        assert result is not None, "Required property 'default' is missing"
        return result

    @builtins.property
    def maximum(self) -> jsii.Number:
        result = self._values.get("maximum")
        assert result is not None, "Required property 'maximum' is missing"
        return result

    @builtins.property
    def minimum(self) -> jsii.Number:
        result = self._values.get("minimum")
        assert result is not None, "Required property 'minimum' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingProfileCapacity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingProfileFixedDate",
    jsii_struct_bases=[],
    name_mapping={"end": "end", "start": "start", "timezone": "timezone"},
)
class MonitorAutoscaleSettingProfileFixedDate:
    def __init__(
        self,
        *,
        end: builtins.str,
        start: builtins.str,
        timezone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param end: -
        :param start: -
        :param timezone: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "end": end,
            "start": start,
        }
        if timezone is not None:
            self._values["timezone"] = timezone

    @builtins.property
    def end(self) -> builtins.str:
        result = self._values.get("end")
        assert result is not None, "Required property 'end' is missing"
        return result

    @builtins.property
    def start(self) -> builtins.str:
        result = self._values.get("start")
        assert result is not None, "Required property 'start' is missing"
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingProfileFixedDate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingProfileRecurrence",
    jsii_struct_bases=[],
    name_mapping={
        "days": "days",
        "hours": "hours",
        "minutes": "minutes",
        "timezone": "timezone",
    },
)
class MonitorAutoscaleSettingProfileRecurrence:
    def __init__(
        self,
        *,
        days: typing.List[builtins.str],
        hours: typing.List[jsii.Number],
        minutes: typing.List[jsii.Number],
        timezone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param days: -
        :param hours: -
        :param minutes: -
        :param timezone: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "days": days,
            "hours": hours,
            "minutes": minutes,
        }
        if timezone is not None:
            self._values["timezone"] = timezone

    @builtins.property
    def days(self) -> typing.List[builtins.str]:
        result = self._values.get("days")
        assert result is not None, "Required property 'days' is missing"
        return result

    @builtins.property
    def hours(self) -> typing.List[jsii.Number]:
        result = self._values.get("hours")
        assert result is not None, "Required property 'hours' is missing"
        return result

    @builtins.property
    def minutes(self) -> typing.List[jsii.Number]:
        result = self._values.get("minutes")
        assert result is not None, "Required property 'minutes' is missing"
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingProfileRecurrence(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingProfileRule",
    jsii_struct_bases=[],
    name_mapping={"metric_trigger": "metricTrigger", "scale_action": "scaleAction"},
)
class MonitorAutoscaleSettingProfileRule:
    def __init__(
        self,
        *,
        metric_trigger: typing.List["MonitorAutoscaleSettingProfileRuleMetricTrigger"],
        scale_action: typing.List["MonitorAutoscaleSettingProfileRuleScaleAction"],
    ) -> None:
        """
        :param metric_trigger: metric_trigger block.
        :param scale_action: scale_action block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "metric_trigger": metric_trigger,
            "scale_action": scale_action,
        }

    @builtins.property
    def metric_trigger(
        self,
    ) -> typing.List["MonitorAutoscaleSettingProfileRuleMetricTrigger"]:
        """metric_trigger block."""
        result = self._values.get("metric_trigger")
        assert result is not None, "Required property 'metric_trigger' is missing"
        return result

    @builtins.property
    def scale_action(
        self,
    ) -> typing.List["MonitorAutoscaleSettingProfileRuleScaleAction"]:
        """scale_action block."""
        result = self._values.get("scale_action")
        assert result is not None, "Required property 'scale_action' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingProfileRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingProfileRuleMetricTrigger",
    jsii_struct_bases=[],
    name_mapping={
        "metric_name": "metricName",
        "metric_resource_id": "metricResourceId",
        "operator": "operator",
        "statistic": "statistic",
        "threshold": "threshold",
        "time_aggregation": "timeAggregation",
        "time_grain": "timeGrain",
        "time_window": "timeWindow",
    },
)
class MonitorAutoscaleSettingProfileRuleMetricTrigger:
    def __init__(
        self,
        *,
        metric_name: builtins.str,
        metric_resource_id: builtins.str,
        operator: builtins.str,
        statistic: builtins.str,
        threshold: jsii.Number,
        time_aggregation: builtins.str,
        time_grain: builtins.str,
        time_window: builtins.str,
    ) -> None:
        """
        :param metric_name: -
        :param metric_resource_id: -
        :param operator: -
        :param statistic: -
        :param threshold: -
        :param time_aggregation: -
        :param time_grain: -
        :param time_window: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "metric_name": metric_name,
            "metric_resource_id": metric_resource_id,
            "operator": operator,
            "statistic": statistic,
            "threshold": threshold,
            "time_aggregation": time_aggregation,
            "time_grain": time_grain,
            "time_window": time_window,
        }

    @builtins.property
    def metric_name(self) -> builtins.str:
        result = self._values.get("metric_name")
        assert result is not None, "Required property 'metric_name' is missing"
        return result

    @builtins.property
    def metric_resource_id(self) -> builtins.str:
        result = self._values.get("metric_resource_id")
        assert result is not None, "Required property 'metric_resource_id' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def statistic(self) -> builtins.str:
        result = self._values.get("statistic")
        assert result is not None, "Required property 'statistic' is missing"
        return result

    @builtins.property
    def threshold(self) -> jsii.Number:
        result = self._values.get("threshold")
        assert result is not None, "Required property 'threshold' is missing"
        return result

    @builtins.property
    def time_aggregation(self) -> builtins.str:
        result = self._values.get("time_aggregation")
        assert result is not None, "Required property 'time_aggregation' is missing"
        return result

    @builtins.property
    def time_grain(self) -> builtins.str:
        result = self._values.get("time_grain")
        assert result is not None, "Required property 'time_grain' is missing"
        return result

    @builtins.property
    def time_window(self) -> builtins.str:
        result = self._values.get("time_window")
        assert result is not None, "Required property 'time_window' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingProfileRuleMetricTrigger(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingProfileRuleScaleAction",
    jsii_struct_bases=[],
    name_mapping={
        "cooldown": "cooldown",
        "direction": "direction",
        "type": "type",
        "value": "value",
    },
)
class MonitorAutoscaleSettingProfileRuleScaleAction:
    def __init__(
        self,
        *,
        cooldown: builtins.str,
        direction: builtins.str,
        type: builtins.str,
        value: jsii.Number,
    ) -> None:
        """
        :param cooldown: -
        :param direction: -
        :param type: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "cooldown": cooldown,
            "direction": direction,
            "type": type,
            "value": value,
        }

    @builtins.property
    def cooldown(self) -> builtins.str:
        result = self._values.get("cooldown")
        assert result is not None, "Required property 'cooldown' is missing"
        return result

    @builtins.property
    def direction(self) -> builtins.str:
        result = self._values.get("direction")
        assert result is not None, "Required property 'direction' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def value(self) -> jsii.Number:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingProfileRuleScaleAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorAutoscaleSettingTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorAutoscaleSettingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorAutoscaleSettingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorDiagnosticSetting(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorDiagnosticSetting",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        target_resource_id: builtins.str,
        eventhub_authorization_rule_id: typing.Optional[builtins.str] = None,
        eventhub_name: typing.Optional[builtins.str] = None,
        log: typing.Optional[typing.List["MonitorDiagnosticSettingLog"]] = None,
        log_analytics_destination_type: typing.Optional[builtins.str] = None,
        log_analytics_workspace_id: typing.Optional[builtins.str] = None,
        metric: typing.Optional[typing.List["MonitorDiagnosticSettingMetric"]] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorDiagnosticSettingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param target_resource_id: -
        :param eventhub_authorization_rule_id: -
        :param eventhub_name: -
        :param log: log block.
        :param log_analytics_destination_type: -
        :param log_analytics_workspace_id: -
        :param metric: metric block.
        :param storage_account_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorDiagnosticSettingConfig(
            name=name,
            target_resource_id=target_resource_id,
            eventhub_authorization_rule_id=eventhub_authorization_rule_id,
            eventhub_name=eventhub_name,
            log=log,
            log_analytics_destination_type=log_analytics_destination_type,
            log_analytics_workspace_id=log_analytics_workspace_id,
            metric=metric,
            storage_account_id=storage_account_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorDiagnosticSetting, self, [scope, id, config])

    @jsii.member(jsii_name="resetEventhubAuthorizationRuleId")
    def reset_eventhub_authorization_rule_id(self) -> None:
        return jsii.invoke(self, "resetEventhubAuthorizationRuleId", [])

    @jsii.member(jsii_name="resetEventhubName")
    def reset_eventhub_name(self) -> None:
        return jsii.invoke(self, "resetEventhubName", [])

    @jsii.member(jsii_name="resetLog")
    def reset_log(self) -> None:
        return jsii.invoke(self, "resetLog", [])

    @jsii.member(jsii_name="resetLogAnalyticsDestinationType")
    def reset_log_analytics_destination_type(self) -> None:
        return jsii.invoke(self, "resetLogAnalyticsDestinationType", [])

    @jsii.member(jsii_name="resetLogAnalyticsWorkspaceId")
    def reset_log_analytics_workspace_id(self) -> None:
        return jsii.invoke(self, "resetLogAnalyticsWorkspaceId", [])

    @jsii.member(jsii_name="resetMetric")
    def reset_metric(self) -> None:
        return jsii.invoke(self, "resetMetric", [])

    @jsii.member(jsii_name="resetStorageAccountId")
    def reset_storage_account_id(self) -> None:
        return jsii.invoke(self, "resetStorageAccountId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubAuthorizationRuleIdInput")
    def eventhub_authorization_rule_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "eventhubAuthorizationRuleIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubNameInput")
    def eventhub_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "eventhubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsDestinationTypeInput")
    def log_analytics_destination_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "logAnalyticsDestinationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceIdInput")
    def log_analytics_workspace_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "logAnalyticsWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logInput")
    def log_input(self) -> typing.Optional[typing.List["MonitorDiagnosticSettingLog"]]:
        return jsii.get(self, "logInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metricInput")
    def metric_input(
        self,
    ) -> typing.Optional[typing.List["MonitorDiagnosticSettingMetric"]]:
        return jsii.get(self, "metricInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorDiagnosticSettingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubAuthorizationRuleId")
    def eventhub_authorization_rule_id(self) -> builtins.str:
        return jsii.get(self, "eventhubAuthorizationRuleId")

    @eventhub_authorization_rule_id.setter # type: ignore
    def eventhub_authorization_rule_id(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubAuthorizationRuleId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubName")
    def eventhub_name(self) -> builtins.str:
        return jsii.get(self, "eventhubName")

    @eventhub_name.setter # type: ignore
    def eventhub_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="log")
    def log(self) -> typing.List["MonitorDiagnosticSettingLog"]:
        return jsii.get(self, "log")

    @log.setter # type: ignore
    def log(self, value: typing.List["MonitorDiagnosticSettingLog"]) -> None:
        jsii.set(self, "log", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsDestinationType")
    def log_analytics_destination_type(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsDestinationType")

    @log_analytics_destination_type.setter # type: ignore
    def log_analytics_destination_type(self, value: builtins.str) -> None:
        jsii.set(self, "logAnalyticsDestinationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceId")
    def log_analytics_workspace_id(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceId")

    @log_analytics_workspace_id.setter # type: ignore
    def log_analytics_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "logAnalyticsWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metric")
    def metric(self) -> typing.List["MonitorDiagnosticSettingMetric"]:
        return jsii.get(self, "metric")

    @metric.setter # type: ignore
    def metric(self, value: typing.List["MonitorDiagnosticSettingMetric"]) -> None:
        jsii.set(self, "metric", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorDiagnosticSettingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorDiagnosticSettingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorDiagnosticSettingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "target_resource_id": "targetResourceId",
        "eventhub_authorization_rule_id": "eventhubAuthorizationRuleId",
        "eventhub_name": "eventhubName",
        "log": "log",
        "log_analytics_destination_type": "logAnalyticsDestinationType",
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "metric": "metric",
        "storage_account_id": "storageAccountId",
        "timeouts": "timeouts",
    },
)
class MonitorDiagnosticSettingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        target_resource_id: builtins.str,
        eventhub_authorization_rule_id: typing.Optional[builtins.str] = None,
        eventhub_name: typing.Optional[builtins.str] = None,
        log: typing.Optional[typing.List["MonitorDiagnosticSettingLog"]] = None,
        log_analytics_destination_type: typing.Optional[builtins.str] = None,
        log_analytics_workspace_id: typing.Optional[builtins.str] = None,
        metric: typing.Optional[typing.List["MonitorDiagnosticSettingMetric"]] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorDiagnosticSettingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param target_resource_id: -
        :param eventhub_authorization_rule_id: -
        :param eventhub_name: -
        :param log: log block.
        :param log_analytics_destination_type: -
        :param log_analytics_workspace_id: -
        :param metric: metric block.
        :param storage_account_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorDiagnosticSettingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "target_resource_id": target_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if eventhub_authorization_rule_id is not None:
            self._values["eventhub_authorization_rule_id"] = eventhub_authorization_rule_id
        if eventhub_name is not None:
            self._values["eventhub_name"] = eventhub_name
        if log is not None:
            self._values["log"] = log
        if log_analytics_destination_type is not None:
            self._values["log_analytics_destination_type"] = log_analytics_destination_type
        if log_analytics_workspace_id is not None:
            self._values["log_analytics_workspace_id"] = log_analytics_workspace_id
        if metric is not None:
            self._values["metric"] = metric
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def target_resource_id(self) -> builtins.str:
        result = self._values.get("target_resource_id")
        assert result is not None, "Required property 'target_resource_id' is missing"
        return result

    @builtins.property
    def eventhub_authorization_rule_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eventhub_authorization_rule_id")
        return result

    @builtins.property
    def eventhub_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eventhub_name")
        return result

    @builtins.property
    def log(self) -> typing.Optional[typing.List["MonitorDiagnosticSettingLog"]]:
        """log block."""
        result = self._values.get("log")
        return result

    @builtins.property
    def log_analytics_destination_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("log_analytics_destination_type")
        return result

    @builtins.property
    def log_analytics_workspace_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("log_analytics_workspace_id")
        return result

    @builtins.property
    def metric(self) -> typing.Optional[typing.List["MonitorDiagnosticSettingMetric"]]:
        """metric block."""
        result = self._values.get("metric")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorDiagnosticSettingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorDiagnosticSettingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorDiagnosticSettingLog",
    jsii_struct_bases=[],
    name_mapping={
        "category": "category",
        "enabled": "enabled",
        "retention_policy": "retentionPolicy",
    },
)
class MonitorDiagnosticSettingLog:
    def __init__(
        self,
        *,
        category: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        retention_policy: typing.Optional[typing.List["MonitorDiagnosticSettingLogRetentionPolicy"]] = None,
    ) -> None:
        """
        :param category: -
        :param enabled: -
        :param retention_policy: retention_policy block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "category": category,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if retention_policy is not None:
            self._values["retention_policy"] = retention_policy

    @builtins.property
    def category(self) -> builtins.str:
        result = self._values.get("category")
        assert result is not None, "Required property 'category' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def retention_policy(
        self,
    ) -> typing.Optional[typing.List["MonitorDiagnosticSettingLogRetentionPolicy"]]:
        """retention_policy block."""
        result = self._values.get("retention_policy")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorDiagnosticSettingLog(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorDiagnosticSettingLogRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "days": "days"},
)
class MonitorDiagnosticSettingLogRetentionPolicy:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        days: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param enabled: -
        :param days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if days is not None:
            self._values["days"] = days

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorDiagnosticSettingLogRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorDiagnosticSettingMetric",
    jsii_struct_bases=[],
    name_mapping={
        "category": "category",
        "enabled": "enabled",
        "retention_policy": "retentionPolicy",
    },
)
class MonitorDiagnosticSettingMetric:
    def __init__(
        self,
        *,
        category: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        retention_policy: typing.Optional[typing.List["MonitorDiagnosticSettingMetricRetentionPolicy"]] = None,
    ) -> None:
        """
        :param category: -
        :param enabled: -
        :param retention_policy: retention_policy block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "category": category,
        }
        if enabled is not None:
            self._values["enabled"] = enabled
        if retention_policy is not None:
            self._values["retention_policy"] = retention_policy

    @builtins.property
    def category(self) -> builtins.str:
        result = self._values.get("category")
        assert result is not None, "Required property 'category' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def retention_policy(
        self,
    ) -> typing.Optional[typing.List["MonitorDiagnosticSettingMetricRetentionPolicy"]]:
        """retention_policy block."""
        result = self._values.get("retention_policy")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorDiagnosticSettingMetric(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorDiagnosticSettingMetricRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "days": "days"},
)
class MonitorDiagnosticSettingMetricRetentionPolicy:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        days: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param enabled: -
        :param days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if days is not None:
            self._values["days"] = days

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorDiagnosticSettingMetricRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorDiagnosticSettingTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorDiagnosticSettingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorDiagnosticSettingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorLogProfile(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorLogProfile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        categories: typing.List[builtins.str],
        locations: typing.List[builtins.str],
        name: builtins.str,
        retention_policy: typing.List["MonitorLogProfileRetentionPolicy"],
        servicebus_rule_id: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorLogProfileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param categories: -
        :param locations: -
        :param name: -
        :param retention_policy: retention_policy block.
        :param servicebus_rule_id: -
        :param storage_account_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorLogProfileConfig(
            categories=categories,
            locations=locations,
            name=name,
            retention_policy=retention_policy,
            servicebus_rule_id=servicebus_rule_id,
            storage_account_id=storage_account_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorLogProfile, self, [scope, id, config])

    @jsii.member(jsii_name="resetServicebusRuleId")
    def reset_servicebus_rule_id(self) -> None:
        return jsii.invoke(self, "resetServicebusRuleId", [])

    @jsii.member(jsii_name="resetStorageAccountId")
    def reset_storage_account_id(self) -> None:
        return jsii.invoke(self, "resetStorageAccountId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="categoriesInput")
    def categories_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "categoriesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationsInput")
    def locations_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "locationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionPolicyInput")
    def retention_policy_input(self) -> typing.List["MonitorLogProfileRetentionPolicy"]:
        return jsii.get(self, "retentionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusRuleIdInput")
    def servicebus_rule_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "servicebusRuleIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorLogProfileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="categories")
    def categories(self) -> typing.List[builtins.str]:
        return jsii.get(self, "categories")

    @categories.setter # type: ignore
    def categories(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "categories", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locations")
    def locations(self) -> typing.List[builtins.str]:
        return jsii.get(self, "locations")

    @locations.setter # type: ignore
    def locations(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "locations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionPolicy")
    def retention_policy(self) -> typing.List["MonitorLogProfileRetentionPolicy"]:
        return jsii.get(self, "retentionPolicy")

    @retention_policy.setter # type: ignore
    def retention_policy(
        self,
        value: typing.List["MonitorLogProfileRetentionPolicy"],
    ) -> None:
        jsii.set(self, "retentionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusRuleId")
    def servicebus_rule_id(self) -> builtins.str:
        return jsii.get(self, "servicebusRuleId")

    @servicebus_rule_id.setter # type: ignore
    def servicebus_rule_id(self, value: builtins.str) -> None:
        jsii.set(self, "servicebusRuleId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorLogProfileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorLogProfileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorLogProfileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "categories": "categories",
        "locations": "locations",
        "name": "name",
        "retention_policy": "retentionPolicy",
        "servicebus_rule_id": "servicebusRuleId",
        "storage_account_id": "storageAccountId",
        "timeouts": "timeouts",
    },
)
class MonitorLogProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        categories: typing.List[builtins.str],
        locations: typing.List[builtins.str],
        name: builtins.str,
        retention_policy: typing.List["MonitorLogProfileRetentionPolicy"],
        servicebus_rule_id: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorLogProfileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param categories: -
        :param locations: -
        :param name: -
        :param retention_policy: retention_policy block.
        :param servicebus_rule_id: -
        :param storage_account_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorLogProfileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "categories": categories,
            "locations": locations,
            "name": name,
            "retention_policy": retention_policy,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if servicebus_rule_id is not None:
            self._values["servicebus_rule_id"] = servicebus_rule_id
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def categories(self) -> typing.List[builtins.str]:
        result = self._values.get("categories")
        assert result is not None, "Required property 'categories' is missing"
        return result

    @builtins.property
    def locations(self) -> typing.List[builtins.str]:
        result = self._values.get("locations")
        assert result is not None, "Required property 'locations' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def retention_policy(self) -> typing.List["MonitorLogProfileRetentionPolicy"]:
        """retention_policy block."""
        result = self._values.get("retention_policy")
        assert result is not None, "Required property 'retention_policy' is missing"
        return result

    @builtins.property
    def servicebus_rule_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("servicebus_rule_id")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorLogProfileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorLogProfileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorLogProfileRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "days": "days"},
)
class MonitorLogProfileRetentionPolicy:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        days: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param enabled: -
        :param days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if days is not None:
            self._values["days"] = days

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorLogProfileRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorLogProfileTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorLogProfileTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorLogProfileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorMetricAlert(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorMetricAlert",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        scopes: typing.List[builtins.str],
        action: typing.Optional[typing.List["MonitorMetricAlertAction"]] = None,
        application_insights_web_test_location_availability_criteria: typing.Optional[typing.List["MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria"]] = None,
        auto_mitigate: typing.Optional[builtins.bool] = None,
        criteria: typing.Optional[typing.List["MonitorMetricAlertCriteria"]] = None,
        description: typing.Optional[builtins.str] = None,
        dynamic_criteria: typing.Optional[typing.List["MonitorMetricAlertDynamicCriteria"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        frequency: typing.Optional[builtins.str] = None,
        severity: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_location: typing.Optional[builtins.str] = None,
        target_resource_type: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorMetricAlertTimeouts"] = None,
        window_size: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param scopes: -
        :param action: action block.
        :param application_insights_web_test_location_availability_criteria: application_insights_web_test_location_availability_criteria block.
        :param auto_mitigate: -
        :param criteria: criteria block.
        :param description: -
        :param dynamic_criteria: dynamic_criteria block.
        :param enabled: -
        :param frequency: -
        :param severity: -
        :param tags: -
        :param target_resource_location: The location of the target resource. Required when using subscription, resource group scope or multiple scopes.
        :param target_resource_type: The resource type (e.g. Microsoft.Compute/virtualMachines) of the target resource. Required when using subscription, resource group scope or multiple scopes.
        :param timeouts: timeouts block.
        :param window_size: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorMetricAlertConfig(
            name=name,
            resource_group_name=resource_group_name,
            scopes=scopes,
            action=action,
            application_insights_web_test_location_availability_criteria=application_insights_web_test_location_availability_criteria,
            auto_mitigate=auto_mitigate,
            criteria=criteria,
            description=description,
            dynamic_criteria=dynamic_criteria,
            enabled=enabled,
            frequency=frequency,
            severity=severity,
            tags=tags,
            target_resource_location=target_resource_location,
            target_resource_type=target_resource_type,
            timeouts=timeouts,
            window_size=window_size,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorMetricAlert, self, [scope, id, config])

    @jsii.member(jsii_name="resetAction")
    def reset_action(self) -> None:
        return jsii.invoke(self, "resetAction", [])

    @jsii.member(jsii_name="resetApplicationInsightsWebTestLocationAvailabilityCriteria")
    def reset_application_insights_web_test_location_availability_criteria(
        self,
    ) -> None:
        return jsii.invoke(self, "resetApplicationInsightsWebTestLocationAvailabilityCriteria", [])

    @jsii.member(jsii_name="resetAutoMitigate")
    def reset_auto_mitigate(self) -> None:
        return jsii.invoke(self, "resetAutoMitigate", [])

    @jsii.member(jsii_name="resetCriteria")
    def reset_criteria(self) -> None:
        return jsii.invoke(self, "resetCriteria", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetDynamicCriteria")
    def reset_dynamic_criteria(self) -> None:
        return jsii.invoke(self, "resetDynamicCriteria", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetFrequency")
    def reset_frequency(self) -> None:
        return jsii.invoke(self, "resetFrequency", [])

    @jsii.member(jsii_name="resetSeverity")
    def reset_severity(self) -> None:
        return jsii.invoke(self, "resetSeverity", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTargetResourceLocation")
    def reset_target_resource_location(self) -> None:
        return jsii.invoke(self, "resetTargetResourceLocation", [])

    @jsii.member(jsii_name="resetTargetResourceType")
    def reset_target_resource_type(self) -> None:
        return jsii.invoke(self, "resetTargetResourceType", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWindowSize")
    def reset_window_size(self) -> None:
        return jsii.invoke(self, "resetWindowSize", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopesInput")
    def scopes_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> typing.Optional[typing.List["MonitorMetricAlertAction"]]:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsWebTestLocationAvailabilityCriteriaInput")
    def application_insights_web_test_location_availability_criteria_input(
        self,
    ) -> typing.Optional[typing.List["MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria"]]:
        return jsii.get(self, "applicationInsightsWebTestLocationAvailabilityCriteriaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoMitigateInput")
    def auto_mitigate_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoMitigateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="criteriaInput")
    def criteria_input(
        self,
    ) -> typing.Optional[typing.List["MonitorMetricAlertCriteria"]]:
        return jsii.get(self, "criteriaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dynamicCriteriaInput")
    def dynamic_criteria_input(
        self,
    ) -> typing.Optional[typing.List["MonitorMetricAlertDynamicCriteria"]]:
        return jsii.get(self, "dynamicCriteriaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequencyInput")
    def frequency_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "frequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severityInput")
    def severity_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "severityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceLocationInput")
    def target_resource_location_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetResourceLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceTypeInput")
    def target_resource_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetResourceTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MonitorMetricAlertTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="windowSizeInput")
    def window_size_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "windowSizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> typing.List["MonitorMetricAlertAction"]:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: typing.List["MonitorMetricAlertAction"]) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationInsightsWebTestLocationAvailabilityCriteria")
    def application_insights_web_test_location_availability_criteria(
        self,
    ) -> typing.List["MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria"]:
        return jsii.get(self, "applicationInsightsWebTestLocationAvailabilityCriteria")

    @application_insights_web_test_location_availability_criteria.setter # type: ignore
    def application_insights_web_test_location_availability_criteria(
        self,
        value: typing.List["MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria"],
    ) -> None:
        jsii.set(self, "applicationInsightsWebTestLocationAvailabilityCriteria", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoMitigate")
    def auto_mitigate(self) -> builtins.bool:
        return jsii.get(self, "autoMitigate")

    @auto_mitigate.setter # type: ignore
    def auto_mitigate(self, value: builtins.bool) -> None:
        jsii.set(self, "autoMitigate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="criteria")
    def criteria(self) -> typing.List["MonitorMetricAlertCriteria"]:
        return jsii.get(self, "criteria")

    @criteria.setter # type: ignore
    def criteria(self, value: typing.List["MonitorMetricAlertCriteria"]) -> None:
        jsii.set(self, "criteria", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dynamicCriteria")
    def dynamic_criteria(self) -> typing.List["MonitorMetricAlertDynamicCriteria"]:
        return jsii.get(self, "dynamicCriteria")

    @dynamic_criteria.setter # type: ignore
    def dynamic_criteria(
        self,
        value: typing.List["MonitorMetricAlertDynamicCriteria"],
    ) -> None:
        jsii.set(self, "dynamicCriteria", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> builtins.str:
        return jsii.get(self, "frequency")

    @frequency.setter # type: ignore
    def frequency(self, value: builtins.str) -> None:
        jsii.set(self, "frequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopes")
    def scopes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopes")

    @scopes.setter # type: ignore
    def scopes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "scopes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severity")
    def severity(self) -> jsii.Number:
        return jsii.get(self, "severity")

    @severity.setter # type: ignore
    def severity(self, value: jsii.Number) -> None:
        jsii.set(self, "severity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceLocation")
    def target_resource_location(self) -> builtins.str:
        return jsii.get(self, "targetResourceLocation")

    @target_resource_location.setter # type: ignore
    def target_resource_location(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceType")
    def target_resource_type(self) -> builtins.str:
        return jsii.get(self, "targetResourceType")

    @target_resource_type.setter # type: ignore
    def target_resource_type(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorMetricAlertTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorMetricAlertTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="windowSize")
    def window_size(self) -> builtins.str:
        return jsii.get(self, "windowSize")

    @window_size.setter # type: ignore
    def window_size(self, value: builtins.str) -> None:
        jsii.set(self, "windowSize", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertAction",
    jsii_struct_bases=[],
    name_mapping={
        "action_group_id": "actionGroupId",
        "webhook_properties": "webhookProperties",
    },
)
class MonitorMetricAlertAction:
    def __init__(
        self,
        *,
        action_group_id: builtins.str,
        webhook_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
    ) -> None:
        """
        :param action_group_id: -
        :param webhook_properties: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action_group_id": action_group_id,
        }
        if webhook_properties is not None:
            self._values["webhook_properties"] = webhook_properties

    @builtins.property
    def action_group_id(self) -> builtins.str:
        result = self._values.get("action_group_id")
        assert result is not None, "Required property 'action_group_id' is missing"
        return result

    @builtins.property
    def webhook_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("webhook_properties")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria",
    jsii_struct_bases=[],
    name_mapping={
        "component_id": "componentId",
        "failed_location_count": "failedLocationCount",
        "web_test_id": "webTestId",
    },
)
class MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria:
    def __init__(
        self,
        *,
        component_id: builtins.str,
        failed_location_count: jsii.Number,
        web_test_id: builtins.str,
    ) -> None:
        """
        :param component_id: -
        :param failed_location_count: -
        :param web_test_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "component_id": component_id,
            "failed_location_count": failed_location_count,
            "web_test_id": web_test_id,
        }

    @builtins.property
    def component_id(self) -> builtins.str:
        result = self._values.get("component_id")
        assert result is not None, "Required property 'component_id' is missing"
        return result

    @builtins.property
    def failed_location_count(self) -> jsii.Number:
        result = self._values.get("failed_location_count")
        assert result is not None, "Required property 'failed_location_count' is missing"
        return result

    @builtins.property
    def web_test_id(self) -> builtins.str:
        result = self._values.get("web_test_id")
        assert result is not None, "Required property 'web_test_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "scopes": "scopes",
        "action": "action",
        "application_insights_web_test_location_availability_criteria": "applicationInsightsWebTestLocationAvailabilityCriteria",
        "auto_mitigate": "autoMitigate",
        "criteria": "criteria",
        "description": "description",
        "dynamic_criteria": "dynamicCriteria",
        "enabled": "enabled",
        "frequency": "frequency",
        "severity": "severity",
        "tags": "tags",
        "target_resource_location": "targetResourceLocation",
        "target_resource_type": "targetResourceType",
        "timeouts": "timeouts",
        "window_size": "windowSize",
    },
)
class MonitorMetricAlertConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        scopes: typing.List[builtins.str],
        action: typing.Optional[typing.List[MonitorMetricAlertAction]] = None,
        application_insights_web_test_location_availability_criteria: typing.Optional[typing.List[MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria]] = None,
        auto_mitigate: typing.Optional[builtins.bool] = None,
        criteria: typing.Optional[typing.List["MonitorMetricAlertCriteria"]] = None,
        description: typing.Optional[builtins.str] = None,
        dynamic_criteria: typing.Optional[typing.List["MonitorMetricAlertDynamicCriteria"]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        frequency: typing.Optional[builtins.str] = None,
        severity: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        target_resource_location: typing.Optional[builtins.str] = None,
        target_resource_type: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorMetricAlertTimeouts"] = None,
        window_size: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param scopes: -
        :param action: action block.
        :param application_insights_web_test_location_availability_criteria: application_insights_web_test_location_availability_criteria block.
        :param auto_mitigate: -
        :param criteria: criteria block.
        :param description: -
        :param dynamic_criteria: dynamic_criteria block.
        :param enabled: -
        :param frequency: -
        :param severity: -
        :param tags: -
        :param target_resource_location: The location of the target resource. Required when using subscription, resource group scope or multiple scopes.
        :param target_resource_type: The resource type (e.g. Microsoft.Compute/virtualMachines) of the target resource. Required when using subscription, resource group scope or multiple scopes.
        :param timeouts: timeouts block.
        :param window_size: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorMetricAlertTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "scopes": scopes,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if action is not None:
            self._values["action"] = action
        if application_insights_web_test_location_availability_criteria is not None:
            self._values["application_insights_web_test_location_availability_criteria"] = application_insights_web_test_location_availability_criteria
        if auto_mitigate is not None:
            self._values["auto_mitigate"] = auto_mitigate
        if criteria is not None:
            self._values["criteria"] = criteria
        if description is not None:
            self._values["description"] = description
        if dynamic_criteria is not None:
            self._values["dynamic_criteria"] = dynamic_criteria
        if enabled is not None:
            self._values["enabled"] = enabled
        if frequency is not None:
            self._values["frequency"] = frequency
        if severity is not None:
            self._values["severity"] = severity
        if tags is not None:
            self._values["tags"] = tags
        if target_resource_location is not None:
            self._values["target_resource_location"] = target_resource_location
        if target_resource_type is not None:
            self._values["target_resource_type"] = target_resource_type
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if window_size is not None:
            self._values["window_size"] = window_size

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def scopes(self) -> typing.List[builtins.str]:
        result = self._values.get("scopes")
        assert result is not None, "Required property 'scopes' is missing"
        return result

    @builtins.property
    def action(self) -> typing.Optional[typing.List[MonitorMetricAlertAction]]:
        """action block."""
        result = self._values.get("action")
        return result

    @builtins.property
    def application_insights_web_test_location_availability_criteria(
        self,
    ) -> typing.Optional[typing.List[MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria]]:
        """application_insights_web_test_location_availability_criteria block."""
        result = self._values.get("application_insights_web_test_location_availability_criteria")
        return result

    @builtins.property
    def auto_mitigate(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_mitigate")
        return result

    @builtins.property
    def criteria(self) -> typing.Optional[typing.List["MonitorMetricAlertCriteria"]]:
        """criteria block."""
        result = self._values.get("criteria")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def dynamic_criteria(
        self,
    ) -> typing.Optional[typing.List["MonitorMetricAlertDynamicCriteria"]]:
        """dynamic_criteria block."""
        result = self._values.get("dynamic_criteria")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def frequency(self) -> typing.Optional[builtins.str]:
        result = self._values.get("frequency")
        return result

    @builtins.property
    def severity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("severity")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def target_resource_location(self) -> typing.Optional[builtins.str]:
        """The location of the target resource.

        Required when using subscription, resource group scope or multiple scopes.
        """
        result = self._values.get("target_resource_location")
        return result

    @builtins.property
    def target_resource_type(self) -> typing.Optional[builtins.str]:
        """The resource type (e.g. Microsoft.Compute/virtualMachines) of the target resource. Required when using subscription, resource group scope or multiple scopes."""
        result = self._values.get("target_resource_type")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorMetricAlertTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def window_size(self) -> typing.Optional[builtins.str]:
        result = self._values.get("window_size")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertCriteria",
    jsii_struct_bases=[],
    name_mapping={
        "aggregation": "aggregation",
        "metric_name": "metricName",
        "metric_namespace": "metricNamespace",
        "operator": "operator",
        "threshold": "threshold",
        "dimension": "dimension",
    },
)
class MonitorMetricAlertCriteria:
    def __init__(
        self,
        *,
        aggregation: builtins.str,
        metric_name: builtins.str,
        metric_namespace: builtins.str,
        operator: builtins.str,
        threshold: jsii.Number,
        dimension: typing.Optional[typing.List["MonitorMetricAlertCriteriaDimension"]] = None,
    ) -> None:
        """
        :param aggregation: -
        :param metric_name: -
        :param metric_namespace: -
        :param operator: -
        :param threshold: -
        :param dimension: dimension block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "aggregation": aggregation,
            "metric_name": metric_name,
            "metric_namespace": metric_namespace,
            "operator": operator,
            "threshold": threshold,
        }
        if dimension is not None:
            self._values["dimension"] = dimension

    @builtins.property
    def aggregation(self) -> builtins.str:
        result = self._values.get("aggregation")
        assert result is not None, "Required property 'aggregation' is missing"
        return result

    @builtins.property
    def metric_name(self) -> builtins.str:
        result = self._values.get("metric_name")
        assert result is not None, "Required property 'metric_name' is missing"
        return result

    @builtins.property
    def metric_namespace(self) -> builtins.str:
        result = self._values.get("metric_namespace")
        assert result is not None, "Required property 'metric_namespace' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def threshold(self) -> jsii.Number:
        result = self._values.get("threshold")
        assert result is not None, "Required property 'threshold' is missing"
        return result

    @builtins.property
    def dimension(
        self,
    ) -> typing.Optional[typing.List["MonitorMetricAlertCriteriaDimension"]]:
        """dimension block."""
        result = self._values.get("dimension")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertCriteria(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertCriteriaDimension",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "operator": "operator", "values": "values"},
)
class MonitorMetricAlertCriteriaDimension:
    def __init__(
        self,
        *,
        name: builtins.str,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param name: -
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertCriteriaDimension(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertDynamicCriteria",
    jsii_struct_bases=[],
    name_mapping={
        "aggregation": "aggregation",
        "alert_sensitivity": "alertSensitivity",
        "metric_name": "metricName",
        "metric_namespace": "metricNamespace",
        "operator": "operator",
        "dimension": "dimension",
        "evaluation_failure_count": "evaluationFailureCount",
        "evaluation_total_count": "evaluationTotalCount",
        "ignore_data_before": "ignoreDataBefore",
    },
)
class MonitorMetricAlertDynamicCriteria:
    def __init__(
        self,
        *,
        aggregation: builtins.str,
        alert_sensitivity: builtins.str,
        metric_name: builtins.str,
        metric_namespace: builtins.str,
        operator: builtins.str,
        dimension: typing.Optional[typing.List["MonitorMetricAlertDynamicCriteriaDimension"]] = None,
        evaluation_failure_count: typing.Optional[jsii.Number] = None,
        evaluation_total_count: typing.Optional[jsii.Number] = None,
        ignore_data_before: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param aggregation: -
        :param alert_sensitivity: -
        :param metric_name: -
        :param metric_namespace: -
        :param operator: -
        :param dimension: dimension block.
        :param evaluation_failure_count: -
        :param evaluation_total_count: -
        :param ignore_data_before: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "aggregation": aggregation,
            "alert_sensitivity": alert_sensitivity,
            "metric_name": metric_name,
            "metric_namespace": metric_namespace,
            "operator": operator,
        }
        if dimension is not None:
            self._values["dimension"] = dimension
        if evaluation_failure_count is not None:
            self._values["evaluation_failure_count"] = evaluation_failure_count
        if evaluation_total_count is not None:
            self._values["evaluation_total_count"] = evaluation_total_count
        if ignore_data_before is not None:
            self._values["ignore_data_before"] = ignore_data_before

    @builtins.property
    def aggregation(self) -> builtins.str:
        result = self._values.get("aggregation")
        assert result is not None, "Required property 'aggregation' is missing"
        return result

    @builtins.property
    def alert_sensitivity(self) -> builtins.str:
        result = self._values.get("alert_sensitivity")
        assert result is not None, "Required property 'alert_sensitivity' is missing"
        return result

    @builtins.property
    def metric_name(self) -> builtins.str:
        result = self._values.get("metric_name")
        assert result is not None, "Required property 'metric_name' is missing"
        return result

    @builtins.property
    def metric_namespace(self) -> builtins.str:
        result = self._values.get("metric_namespace")
        assert result is not None, "Required property 'metric_namespace' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def dimension(
        self,
    ) -> typing.Optional[typing.List["MonitorMetricAlertDynamicCriteriaDimension"]]:
        """dimension block."""
        result = self._values.get("dimension")
        return result

    @builtins.property
    def evaluation_failure_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("evaluation_failure_count")
        return result

    @builtins.property
    def evaluation_total_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("evaluation_total_count")
        return result

    @builtins.property
    def ignore_data_before(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ignore_data_before")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertDynamicCriteria(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertDynamicCriteriaDimension",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "operator": "operator", "values": "values"},
)
class MonitorMetricAlertDynamicCriteriaDimension:
    def __init__(
        self,
        *,
        name: builtins.str,
        operator: builtins.str,
        values: typing.List[builtins.str],
    ) -> None:
        """
        :param name: -
        :param operator: -
        :param values: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "operator": operator,
            "values": values,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertDynamicCriteriaDimension(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorMetricAlertTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorMetricAlertTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorMetricAlertTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorScheduledQueryRulesAlert(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorScheduledQueryRulesAlert",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        action: typing.List["MonitorScheduledQueryRulesAlertAction"],
        data_source_id: builtins.str,
        frequency: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        query: builtins.str,
        resource_group_name: builtins.str,
        time_window: jsii.Number,
        trigger: typing.List["MonitorScheduledQueryRulesAlertTrigger"],
        authorized_resource_ids: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        query_type: typing.Optional[builtins.str] = None,
        severity: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        throttling: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["MonitorScheduledQueryRulesAlertTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param action: action block.
        :param data_source_id: -
        :param frequency: -
        :param location: -
        :param name: -
        :param query: -
        :param resource_group_name: -
        :param time_window: -
        :param trigger: trigger block.
        :param authorized_resource_ids: -
        :param description: -
        :param enabled: -
        :param query_type: -
        :param severity: -
        :param tags: -
        :param throttling: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorScheduledQueryRulesAlertConfig(
            action=action,
            data_source_id=data_source_id,
            frequency=frequency,
            location=location,
            name=name,
            query=query,
            resource_group_name=resource_group_name,
            time_window=time_window,
            trigger=trigger,
            authorized_resource_ids=authorized_resource_ids,
            description=description,
            enabled=enabled,
            query_type=query_type,
            severity=severity,
            tags=tags,
            throttling=throttling,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorScheduledQueryRulesAlert, self, [scope, id, config])

    @jsii.member(jsii_name="resetAuthorizedResourceIds")
    def reset_authorized_resource_ids(self) -> None:
        return jsii.invoke(self, "resetAuthorizedResourceIds", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetQueryType")
    def reset_query_type(self) -> None:
        return jsii.invoke(self, "resetQueryType", [])

    @jsii.member(jsii_name="resetSeverity")
    def reset_severity(self) -> None:
        return jsii.invoke(self, "resetSeverity", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetThrottling")
    def reset_throttling(self) -> None:
        return jsii.invoke(self, "resetThrottling", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> typing.List["MonitorScheduledQueryRulesAlertAction"]:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceIdInput")
    def data_source_id_input(self) -> builtins.str:
        return jsii.get(self, "dataSourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequencyInput")
    def frequency_input(self) -> jsii.Number:
        return jsii.get(self, "frequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryInput")
    def query_input(self) -> builtins.str:
        return jsii.get(self, "queryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeWindowInput")
    def time_window_input(self) -> jsii.Number:
        return jsii.get(self, "timeWindowInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="triggerInput")
    def trigger_input(self) -> typing.List["MonitorScheduledQueryRulesAlertTrigger"]:
        return jsii.get(self, "triggerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizedResourceIdsInput")
    def authorized_resource_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "authorizedResourceIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryTypeInput")
    def query_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "queryTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severityInput")
    def severity_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "severityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throttlingInput")
    def throttling_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "throttlingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MonitorScheduledQueryRulesAlertTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> typing.List["MonitorScheduledQueryRulesAlertAction"]:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(
        self,
        value: typing.List["MonitorScheduledQueryRulesAlertAction"],
    ) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizedResourceIds")
    def authorized_resource_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "authorizedResourceIds")

    @authorized_resource_ids.setter # type: ignore
    def authorized_resource_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "authorizedResourceIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceId")
    def data_source_id(self) -> builtins.str:
        return jsii.get(self, "dataSourceId")

    @data_source_id.setter # type: ignore
    def data_source_id(self, value: builtins.str) -> None:
        jsii.set(self, "dataSourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> jsii.Number:
        return jsii.get(self, "frequency")

    @frequency.setter # type: ignore
    def frequency(self, value: jsii.Number) -> None:
        jsii.set(self, "frequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="query")
    def query(self) -> builtins.str:
        return jsii.get(self, "query")

    @query.setter # type: ignore
    def query(self, value: builtins.str) -> None:
        jsii.set(self, "query", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryType")
    def query_type(self) -> builtins.str:
        return jsii.get(self, "queryType")

    @query_type.setter # type: ignore
    def query_type(self, value: builtins.str) -> None:
        jsii.set(self, "queryType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severity")
    def severity(self) -> jsii.Number:
        return jsii.get(self, "severity")

    @severity.setter # type: ignore
    def severity(self, value: jsii.Number) -> None:
        jsii.set(self, "severity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throttling")
    def throttling(self) -> jsii.Number:
        return jsii.get(self, "throttling")

    @throttling.setter # type: ignore
    def throttling(self, value: jsii.Number) -> None:
        jsii.set(self, "throttling", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorScheduledQueryRulesAlertTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorScheduledQueryRulesAlertTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeWindow")
    def time_window(self) -> jsii.Number:
        return jsii.get(self, "timeWindow")

    @time_window.setter # type: ignore
    def time_window(self, value: jsii.Number) -> None:
        jsii.set(self, "timeWindow", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trigger")
    def trigger(self) -> typing.List["MonitorScheduledQueryRulesAlertTrigger"]:
        return jsii.get(self, "trigger")

    @trigger.setter # type: ignore
    def trigger(
        self,
        value: typing.List["MonitorScheduledQueryRulesAlertTrigger"],
    ) -> None:
        jsii.set(self, "trigger", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesAlertAction",
    jsii_struct_bases=[],
    name_mapping={
        "action_group": "actionGroup",
        "custom_webhook_payload": "customWebhookPayload",
        "email_subject": "emailSubject",
    },
)
class MonitorScheduledQueryRulesAlertAction:
    def __init__(
        self,
        *,
        action_group: typing.List[builtins.str],
        custom_webhook_payload: typing.Optional[builtins.str] = None,
        email_subject: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action_group: -
        :param custom_webhook_payload: -
        :param email_subject: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action_group": action_group,
        }
        if custom_webhook_payload is not None:
            self._values["custom_webhook_payload"] = custom_webhook_payload
        if email_subject is not None:
            self._values["email_subject"] = email_subject

    @builtins.property
    def action_group(self) -> typing.List[builtins.str]:
        result = self._values.get("action_group")
        assert result is not None, "Required property 'action_group' is missing"
        return result

    @builtins.property
    def custom_webhook_payload(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_webhook_payload")
        return result

    @builtins.property
    def email_subject(self) -> typing.Optional[builtins.str]:
        result = self._values.get("email_subject")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesAlertAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesAlertConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "action": "action",
        "data_source_id": "dataSourceId",
        "frequency": "frequency",
        "location": "location",
        "name": "name",
        "query": "query",
        "resource_group_name": "resourceGroupName",
        "time_window": "timeWindow",
        "trigger": "trigger",
        "authorized_resource_ids": "authorizedResourceIds",
        "description": "description",
        "enabled": "enabled",
        "query_type": "queryType",
        "severity": "severity",
        "tags": "tags",
        "throttling": "throttling",
        "timeouts": "timeouts",
    },
)
class MonitorScheduledQueryRulesAlertConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        action: typing.List[MonitorScheduledQueryRulesAlertAction],
        data_source_id: builtins.str,
        frequency: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        query: builtins.str,
        resource_group_name: builtins.str,
        time_window: jsii.Number,
        trigger: typing.List["MonitorScheduledQueryRulesAlertTrigger"],
        authorized_resource_ids: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        query_type: typing.Optional[builtins.str] = None,
        severity: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        throttling: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["MonitorScheduledQueryRulesAlertTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action: action block.
        :param data_source_id: -
        :param frequency: -
        :param location: -
        :param name: -
        :param query: -
        :param resource_group_name: -
        :param time_window: -
        :param trigger: trigger block.
        :param authorized_resource_ids: -
        :param description: -
        :param enabled: -
        :param query_type: -
        :param severity: -
        :param tags: -
        :param throttling: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorScheduledQueryRulesAlertTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "data_source_id": data_source_id,
            "frequency": frequency,
            "location": location,
            "name": name,
            "query": query,
            "resource_group_name": resource_group_name,
            "time_window": time_window,
            "trigger": trigger,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if authorized_resource_ids is not None:
            self._values["authorized_resource_ids"] = authorized_resource_ids
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if query_type is not None:
            self._values["query_type"] = query_type
        if severity is not None:
            self._values["severity"] = severity
        if tags is not None:
            self._values["tags"] = tags
        if throttling is not None:
            self._values["throttling"] = throttling
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def action(self) -> typing.List[MonitorScheduledQueryRulesAlertAction]:
        """action block."""
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def data_source_id(self) -> builtins.str:
        result = self._values.get("data_source_id")
        assert result is not None, "Required property 'data_source_id' is missing"
        return result

    @builtins.property
    def frequency(self) -> jsii.Number:
        result = self._values.get("frequency")
        assert result is not None, "Required property 'frequency' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def query(self) -> builtins.str:
        result = self._values.get("query")
        assert result is not None, "Required property 'query' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def time_window(self) -> jsii.Number:
        result = self._values.get("time_window")
        assert result is not None, "Required property 'time_window' is missing"
        return result

    @builtins.property
    def trigger(self) -> typing.List["MonitorScheduledQueryRulesAlertTrigger"]:
        """trigger block."""
        result = self._values.get("trigger")
        assert result is not None, "Required property 'trigger' is missing"
        return result

    @builtins.property
    def authorized_resource_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("authorized_resource_ids")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def query_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("query_type")
        return result

    @builtins.property
    def severity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("severity")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def throttling(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("throttling")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorScheduledQueryRulesAlertTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesAlertConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesAlertTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorScheduledQueryRulesAlertTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesAlertTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesAlertTrigger",
    jsii_struct_bases=[],
    name_mapping={
        "operator": "operator",
        "threshold": "threshold",
        "metric_trigger": "metricTrigger",
    },
)
class MonitorScheduledQueryRulesAlertTrigger:
    def __init__(
        self,
        *,
        operator: builtins.str,
        threshold: jsii.Number,
        metric_trigger: typing.Optional[typing.List["MonitorScheduledQueryRulesAlertTriggerMetricTrigger"]] = None,
    ) -> None:
        """
        :param operator: -
        :param threshold: -
        :param metric_trigger: metric_trigger block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "operator": operator,
            "threshold": threshold,
        }
        if metric_trigger is not None:
            self._values["metric_trigger"] = metric_trigger

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def threshold(self) -> jsii.Number:
        result = self._values.get("threshold")
        assert result is not None, "Required property 'threshold' is missing"
        return result

    @builtins.property
    def metric_trigger(
        self,
    ) -> typing.Optional[typing.List["MonitorScheduledQueryRulesAlertTriggerMetricTrigger"]]:
        """metric_trigger block."""
        result = self._values.get("metric_trigger")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesAlertTrigger(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesAlertTriggerMetricTrigger",
    jsii_struct_bases=[],
    name_mapping={
        "metric_column": "metricColumn",
        "metric_trigger_type": "metricTriggerType",
        "operator": "operator",
        "threshold": "threshold",
    },
)
class MonitorScheduledQueryRulesAlertTriggerMetricTrigger:
    def __init__(
        self,
        *,
        metric_column: builtins.str,
        metric_trigger_type: builtins.str,
        operator: builtins.str,
        threshold: jsii.Number,
    ) -> None:
        """
        :param metric_column: -
        :param metric_trigger_type: -
        :param operator: -
        :param threshold: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "metric_column": metric_column,
            "metric_trigger_type": metric_trigger_type,
            "operator": operator,
            "threshold": threshold,
        }

    @builtins.property
    def metric_column(self) -> builtins.str:
        result = self._values.get("metric_column")
        assert result is not None, "Required property 'metric_column' is missing"
        return result

    @builtins.property
    def metric_trigger_type(self) -> builtins.str:
        result = self._values.get("metric_trigger_type")
        assert result is not None, "Required property 'metric_trigger_type' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def threshold(self) -> jsii.Number:
        result = self._values.get("threshold")
        assert result is not None, "Required property 'threshold' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesAlertTriggerMetricTrigger(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorScheduledQueryRulesLog(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorScheduledQueryRulesLog",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        criteria: typing.List["MonitorScheduledQueryRulesLogCriteria"],
        data_source_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        authorized_resource_ids: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorScheduledQueryRulesLogTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param criteria: criteria block.
        :param data_source_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param authorized_resource_ids: -
        :param description: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorScheduledQueryRulesLogConfig(
            criteria=criteria,
            data_source_id=data_source_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            authorized_resource_ids=authorized_resource_ids,
            description=description,
            enabled=enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorScheduledQueryRulesLog, self, [scope, id, config])

    @jsii.member(jsii_name="resetAuthorizedResourceIds")
    def reset_authorized_resource_ids(self) -> None:
        return jsii.invoke(self, "resetAuthorizedResourceIds", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="criteriaInput")
    def criteria_input(self) -> typing.List["MonitorScheduledQueryRulesLogCriteria"]:
        return jsii.get(self, "criteriaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceIdInput")
    def data_source_id_input(self) -> builtins.str:
        return jsii.get(self, "dataSourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizedResourceIdsInput")
    def authorized_resource_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "authorizedResourceIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MonitorScheduledQueryRulesLogTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizedResourceIds")
    def authorized_resource_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "authorizedResourceIds")

    @authorized_resource_ids.setter # type: ignore
    def authorized_resource_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "authorizedResourceIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="criteria")
    def criteria(self) -> typing.List["MonitorScheduledQueryRulesLogCriteria"]:
        return jsii.get(self, "criteria")

    @criteria.setter # type: ignore
    def criteria(
        self,
        value: typing.List["MonitorScheduledQueryRulesLogCriteria"],
    ) -> None:
        jsii.set(self, "criteria", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataSourceId")
    def data_source_id(self) -> builtins.str:
        return jsii.get(self, "dataSourceId")

    @data_source_id.setter # type: ignore
    def data_source_id(self, value: builtins.str) -> None:
        jsii.set(self, "dataSourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorScheduledQueryRulesLogTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorScheduledQueryRulesLogTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesLogConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "criteria": "criteria",
        "data_source_id": "dataSourceId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "authorized_resource_ids": "authorizedResourceIds",
        "description": "description",
        "enabled": "enabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MonitorScheduledQueryRulesLogConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        criteria: typing.List["MonitorScheduledQueryRulesLogCriteria"],
        data_source_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        authorized_resource_ids: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MonitorScheduledQueryRulesLogTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param criteria: criteria block.
        :param data_source_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param authorized_resource_ids: -
        :param description: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorScheduledQueryRulesLogTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "criteria": criteria,
            "data_source_id": data_source_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if authorized_resource_ids is not None:
            self._values["authorized_resource_ids"] = authorized_resource_ids
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def criteria(self) -> typing.List["MonitorScheduledQueryRulesLogCriteria"]:
        """criteria block."""
        result = self._values.get("criteria")
        assert result is not None, "Required property 'criteria' is missing"
        return result

    @builtins.property
    def data_source_id(self) -> builtins.str:
        result = self._values.get("data_source_id")
        assert result is not None, "Required property 'data_source_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def authorized_resource_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("authorized_resource_ids")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorScheduledQueryRulesLogTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesLogConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesLogCriteria",
    jsii_struct_bases=[],
    name_mapping={"dimension": "dimension", "metric_name": "metricName"},
)
class MonitorScheduledQueryRulesLogCriteria:
    def __init__(
        self,
        *,
        dimension: typing.List["MonitorScheduledQueryRulesLogCriteriaDimension"],
        metric_name: builtins.str,
    ) -> None:
        """
        :param dimension: dimension block.
        :param metric_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "dimension": dimension,
            "metric_name": metric_name,
        }

    @builtins.property
    def dimension(
        self,
    ) -> typing.List["MonitorScheduledQueryRulesLogCriteriaDimension"]:
        """dimension block."""
        result = self._values.get("dimension")
        assert result is not None, "Required property 'dimension' is missing"
        return result

    @builtins.property
    def metric_name(self) -> builtins.str:
        result = self._values.get("metric_name")
        assert result is not None, "Required property 'metric_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesLogCriteria(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesLogCriteriaDimension",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "values": "values", "operator": "operator"},
)
class MonitorScheduledQueryRulesLogCriteriaDimension:
    def __init__(
        self,
        *,
        name: builtins.str,
        values: typing.List[builtins.str],
        operator: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param values: -
        :param operator: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "values": values,
        }
        if operator is not None:
            self._values["operator"] = operator

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def values(self) -> typing.List[builtins.str]:
        result = self._values.get("values")
        assert result is not None, "Required property 'values' is missing"
        return result

    @builtins.property
    def operator(self) -> typing.Optional[builtins.str]:
        result = self._values.get("operator")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesLogCriteriaDimension(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorScheduledQueryRulesLogTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorScheduledQueryRulesLogTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorScheduledQueryRulesLogTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MonitorSmartDetectorAlertRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MonitorSmartDetectorAlertRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        action_group: typing.List["MonitorSmartDetectorAlertRuleActionGroup"],
        detector_type: builtins.str,
        frequency: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scope_resource_ids: typing.List[builtins.str],
        severity: builtins.str,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        throttling_duration: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorSmartDetectorAlertRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param action_group: action_group block.
        :param detector_type: -
        :param frequency: -
        :param name: -
        :param resource_group_name: -
        :param scope_resource_ids: -
        :param severity: -
        :param description: -
        :param enabled: -
        :param throttling_duration: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitorSmartDetectorAlertRuleConfig(
            action_group=action_group,
            detector_type=detector_type,
            frequency=frequency,
            name=name,
            resource_group_name=resource_group_name,
            scope_resource_ids=scope_resource_ids,
            severity=severity,
            description=description,
            enabled=enabled,
            throttling_duration=throttling_duration,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MonitorSmartDetectorAlertRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetThrottlingDuration")
    def reset_throttling_duration(self) -> None:
        return jsii.invoke(self, "resetThrottlingDuration", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionGroupInput")
    def action_group_input(
        self,
    ) -> typing.List["MonitorSmartDetectorAlertRuleActionGroup"]:
        return jsii.get(self, "actionGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="detectorTypeInput")
    def detector_type_input(self) -> builtins.str:
        return jsii.get(self, "detectorTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequencyInput")
    def frequency_input(self) -> builtins.str:
        return jsii.get(self, "frequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeResourceIdsInput")
    def scope_resource_ids_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopeResourceIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severityInput")
    def severity_input(self) -> builtins.str:
        return jsii.get(self, "severityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throttlingDurationInput")
    def throttling_duration_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "throttlingDurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MonitorSmartDetectorAlertRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionGroup")
    def action_group(self) -> typing.List["MonitorSmartDetectorAlertRuleActionGroup"]:
        return jsii.get(self, "actionGroup")

    @action_group.setter # type: ignore
    def action_group(
        self,
        value: typing.List["MonitorSmartDetectorAlertRuleActionGroup"],
    ) -> None:
        jsii.set(self, "actionGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="detectorType")
    def detector_type(self) -> builtins.str:
        return jsii.get(self, "detectorType")

    @detector_type.setter # type: ignore
    def detector_type(self, value: builtins.str) -> None:
        jsii.set(self, "detectorType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="frequency")
    def frequency(self) -> builtins.str:
        return jsii.get(self, "frequency")

    @frequency.setter # type: ignore
    def frequency(self, value: builtins.str) -> None:
        jsii.set(self, "frequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeResourceIds")
    def scope_resource_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopeResourceIds")

    @scope_resource_ids.setter # type: ignore
    def scope_resource_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "scopeResourceIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severity")
    def severity(self) -> builtins.str:
        return jsii.get(self, "severity")

    @severity.setter # type: ignore
    def severity(self, value: builtins.str) -> None:
        jsii.set(self, "severity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="throttlingDuration")
    def throttling_duration(self) -> builtins.str:
        return jsii.get(self, "throttlingDuration")

    @throttling_duration.setter # type: ignore
    def throttling_duration(self, value: builtins.str) -> None:
        jsii.set(self, "throttlingDuration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MonitorSmartDetectorAlertRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MonitorSmartDetectorAlertRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MonitorSmartDetectorAlertRuleActionGroup",
    jsii_struct_bases=[],
    name_mapping={
        "ids": "ids",
        "email_subject": "emailSubject",
        "webhook_payload": "webhookPayload",
    },
)
class MonitorSmartDetectorAlertRuleActionGroup:
    def __init__(
        self,
        *,
        ids: typing.List[builtins.str],
        email_subject: typing.Optional[builtins.str] = None,
        webhook_payload: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param ids: -
        :param email_subject: -
        :param webhook_payload: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "ids": ids,
        }
        if email_subject is not None:
            self._values["email_subject"] = email_subject
        if webhook_payload is not None:
            self._values["webhook_payload"] = webhook_payload

    @builtins.property
    def ids(self) -> typing.List[builtins.str]:
        result = self._values.get("ids")
        assert result is not None, "Required property 'ids' is missing"
        return result

    @builtins.property
    def email_subject(self) -> typing.Optional[builtins.str]:
        result = self._values.get("email_subject")
        return result

    @builtins.property
    def webhook_payload(self) -> typing.Optional[builtins.str]:
        result = self._values.get("webhook_payload")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorSmartDetectorAlertRuleActionGroup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorSmartDetectorAlertRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "action_group": "actionGroup",
        "detector_type": "detectorType",
        "frequency": "frequency",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "scope_resource_ids": "scopeResourceIds",
        "severity": "severity",
        "description": "description",
        "enabled": "enabled",
        "throttling_duration": "throttlingDuration",
        "timeouts": "timeouts",
    },
)
class MonitorSmartDetectorAlertRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        action_group: typing.List[MonitorSmartDetectorAlertRuleActionGroup],
        detector_type: builtins.str,
        frequency: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scope_resource_ids: typing.List[builtins.str],
        severity: builtins.str,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        throttling_duration: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MonitorSmartDetectorAlertRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action_group: action_group block.
        :param detector_type: -
        :param frequency: -
        :param name: -
        :param resource_group_name: -
        :param scope_resource_ids: -
        :param severity: -
        :param description: -
        :param enabled: -
        :param throttling_duration: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MonitorSmartDetectorAlertRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "action_group": action_group,
            "detector_type": detector_type,
            "frequency": frequency,
            "name": name,
            "resource_group_name": resource_group_name,
            "scope_resource_ids": scope_resource_ids,
            "severity": severity,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if throttling_duration is not None:
            self._values["throttling_duration"] = throttling_duration
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def action_group(self) -> typing.List[MonitorSmartDetectorAlertRuleActionGroup]:
        """action_group block."""
        result = self._values.get("action_group")
        assert result is not None, "Required property 'action_group' is missing"
        return result

    @builtins.property
    def detector_type(self) -> builtins.str:
        result = self._values.get("detector_type")
        assert result is not None, "Required property 'detector_type' is missing"
        return result

    @builtins.property
    def frequency(self) -> builtins.str:
        result = self._values.get("frequency")
        assert result is not None, "Required property 'frequency' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def scope_resource_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("scope_resource_ids")
        assert result is not None, "Required property 'scope_resource_ids' is missing"
        return result

    @builtins.property
    def severity(self) -> builtins.str:
        result = self._values.get("severity")
        assert result is not None, "Required property 'severity' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def throttling_duration(self) -> typing.Optional[builtins.str]:
        result = self._values.get("throttling_duration")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitorSmartDetectorAlertRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorSmartDetectorAlertRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MonitorSmartDetectorAlertRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MonitorSmartDetectorAlertRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MonitorSmartDetectorAlertRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        server_id: builtins.str,
        auto_pause_delay_in_minutes: typing.Optional[jsii.Number] = None,
        collation: typing.Optional[builtins.str] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_database_id: typing.Optional[builtins.str] = None,
        elastic_pool_id: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["MssqlDatabaseExtendedAuditingPolicy"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        long_term_retention_policy: typing.Optional[typing.List["MssqlDatabaseLongTermRetentionPolicy"]] = None,
        max_size_gb: typing.Optional[jsii.Number] = None,
        min_capacity: typing.Optional[jsii.Number] = None,
        read_replica_count: typing.Optional[jsii.Number] = None,
        read_scale: typing.Optional[builtins.bool] = None,
        recover_database_id: typing.Optional[builtins.str] = None,
        restore_dropped_database_id: typing.Optional[builtins.str] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        sample_name: typing.Optional[builtins.str] = None,
        short_term_retention_policy: typing.Optional[typing.List["MssqlDatabaseShortTermRetentionPolicy"]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["MssqlDatabaseThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["MssqlDatabaseTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param server_id: -
        :param auto_pause_delay_in_minutes: -
        :param collation: -
        :param create_mode: -
        :param creation_source_database_id: -
        :param elastic_pool_id: -
        :param extended_auditing_policy: -
        :param license_type: -
        :param long_term_retention_policy: long_term_retention_policy block.
        :param max_size_gb: -
        :param min_capacity: -
        :param read_replica_count: -
        :param read_scale: -
        :param recover_database_id: -
        :param restore_dropped_database_id: -
        :param restore_point_in_time: -
        :param sample_name: -
        :param short_term_retention_policy: short_term_retention_policy block.
        :param sku_name: -
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        :param zone_redundant: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlDatabaseConfig(
            name=name,
            server_id=server_id,
            auto_pause_delay_in_minutes=auto_pause_delay_in_minutes,
            collation=collation,
            create_mode=create_mode,
            creation_source_database_id=creation_source_database_id,
            elastic_pool_id=elastic_pool_id,
            extended_auditing_policy=extended_auditing_policy,
            license_type=license_type,
            long_term_retention_policy=long_term_retention_policy,
            max_size_gb=max_size_gb,
            min_capacity=min_capacity,
            read_replica_count=read_replica_count,
            read_scale=read_scale,
            recover_database_id=recover_database_id,
            restore_dropped_database_id=restore_dropped_database_id,
            restore_point_in_time=restore_point_in_time,
            sample_name=sample_name,
            short_term_retention_policy=short_term_retention_policy,
            sku_name=sku_name,
            tags=tags,
            threat_detection_policy=threat_detection_policy,
            timeouts=timeouts,
            zone_redundant=zone_redundant,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoPauseDelayInMinutes")
    def reset_auto_pause_delay_in_minutes(self) -> None:
        return jsii.invoke(self, "resetAutoPauseDelayInMinutes", [])

    @jsii.member(jsii_name="resetCollation")
    def reset_collation(self) -> None:
        return jsii.invoke(self, "resetCollation", [])

    @jsii.member(jsii_name="resetCreateMode")
    def reset_create_mode(self) -> None:
        return jsii.invoke(self, "resetCreateMode", [])

    @jsii.member(jsii_name="resetCreationSourceDatabaseId")
    def reset_creation_source_database_id(self) -> None:
        return jsii.invoke(self, "resetCreationSourceDatabaseId", [])

    @jsii.member(jsii_name="resetElasticPoolId")
    def reset_elastic_pool_id(self) -> None:
        return jsii.invoke(self, "resetElasticPoolId", [])

    @jsii.member(jsii_name="resetExtendedAuditingPolicy")
    def reset_extended_auditing_policy(self) -> None:
        return jsii.invoke(self, "resetExtendedAuditingPolicy", [])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetLongTermRetentionPolicy")
    def reset_long_term_retention_policy(self) -> None:
        return jsii.invoke(self, "resetLongTermRetentionPolicy", [])

    @jsii.member(jsii_name="resetMaxSizeGb")
    def reset_max_size_gb(self) -> None:
        return jsii.invoke(self, "resetMaxSizeGb", [])

    @jsii.member(jsii_name="resetMinCapacity")
    def reset_min_capacity(self) -> None:
        return jsii.invoke(self, "resetMinCapacity", [])

    @jsii.member(jsii_name="resetReadReplicaCount")
    def reset_read_replica_count(self) -> None:
        return jsii.invoke(self, "resetReadReplicaCount", [])

    @jsii.member(jsii_name="resetReadScale")
    def reset_read_scale(self) -> None:
        return jsii.invoke(self, "resetReadScale", [])

    @jsii.member(jsii_name="resetRecoverDatabaseId")
    def reset_recover_database_id(self) -> None:
        return jsii.invoke(self, "resetRecoverDatabaseId", [])

    @jsii.member(jsii_name="resetRestoreDroppedDatabaseId")
    def reset_restore_dropped_database_id(self) -> None:
        return jsii.invoke(self, "resetRestoreDroppedDatabaseId", [])

    @jsii.member(jsii_name="resetRestorePointInTime")
    def reset_restore_point_in_time(self) -> None:
        return jsii.invoke(self, "resetRestorePointInTime", [])

    @jsii.member(jsii_name="resetSampleName")
    def reset_sample_name(self) -> None:
        return jsii.invoke(self, "resetSampleName", [])

    @jsii.member(jsii_name="resetShortTermRetentionPolicy")
    def reset_short_term_retention_policy(self) -> None:
        return jsii.invoke(self, "resetShortTermRetentionPolicy", [])

    @jsii.member(jsii_name="resetSkuName")
    def reset_sku_name(self) -> None:
        return jsii.invoke(self, "resetSkuName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetThreatDetectionPolicy")
    def reset_threat_detection_policy(self) -> None:
        return jsii.invoke(self, "resetThreatDetectionPolicy", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZoneRedundant")
    def reset_zone_redundant(self) -> None:
        return jsii.invoke(self, "resetZoneRedundant", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverIdInput")
    def server_id_input(self) -> builtins.str:
        return jsii.get(self, "serverIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoPauseDelayInMinutesInput")
    def auto_pause_delay_in_minutes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "autoPauseDelayInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collationInput")
    def collation_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "collationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createModeInput")
    def create_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceDatabaseIdInput")
    def creation_source_database_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "creationSourceDatabaseIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="elasticPoolIdInput")
    def elastic_pool_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "elasticPoolIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicyInput")
    def extended_auditing_policy_input(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseExtendedAuditingPolicy"]]:
        return jsii.get(self, "extendedAuditingPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="longTermRetentionPolicyInput")
    def long_term_retention_policy_input(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseLongTermRetentionPolicy"]]:
        return jsii.get(self, "longTermRetentionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGbInput")
    def max_size_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxSizeGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minCapacityInput")
    def min_capacity_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "minCapacityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readReplicaCountInput")
    def read_replica_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "readReplicaCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readScaleInput")
    def read_scale_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "readScaleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoverDatabaseIdInput")
    def recover_database_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "recoverDatabaseIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restoreDroppedDatabaseIdInput")
    def restore_dropped_database_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "restoreDroppedDatabaseIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTimeInput")
    def restore_point_in_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "restorePointInTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sampleNameInput")
    def sample_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sampleNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shortTermRetentionPolicyInput")
    def short_term_retention_policy_input(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseShortTermRetentionPolicy"]]:
        return jsii.get(self, "shortTermRetentionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicyInput")
    def threat_detection_policy_input(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseThreatDetectionPolicy"]]:
        return jsii.get(self, "threatDetectionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MssqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundantInput")
    def zone_redundant_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneRedundantInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoPauseDelayInMinutes")
    def auto_pause_delay_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "autoPauseDelayInMinutes")

    @auto_pause_delay_in_minutes.setter # type: ignore
    def auto_pause_delay_in_minutes(self, value: jsii.Number) -> None:
        jsii.set(self, "autoPauseDelayInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @collation.setter # type: ignore
    def collation(self, value: builtins.str) -> None:
        jsii.set(self, "collation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createMode")
    def create_mode(self) -> builtins.str:
        return jsii.get(self, "createMode")

    @create_mode.setter # type: ignore
    def create_mode(self, value: builtins.str) -> None:
        jsii.set(self, "createMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceDatabaseId")
    def creation_source_database_id(self) -> builtins.str:
        return jsii.get(self, "creationSourceDatabaseId")

    @creation_source_database_id.setter # type: ignore
    def creation_source_database_id(self, value: builtins.str) -> None:
        jsii.set(self, "creationSourceDatabaseId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="elasticPoolId")
    def elastic_pool_id(self) -> builtins.str:
        return jsii.get(self, "elasticPoolId")

    @elastic_pool_id.setter # type: ignore
    def elastic_pool_id(self, value: builtins.str) -> None:
        jsii.set(self, "elasticPoolId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicy")
    def extended_auditing_policy(
        self,
    ) -> typing.List["MssqlDatabaseExtendedAuditingPolicy"]:
        return jsii.get(self, "extendedAuditingPolicy")

    @extended_auditing_policy.setter # type: ignore
    def extended_auditing_policy(
        self,
        value: typing.List["MssqlDatabaseExtendedAuditingPolicy"],
    ) -> None:
        jsii.set(self, "extendedAuditingPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="longTermRetentionPolicy")
    def long_term_retention_policy(
        self,
    ) -> typing.List["MssqlDatabaseLongTermRetentionPolicy"]:
        return jsii.get(self, "longTermRetentionPolicy")

    @long_term_retention_policy.setter # type: ignore
    def long_term_retention_policy(
        self,
        value: typing.List["MssqlDatabaseLongTermRetentionPolicy"],
    ) -> None:
        jsii.set(self, "longTermRetentionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGb")
    def max_size_gb(self) -> jsii.Number:
        return jsii.get(self, "maxSizeGb")

    @max_size_gb.setter # type: ignore
    def max_size_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "maxSizeGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minCapacity")
    def min_capacity(self) -> jsii.Number:
        return jsii.get(self, "minCapacity")

    @min_capacity.setter # type: ignore
    def min_capacity(self, value: jsii.Number) -> None:
        jsii.set(self, "minCapacity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readReplicaCount")
    def read_replica_count(self) -> jsii.Number:
        return jsii.get(self, "readReplicaCount")

    @read_replica_count.setter # type: ignore
    def read_replica_count(self, value: jsii.Number) -> None:
        jsii.set(self, "readReplicaCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readScale")
    def read_scale(self) -> builtins.bool:
        return jsii.get(self, "readScale")

    @read_scale.setter # type: ignore
    def read_scale(self, value: builtins.bool) -> None:
        jsii.set(self, "readScale", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoverDatabaseId")
    def recover_database_id(self) -> builtins.str:
        return jsii.get(self, "recoverDatabaseId")

    @recover_database_id.setter # type: ignore
    def recover_database_id(self, value: builtins.str) -> None:
        jsii.set(self, "recoverDatabaseId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restoreDroppedDatabaseId")
    def restore_dropped_database_id(self) -> builtins.str:
        return jsii.get(self, "restoreDroppedDatabaseId")

    @restore_dropped_database_id.setter # type: ignore
    def restore_dropped_database_id(self, value: builtins.str) -> None:
        jsii.set(self, "restoreDroppedDatabaseId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTime")
    def restore_point_in_time(self) -> builtins.str:
        return jsii.get(self, "restorePointInTime")

    @restore_point_in_time.setter # type: ignore
    def restore_point_in_time(self, value: builtins.str) -> None:
        jsii.set(self, "restorePointInTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sampleName")
    def sample_name(self) -> builtins.str:
        return jsii.get(self, "sampleName")

    @sample_name.setter # type: ignore
    def sample_name(self, value: builtins.str) -> None:
        jsii.set(self, "sampleName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverId")
    def server_id(self) -> builtins.str:
        return jsii.get(self, "serverId")

    @server_id.setter # type: ignore
    def server_id(self, value: builtins.str) -> None:
        jsii.set(self, "serverId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shortTermRetentionPolicy")
    def short_term_retention_policy(
        self,
    ) -> typing.List["MssqlDatabaseShortTermRetentionPolicy"]:
        return jsii.get(self, "shortTermRetentionPolicy")

    @short_term_retention_policy.setter # type: ignore
    def short_term_retention_policy(
        self,
        value: typing.List["MssqlDatabaseShortTermRetentionPolicy"],
    ) -> None:
        jsii.set(self, "shortTermRetentionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicy")
    def threat_detection_policy(
        self,
    ) -> typing.List["MssqlDatabaseThreatDetectionPolicy"]:
        return jsii.get(self, "threatDetectionPolicy")

    @threat_detection_policy.setter # type: ignore
    def threat_detection_policy(
        self,
        value: typing.List["MssqlDatabaseThreatDetectionPolicy"],
    ) -> None:
        jsii.set(self, "threatDetectionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @zone_redundant.setter # type: ignore
    def zone_redundant(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneRedundant", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "server_id": "serverId",
        "auto_pause_delay_in_minutes": "autoPauseDelayInMinutes",
        "collation": "collation",
        "create_mode": "createMode",
        "creation_source_database_id": "creationSourceDatabaseId",
        "elastic_pool_id": "elasticPoolId",
        "extended_auditing_policy": "extendedAuditingPolicy",
        "license_type": "licenseType",
        "long_term_retention_policy": "longTermRetentionPolicy",
        "max_size_gb": "maxSizeGb",
        "min_capacity": "minCapacity",
        "read_replica_count": "readReplicaCount",
        "read_scale": "readScale",
        "recover_database_id": "recoverDatabaseId",
        "restore_dropped_database_id": "restoreDroppedDatabaseId",
        "restore_point_in_time": "restorePointInTime",
        "sample_name": "sampleName",
        "short_term_retention_policy": "shortTermRetentionPolicy",
        "sku_name": "skuName",
        "tags": "tags",
        "threat_detection_policy": "threatDetectionPolicy",
        "timeouts": "timeouts",
        "zone_redundant": "zoneRedundant",
    },
)
class MssqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        server_id: builtins.str,
        auto_pause_delay_in_minutes: typing.Optional[jsii.Number] = None,
        collation: typing.Optional[builtins.str] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_database_id: typing.Optional[builtins.str] = None,
        elastic_pool_id: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["MssqlDatabaseExtendedAuditingPolicy"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        long_term_retention_policy: typing.Optional[typing.List["MssqlDatabaseLongTermRetentionPolicy"]] = None,
        max_size_gb: typing.Optional[jsii.Number] = None,
        min_capacity: typing.Optional[jsii.Number] = None,
        read_replica_count: typing.Optional[jsii.Number] = None,
        read_scale: typing.Optional[builtins.bool] = None,
        recover_database_id: typing.Optional[builtins.str] = None,
        restore_dropped_database_id: typing.Optional[builtins.str] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        sample_name: typing.Optional[builtins.str] = None,
        short_term_retention_policy: typing.Optional[typing.List["MssqlDatabaseShortTermRetentionPolicy"]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["MssqlDatabaseThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["MssqlDatabaseTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param server_id: -
        :param auto_pause_delay_in_minutes: -
        :param collation: -
        :param create_mode: -
        :param creation_source_database_id: -
        :param elastic_pool_id: -
        :param extended_auditing_policy: -
        :param license_type: -
        :param long_term_retention_policy: long_term_retention_policy block.
        :param max_size_gb: -
        :param min_capacity: -
        :param read_replica_count: -
        :param read_scale: -
        :param recover_database_id: -
        :param restore_dropped_database_id: -
        :param restore_point_in_time: -
        :param sample_name: -
        :param short_term_retention_policy: short_term_retention_policy block.
        :param sku_name: -
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        :param zone_redundant: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "server_id": server_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_pause_delay_in_minutes is not None:
            self._values["auto_pause_delay_in_minutes"] = auto_pause_delay_in_minutes
        if collation is not None:
            self._values["collation"] = collation
        if create_mode is not None:
            self._values["create_mode"] = create_mode
        if creation_source_database_id is not None:
            self._values["creation_source_database_id"] = creation_source_database_id
        if elastic_pool_id is not None:
            self._values["elastic_pool_id"] = elastic_pool_id
        if extended_auditing_policy is not None:
            self._values["extended_auditing_policy"] = extended_auditing_policy
        if license_type is not None:
            self._values["license_type"] = license_type
        if long_term_retention_policy is not None:
            self._values["long_term_retention_policy"] = long_term_retention_policy
        if max_size_gb is not None:
            self._values["max_size_gb"] = max_size_gb
        if min_capacity is not None:
            self._values["min_capacity"] = min_capacity
        if read_replica_count is not None:
            self._values["read_replica_count"] = read_replica_count
        if read_scale is not None:
            self._values["read_scale"] = read_scale
        if recover_database_id is not None:
            self._values["recover_database_id"] = recover_database_id
        if restore_dropped_database_id is not None:
            self._values["restore_dropped_database_id"] = restore_dropped_database_id
        if restore_point_in_time is not None:
            self._values["restore_point_in_time"] = restore_point_in_time
        if sample_name is not None:
            self._values["sample_name"] = sample_name
        if short_term_retention_policy is not None:
            self._values["short_term_retention_policy"] = short_term_retention_policy
        if sku_name is not None:
            self._values["sku_name"] = sku_name
        if tags is not None:
            self._values["tags"] = tags
        if threat_detection_policy is not None:
            self._values["threat_detection_policy"] = threat_detection_policy
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zone_redundant is not None:
            self._values["zone_redundant"] = zone_redundant

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def server_id(self) -> builtins.str:
        result = self._values.get("server_id")
        assert result is not None, "Required property 'server_id' is missing"
        return result

    @builtins.property
    def auto_pause_delay_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("auto_pause_delay_in_minutes")
        return result

    @builtins.property
    def collation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("collation")
        return result

    @builtins.property
    def create_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_mode")
        return result

    @builtins.property
    def creation_source_database_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("creation_source_database_id")
        return result

    @builtins.property
    def elastic_pool_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("elastic_pool_id")
        return result

    @builtins.property
    def extended_auditing_policy(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseExtendedAuditingPolicy"]]:
        result = self._values.get("extended_auditing_policy")
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def long_term_retention_policy(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseLongTermRetentionPolicy"]]:
        """long_term_retention_policy block."""
        result = self._values.get("long_term_retention_policy")
        return result

    @builtins.property
    def max_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_size_gb")
        return result

    @builtins.property
    def min_capacity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_capacity")
        return result

    @builtins.property
    def read_replica_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("read_replica_count")
        return result

    @builtins.property
    def read_scale(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("read_scale")
        return result

    @builtins.property
    def recover_database_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("recover_database_id")
        return result

    @builtins.property
    def restore_dropped_database_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("restore_dropped_database_id")
        return result

    @builtins.property
    def restore_point_in_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("restore_point_in_time")
        return result

    @builtins.property
    def sample_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sample_name")
        return result

    @builtins.property
    def short_term_retention_policy(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseShortTermRetentionPolicy"]]:
        """short_term_retention_policy block."""
        result = self._values.get("short_term_retention_policy")
        return result

    @builtins.property
    def sku_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def threat_detection_policy(
        self,
    ) -> typing.Optional[typing.List["MssqlDatabaseThreatDetectionPolicy"]]:
        """threat_detection_policy block."""
        result = self._values.get("threat_detection_policy")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MssqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zone_redundant(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_redundant")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseExtendedAuditingPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "retention_in_days": "retentionInDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_access_key_is_secondary": "storageAccountAccessKeyIsSecondary",
        "storage_endpoint": "storageEndpoint",
    },
)
class MssqlDatabaseExtendedAuditingPolicy:
    def __init__(
        self,
        *,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param storage_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_account_access_key_is_secondary is not None:
            self._values["storage_account_access_key_is_secondary"] = storage_account_access_key_is_secondary
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_account_access_key_is_secondary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("storage_account_access_key_is_secondary")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseExtendedAuditingPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlDatabaseExtendedAuditingPolicyA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlDatabaseExtendedAuditingPolicyA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        database_id: builtins.str,
        storage_endpoint: builtins.str,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["MssqlDatabaseExtendedAuditingPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param database_id: -
        :param storage_endpoint: -
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlDatabaseExtendedAuditingPolicyAConfig(
            database_id=database_id,
            storage_endpoint=storage_endpoint,
            retention_in_days=retention_in_days,
            storage_account_access_key=storage_account_access_key,
            storage_account_access_key_is_secondary=storage_account_access_key_is_secondary,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlDatabaseExtendedAuditingPolicyA, self, [scope, id, config])

    @jsii.member(jsii_name="resetRetentionInDays")
    def reset_retention_in_days(self) -> None:
        return jsii.invoke(self, "resetRetentionInDays", [])

    @jsii.member(jsii_name="resetStorageAccountAccessKey")
    def reset_storage_account_access_key(self) -> None:
        return jsii.invoke(self, "resetStorageAccountAccessKey", [])

    @jsii.member(jsii_name="resetStorageAccountAccessKeyIsSecondary")
    def reset_storage_account_access_key_is_secondary(self) -> None:
        return jsii.invoke(self, "resetStorageAccountAccessKeyIsSecondary", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseIdInput")
    def database_id_input(self) -> builtins.str:
        return jsii.get(self, "databaseIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageEndpointInput")
    def storage_endpoint_input(self) -> builtins.str:
        return jsii.get(self, "storageEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDaysInput")
    def retention_in_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionInDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyInput")
    def storage_account_access_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyIsSecondaryInput")
    def storage_account_access_key_is_secondary_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "storageAccountAccessKeyIsSecondaryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MssqlDatabaseExtendedAuditingPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseId")
    def database_id(self) -> builtins.str:
        return jsii.get(self, "databaseId")

    @database_id.setter # type: ignore
    def database_id(self, value: builtins.str) -> None:
        jsii.set(self, "databaseId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDays")
    def retention_in_days(self) -> jsii.Number:
        return jsii.get(self, "retentionInDays")

    @retention_in_days.setter # type: ignore
    def retention_in_days(self, value: jsii.Number) -> None:
        jsii.set(self, "retentionInDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKey")
    def storage_account_access_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKey")

    @storage_account_access_key.setter # type: ignore
    def storage_account_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyIsSecondary")
    def storage_account_access_key_is_secondary(self) -> builtins.bool:
        return jsii.get(self, "storageAccountAccessKeyIsSecondary")

    @storage_account_access_key_is_secondary.setter # type: ignore
    def storage_account_access_key_is_secondary(self, value: builtins.bool) -> None:
        jsii.set(self, "storageAccountAccessKeyIsSecondary", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageEndpoint")
    def storage_endpoint(self) -> builtins.str:
        return jsii.get(self, "storageEndpoint")

    @storage_endpoint.setter # type: ignore
    def storage_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "storageEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlDatabaseExtendedAuditingPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlDatabaseExtendedAuditingPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseExtendedAuditingPolicyAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "database_id": "databaseId",
        "storage_endpoint": "storageEndpoint",
        "retention_in_days": "retentionInDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_access_key_is_secondary": "storageAccountAccessKeyIsSecondary",
        "timeouts": "timeouts",
    },
)
class MssqlDatabaseExtendedAuditingPolicyAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        database_id: builtins.str,
        storage_endpoint: builtins.str,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["MssqlDatabaseExtendedAuditingPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param database_id: -
        :param storage_endpoint: -
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlDatabaseExtendedAuditingPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "database_id": database_id,
            "storage_endpoint": storage_endpoint,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_account_access_key_is_secondary is not None:
            self._values["storage_account_access_key_is_secondary"] = storage_account_access_key_is_secondary
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def database_id(self) -> builtins.str:
        result = self._values.get("database_id")
        assert result is not None, "Required property 'database_id' is missing"
        return result

    @builtins.property
    def storage_endpoint(self) -> builtins.str:
        result = self._values.get("storage_endpoint")
        assert result is not None, "Required property 'storage_endpoint' is missing"
        return result

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_account_access_key_is_secondary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("storage_account_access_key_is_secondary")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["MssqlDatabaseExtendedAuditingPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseExtendedAuditingPolicyAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseExtendedAuditingPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlDatabaseExtendedAuditingPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseExtendedAuditingPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseLongTermRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "monthly_retention": "monthlyRetention",
        "weekly_retention": "weeklyRetention",
        "week_of_year": "weekOfYear",
        "yearly_retention": "yearlyRetention",
    },
)
class MssqlDatabaseLongTermRetentionPolicy:
    def __init__(
        self,
        *,
        monthly_retention: typing.Optional[builtins.str] = None,
        weekly_retention: typing.Optional[builtins.str] = None,
        week_of_year: typing.Optional[jsii.Number] = None,
        yearly_retention: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param monthly_retention: -
        :param weekly_retention: -
        :param week_of_year: -
        :param yearly_retention: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if monthly_retention is not None:
            self._values["monthly_retention"] = monthly_retention
        if weekly_retention is not None:
            self._values["weekly_retention"] = weekly_retention
        if week_of_year is not None:
            self._values["week_of_year"] = week_of_year
        if yearly_retention is not None:
            self._values["yearly_retention"] = yearly_retention

    @builtins.property
    def monthly_retention(self) -> typing.Optional[builtins.str]:
        result = self._values.get("monthly_retention")
        return result

    @builtins.property
    def weekly_retention(self) -> typing.Optional[builtins.str]:
        result = self._values.get("weekly_retention")
        return result

    @builtins.property
    def week_of_year(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("week_of_year")
        return result

    @builtins.property
    def yearly_retention(self) -> typing.Optional[builtins.str]:
        result = self._values.get("yearly_retention")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseLongTermRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseShortTermRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={"retention_days": "retentionDays"},
)
class MssqlDatabaseShortTermRetentionPolicy:
    def __init__(self, *, retention_days: jsii.Number) -> None:
        """
        :param retention_days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "retention_days": retention_days,
        }

    @builtins.property
    def retention_days(self) -> jsii.Number:
        result = self._values.get("retention_days")
        assert result is not None, "Required property 'retention_days' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseShortTermRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseThreatDetectionPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "disabled_alerts": "disabledAlerts",
        "email_account_admins": "emailAccountAdmins",
        "email_addresses": "emailAddresses",
        "retention_days": "retentionDays",
        "state": "state",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_endpoint": "storageEndpoint",
        "use_server_default": "useServerDefault",
    },
)
class MssqlDatabaseThreatDetectionPolicy:
    def __init__(
        self,
        *,
        disabled_alerts: typing.Optional[typing.List[builtins.str]] = None,
        email_account_admins: typing.Optional[builtins.str] = None,
        email_addresses: typing.Optional[typing.List[builtins.str]] = None,
        retention_days: typing.Optional[jsii.Number] = None,
        state: typing.Optional[builtins.str] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
        use_server_default: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param disabled_alerts: -
        :param email_account_admins: -
        :param email_addresses: -
        :param retention_days: -
        :param state: -
        :param storage_account_access_key: -
        :param storage_endpoint: -
        :param use_server_default: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if disabled_alerts is not None:
            self._values["disabled_alerts"] = disabled_alerts
        if email_account_admins is not None:
            self._values["email_account_admins"] = email_account_admins
        if email_addresses is not None:
            self._values["email_addresses"] = email_addresses
        if retention_days is not None:
            self._values["retention_days"] = retention_days
        if state is not None:
            self._values["state"] = state
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint
        if use_server_default is not None:
            self._values["use_server_default"] = use_server_default

    @builtins.property
    def disabled_alerts(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("disabled_alerts")
        return result

    @builtins.property
    def email_account_admins(self) -> typing.Optional[builtins.str]:
        result = self._values.get("email_account_admins")
        return result

    @builtins.property
    def email_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("email_addresses")
        return result

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_days")
        return result

    @builtins.property
    def state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("state")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    @builtins.property
    def use_server_default(self) -> typing.Optional[builtins.str]:
        result = self._values.get("use_server_default")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseThreatDetectionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlDatabaseVulnerabilityAssessmentRuleBaseline(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlDatabaseVulnerabilityAssessmentRuleBaseline",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        baseline_result: typing.List["MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult"],
        database_name: builtins.str,
        rule_id: builtins.str,
        server_vulnerability_assessment_id: builtins.str,
        baseline_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param baseline_result: baseline_result block.
        :param database_name: -
        :param rule_id: -
        :param server_vulnerability_assessment_id: -
        :param baseline_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlDatabaseVulnerabilityAssessmentRuleBaselineConfig(
            baseline_result=baseline_result,
            database_name=database_name,
            rule_id=rule_id,
            server_vulnerability_assessment_id=server_vulnerability_assessment_id,
            baseline_name=baseline_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlDatabaseVulnerabilityAssessmentRuleBaseline, self, [scope, id, config])

    @jsii.member(jsii_name="resetBaselineName")
    def reset_baseline_name(self) -> None:
        return jsii.invoke(self, "resetBaselineName", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="baselineResultInput")
    def baseline_result_input(
        self,
    ) -> typing.List["MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult"]:
        return jsii.get(self, "baselineResultInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseNameInput")
    def database_name_input(self) -> builtins.str:
        return jsii.get(self, "databaseNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleIdInput")
    def rule_id_input(self) -> builtins.str:
        return jsii.get(self, "ruleIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverVulnerabilityAssessmentIdInput")
    def server_vulnerability_assessment_id_input(self) -> builtins.str:
        return jsii.get(self, "serverVulnerabilityAssessmentIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="baselineNameInput")
    def baseline_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "baselineNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="baselineName")
    def baseline_name(self) -> builtins.str:
        return jsii.get(self, "baselineName")

    @baseline_name.setter # type: ignore
    def baseline_name(self, value: builtins.str) -> None:
        jsii.set(self, "baselineName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="baselineResult")
    def baseline_result(
        self,
    ) -> typing.List["MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult"]:
        return jsii.get(self, "baselineResult")

    @baseline_result.setter # type: ignore
    def baseline_result(
        self,
        value: typing.List["MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult"],
    ) -> None:
        jsii.set(self, "baselineResult", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseName")
    def database_name(self) -> builtins.str:
        return jsii.get(self, "databaseName")

    @database_name.setter # type: ignore
    def database_name(self, value: builtins.str) -> None:
        jsii.set(self, "databaseName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleId")
    def rule_id(self) -> builtins.str:
        return jsii.get(self, "ruleId")

    @rule_id.setter # type: ignore
    def rule_id(self, value: builtins.str) -> None:
        jsii.set(self, "ruleId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverVulnerabilityAssessmentId")
    def server_vulnerability_assessment_id(self) -> builtins.str:
        return jsii.get(self, "serverVulnerabilityAssessmentId")

    @server_vulnerability_assessment_id.setter # type: ignore
    def server_vulnerability_assessment_id(self, value: builtins.str) -> None:
        jsii.set(self, "serverVulnerabilityAssessmentId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult",
    jsii_struct_bases=[],
    name_mapping={"result": "result"},
)
class MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult:
    def __init__(self, *, result: typing.List[builtins.str]) -> None:
        """
        :param result: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "result": result,
        }

    @builtins.property
    def result(self) -> typing.List[builtins.str]:
        result = self._values.get("result")
        assert result is not None, "Required property 'result' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseVulnerabilityAssessmentRuleBaselineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "baseline_result": "baselineResult",
        "database_name": "databaseName",
        "rule_id": "ruleId",
        "server_vulnerability_assessment_id": "serverVulnerabilityAssessmentId",
        "baseline_name": "baselineName",
        "timeouts": "timeouts",
    },
)
class MssqlDatabaseVulnerabilityAssessmentRuleBaselineConfig(
    cdktf.TerraformMetaArguments,
):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        baseline_result: typing.List[MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult],
        database_name: builtins.str,
        rule_id: builtins.str,
        server_vulnerability_assessment_id: builtins.str,
        baseline_name: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param baseline_result: baseline_result block.
        :param database_name: -
        :param rule_id: -
        :param server_vulnerability_assessment_id: -
        :param baseline_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "baseline_result": baseline_result,
            "database_name": database_name,
            "rule_id": rule_id,
            "server_vulnerability_assessment_id": server_vulnerability_assessment_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if baseline_name is not None:
            self._values["baseline_name"] = baseline_name
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def baseline_result(
        self,
    ) -> typing.List[MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult]:
        """baseline_result block."""
        result = self._values.get("baseline_result")
        assert result is not None, "Required property 'baseline_result' is missing"
        return result

    @builtins.property
    def database_name(self) -> builtins.str:
        result = self._values.get("database_name")
        assert result is not None, "Required property 'database_name' is missing"
        return result

    @builtins.property
    def rule_id(self) -> builtins.str:
        result = self._values.get("rule_id")
        assert result is not None, "Required property 'rule_id' is missing"
        return result

    @builtins.property
    def server_vulnerability_assessment_id(self) -> builtins.str:
        result = self._values.get("server_vulnerability_assessment_id")
        assert result is not None, "Required property 'server_vulnerability_assessment_id' is missing"
        return result

    @builtins.property
    def baseline_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("baseline_name")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseVulnerabilityAssessmentRuleBaselineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlElasticpool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlElasticpool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        per_database_settings: typing.List["MssqlElasticpoolPerDatabaseSettings"],
        resource_group_name: builtins.str,
        server_name: builtins.str,
        sku: typing.List["MssqlElasticpoolSku"],
        license_type: typing.Optional[builtins.str] = None,
        max_size_bytes: typing.Optional[jsii.Number] = None,
        max_size_gb: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MssqlElasticpoolTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param per_database_settings: per_database_settings block.
        :param resource_group_name: -
        :param server_name: -
        :param sku: sku block.
        :param license_type: -
        :param max_size_bytes: -
        :param max_size_gb: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_redundant: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlElasticpoolConfig(
            location=location,
            name=name,
            per_database_settings=per_database_settings,
            resource_group_name=resource_group_name,
            server_name=server_name,
            sku=sku,
            license_type=license_type,
            max_size_bytes=max_size_bytes,
            max_size_gb=max_size_gb,
            tags=tags,
            timeouts=timeouts,
            zone_redundant=zone_redundant,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlElasticpool, self, [scope, id, config])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetMaxSizeBytes")
    def reset_max_size_bytes(self) -> None:
        return jsii.invoke(self, "resetMaxSizeBytes", [])

    @jsii.member(jsii_name="resetMaxSizeGb")
    def reset_max_size_gb(self) -> None:
        return jsii.invoke(self, "resetMaxSizeGb", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZoneRedundant")
    def reset_zone_redundant(self) -> None:
        return jsii.invoke(self, "resetZoneRedundant", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="perDatabaseSettingsInput")
    def per_database_settings_input(
        self,
    ) -> typing.List["MssqlElasticpoolPerDatabaseSettings"]:
        return jsii.get(self, "perDatabaseSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["MssqlElasticpoolSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeBytesInput")
    def max_size_bytes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxSizeBytesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGbInput")
    def max_size_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxSizeGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MssqlElasticpoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundantInput")
    def zone_redundant_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneRedundantInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeBytes")
    def max_size_bytes(self) -> jsii.Number:
        return jsii.get(self, "maxSizeBytes")

    @max_size_bytes.setter # type: ignore
    def max_size_bytes(self, value: jsii.Number) -> None:
        jsii.set(self, "maxSizeBytes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGb")
    def max_size_gb(self) -> jsii.Number:
        return jsii.get(self, "maxSizeGb")

    @max_size_gb.setter # type: ignore
    def max_size_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "maxSizeGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="perDatabaseSettings")
    def per_database_settings(
        self,
    ) -> typing.List["MssqlElasticpoolPerDatabaseSettings"]:
        return jsii.get(self, "perDatabaseSettings")

    @per_database_settings.setter # type: ignore
    def per_database_settings(
        self,
        value: typing.List["MssqlElasticpoolPerDatabaseSettings"],
    ) -> None:
        jsii.set(self, "perDatabaseSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["MssqlElasticpoolSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["MssqlElasticpoolSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlElasticpoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlElasticpoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @zone_redundant.setter # type: ignore
    def zone_redundant(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneRedundant", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlElasticpoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "per_database_settings": "perDatabaseSettings",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "sku": "sku",
        "license_type": "licenseType",
        "max_size_bytes": "maxSizeBytes",
        "max_size_gb": "maxSizeGb",
        "tags": "tags",
        "timeouts": "timeouts",
        "zone_redundant": "zoneRedundant",
    },
)
class MssqlElasticpoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        per_database_settings: typing.List["MssqlElasticpoolPerDatabaseSettings"],
        resource_group_name: builtins.str,
        server_name: builtins.str,
        sku: typing.List["MssqlElasticpoolSku"],
        license_type: typing.Optional[builtins.str] = None,
        max_size_bytes: typing.Optional[jsii.Number] = None,
        max_size_gb: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MssqlElasticpoolTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param per_database_settings: per_database_settings block.
        :param resource_group_name: -
        :param server_name: -
        :param sku: sku block.
        :param license_type: -
        :param max_size_bytes: -
        :param max_size_gb: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_redundant: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlElasticpoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "per_database_settings": per_database_settings,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if license_type is not None:
            self._values["license_type"] = license_type
        if max_size_bytes is not None:
            self._values["max_size_bytes"] = max_size_bytes
        if max_size_gb is not None:
            self._values["max_size_gb"] = max_size_gb
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zone_redundant is not None:
            self._values["zone_redundant"] = zone_redundant

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def per_database_settings(
        self,
    ) -> typing.List["MssqlElasticpoolPerDatabaseSettings"]:
        """per_database_settings block."""
        result = self._values.get("per_database_settings")
        assert result is not None, "Required property 'per_database_settings' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["MssqlElasticpoolSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def max_size_bytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_size_bytes")
        return result

    @builtins.property
    def max_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_size_gb")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MssqlElasticpoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zone_redundant(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_redundant")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlElasticpoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlElasticpoolPerDatabaseSettings",
    jsii_struct_bases=[],
    name_mapping={"max_capacity": "maxCapacity", "min_capacity": "minCapacity"},
)
class MssqlElasticpoolPerDatabaseSettings:
    def __init__(self, *, max_capacity: jsii.Number, min_capacity: jsii.Number) -> None:
        """
        :param max_capacity: -
        :param min_capacity: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "max_capacity": max_capacity,
            "min_capacity": min_capacity,
        }

    @builtins.property
    def max_capacity(self) -> jsii.Number:
        result = self._values.get("max_capacity")
        assert result is not None, "Required property 'max_capacity' is missing"
        return result

    @builtins.property
    def min_capacity(self) -> jsii.Number:
        result = self._values.get("min_capacity")
        assert result is not None, "Required property 'min_capacity' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlElasticpoolPerDatabaseSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlElasticpoolSku",
    jsii_struct_bases=[],
    name_mapping={
        "capacity": "capacity",
        "name": "name",
        "tier": "tier",
        "family": "family",
    },
)
class MssqlElasticpoolSku:
    def __init__(
        self,
        *,
        capacity: jsii.Number,
        name: builtins.str,
        tier: builtins.str,
        family: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param capacity: -
        :param name: -
        :param tier: -
        :param family: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "capacity": capacity,
            "name": name,
            "tier": tier,
        }
        if family is not None:
            self._values["family"] = family

    @builtins.property
    def capacity(self) -> jsii.Number:
        result = self._values.get("capacity")
        assert result is not None, "Required property 'capacity' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def family(self) -> typing.Optional[builtins.str]:
        result = self._values.get("family")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlElasticpoolSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlElasticpoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlElasticpoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlElasticpoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        administrator_login: builtins.str,
        administrator_login_password: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        version: builtins.str,
        azuread_administrator: typing.Optional[typing.List["MssqlServerAzureadAdministrator"]] = None,
        connection_policy: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["MssqlServerExtendedAuditingPolicy"]] = None,
        identity: typing.Optional[typing.List["MssqlServerIdentity"]] = None,
        minimum_tls_version: typing.Optional[builtins.str] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MssqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param version: -
        :param azuread_administrator: azuread_administrator block.
        :param connection_policy: -
        :param extended_auditing_policy: -
        :param identity: identity block.
        :param minimum_tls_version: -
        :param public_network_access_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlServerConfig(
            administrator_login=administrator_login,
            administrator_login_password=administrator_login_password,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            version=version,
            azuread_administrator=azuread_administrator,
            connection_policy=connection_policy,
            extended_auditing_policy=extended_auditing_policy,
            identity=identity,
            minimum_tls_version=minimum_tls_version,
            public_network_access_enabled=public_network_access_enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAzureadAdministrator")
    def reset_azuread_administrator(self) -> None:
        return jsii.invoke(self, "resetAzureadAdministrator", [])

    @jsii.member(jsii_name="resetConnectionPolicy")
    def reset_connection_policy(self) -> None:
        return jsii.invoke(self, "resetConnectionPolicy", [])

    @jsii.member(jsii_name="resetExtendedAuditingPolicy")
    def reset_extended_auditing_policy(self) -> None:
        return jsii.invoke(self, "resetExtendedAuditingPolicy", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetMinimumTlsVersion")
    def reset_minimum_tls_version(self) -> None:
        return jsii.invoke(self, "resetMinimumTlsVersion", [])

    @jsii.member(jsii_name="resetPublicNetworkAccessEnabled")
    def reset_public_network_access_enabled(self) -> None:
        return jsii.invoke(self, "resetPublicNetworkAccessEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginInput")
    def administrator_login_input(self) -> builtins.str:
        return jsii.get(self, "administratorLoginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPasswordInput")
    def administrator_login_password_input(self) -> builtins.str:
        return jsii.get(self, "administratorLoginPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fullyQualifiedDomainName")
    def fully_qualified_domain_name(self) -> builtins.str:
        return jsii.get(self, "fullyQualifiedDomainName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorableDroppedDatabaseIds")
    def restorable_dropped_database_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "restorableDroppedDatabaseIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> builtins.str:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureadAdministratorInput")
    def azuread_administrator_input(
        self,
    ) -> typing.Optional[typing.List["MssqlServerAzureadAdministrator"]]:
        return jsii.get(self, "azureadAdministratorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionPolicyInput")
    def connection_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "connectionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicyInput")
    def extended_auditing_policy_input(
        self,
    ) -> typing.Optional[typing.List["MssqlServerExtendedAuditingPolicy"]]:
        return jsii.get(self, "extendedAuditingPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["MssqlServerIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minimumTlsVersionInput")
    def minimum_tls_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "minimumTlsVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabledInput")
    def public_network_access_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "publicNetworkAccessEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MssqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @administrator_login.setter # type: ignore
    def administrator_login(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLogin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPassword")
    def administrator_login_password(self) -> builtins.str:
        return jsii.get(self, "administratorLoginPassword")

    @administrator_login_password.setter # type: ignore
    def administrator_login_password(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLoginPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureadAdministrator")
    def azuread_administrator(self) -> typing.List["MssqlServerAzureadAdministrator"]:
        return jsii.get(self, "azureadAdministrator")

    @azuread_administrator.setter # type: ignore
    def azuread_administrator(
        self,
        value: typing.List["MssqlServerAzureadAdministrator"],
    ) -> None:
        jsii.set(self, "azureadAdministrator", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionPolicy")
    def connection_policy(self) -> builtins.str:
        return jsii.get(self, "connectionPolicy")

    @connection_policy.setter # type: ignore
    def connection_policy(self, value: builtins.str) -> None:
        jsii.set(self, "connectionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicy")
    def extended_auditing_policy(
        self,
    ) -> typing.List["MssqlServerExtendedAuditingPolicy"]:
        return jsii.get(self, "extendedAuditingPolicy")

    @extended_auditing_policy.setter # type: ignore
    def extended_auditing_policy(
        self,
        value: typing.List["MssqlServerExtendedAuditingPolicy"],
    ) -> None:
        jsii.set(self, "extendedAuditingPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["MssqlServerIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["MssqlServerIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minimumTlsVersion")
    def minimum_tls_version(self) -> builtins.str:
        return jsii.get(self, "minimumTlsVersion")

    @minimum_tls_version.setter # type: ignore
    def minimum_tls_version(self, value: builtins.str) -> None:
        jsii.set(self, "minimumTlsVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @public_network_access_enabled.setter # type: ignore
    def public_network_access_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "publicNetworkAccessEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlServerAzureadAdministrator",
    jsii_struct_bases=[],
    name_mapping={
        "login_username": "loginUsername",
        "object_id": "objectId",
        "tenant_id": "tenantId",
    },
)
class MssqlServerAzureadAdministrator:
    def __init__(
        self,
        *,
        login_username: builtins.str,
        object_id: builtins.str,
        tenant_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param login_username: -
        :param object_id: -
        :param tenant_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "login_username": login_username,
            "object_id": object_id,
        }
        if tenant_id is not None:
            self._values["tenant_id"] = tenant_id

    @builtins.property
    def login_username(self) -> builtins.str:
        result = self._values.get("login_username")
        assert result is not None, "Required property 'login_username' is missing"
        return result

    @builtins.property
    def object_id(self) -> builtins.str:
        result = self._values.get("object_id")
        assert result is not None, "Required property 'object_id' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tenant_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerAzureadAdministrator(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "administrator_login": "administratorLogin",
        "administrator_login_password": "administratorLoginPassword",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "version": "version",
        "azuread_administrator": "azureadAdministrator",
        "connection_policy": "connectionPolicy",
        "extended_auditing_policy": "extendedAuditingPolicy",
        "identity": "identity",
        "minimum_tls_version": "minimumTlsVersion",
        "public_network_access_enabled": "publicNetworkAccessEnabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MssqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        administrator_login: builtins.str,
        administrator_login_password: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        version: builtins.str,
        azuread_administrator: typing.Optional[typing.List[MssqlServerAzureadAdministrator]] = None,
        connection_policy: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["MssqlServerExtendedAuditingPolicy"]] = None,
        identity: typing.Optional[typing.List["MssqlServerIdentity"]] = None,
        minimum_tls_version: typing.Optional[builtins.str] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MssqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param administrator_login: -
        :param administrator_login_password: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param version: -
        :param azuread_administrator: azuread_administrator block.
        :param connection_policy: -
        :param extended_auditing_policy: -
        :param identity: identity block.
        :param minimum_tls_version: -
        :param public_network_access_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "administrator_login": administrator_login,
            "administrator_login_password": administrator_login_password,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "version": version,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if azuread_administrator is not None:
            self._values["azuread_administrator"] = azuread_administrator
        if connection_policy is not None:
            self._values["connection_policy"] = connection_policy
        if extended_auditing_policy is not None:
            self._values["extended_auditing_policy"] = extended_auditing_policy
        if identity is not None:
            self._values["identity"] = identity
        if minimum_tls_version is not None:
            self._values["minimum_tls_version"] = minimum_tls_version
        if public_network_access_enabled is not None:
            self._values["public_network_access_enabled"] = public_network_access_enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def administrator_login(self) -> builtins.str:
        result = self._values.get("administrator_login")
        assert result is not None, "Required property 'administrator_login' is missing"
        return result

    @builtins.property
    def administrator_login_password(self) -> builtins.str:
        result = self._values.get("administrator_login_password")
        assert result is not None, "Required property 'administrator_login_password' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def azuread_administrator(
        self,
    ) -> typing.Optional[typing.List[MssqlServerAzureadAdministrator]]:
        """azuread_administrator block."""
        result = self._values.get("azuread_administrator")
        return result

    @builtins.property
    def connection_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("connection_policy")
        return result

    @builtins.property
    def extended_auditing_policy(
        self,
    ) -> typing.Optional[typing.List["MssqlServerExtendedAuditingPolicy"]]:
        result = self._values.get("extended_auditing_policy")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["MssqlServerIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def minimum_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("minimum_tls_version")
        return result

    @builtins.property
    def public_network_access_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("public_network_access_enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MssqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerExtendedAuditingPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "retention_in_days": "retentionInDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_access_key_is_secondary": "storageAccountAccessKeyIsSecondary",
        "storage_endpoint": "storageEndpoint",
    },
)
class MssqlServerExtendedAuditingPolicy:
    def __init__(
        self,
        *,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param storage_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_account_access_key_is_secondary is not None:
            self._values["storage_account_access_key_is_secondary"] = storage_account_access_key_is_secondary
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_account_access_key_is_secondary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("storage_account_access_key_is_secondary")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerExtendedAuditingPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlServerExtendedAuditingPolicyA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlServerExtendedAuditingPolicyA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        server_id: builtins.str,
        storage_endpoint: builtins.str,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["MssqlServerExtendedAuditingPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param server_id: -
        :param storage_endpoint: -
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlServerExtendedAuditingPolicyAConfig(
            server_id=server_id,
            storage_endpoint=storage_endpoint,
            retention_in_days=retention_in_days,
            storage_account_access_key=storage_account_access_key,
            storage_account_access_key_is_secondary=storage_account_access_key_is_secondary,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlServerExtendedAuditingPolicyA, self, [scope, id, config])

    @jsii.member(jsii_name="resetRetentionInDays")
    def reset_retention_in_days(self) -> None:
        return jsii.invoke(self, "resetRetentionInDays", [])

    @jsii.member(jsii_name="resetStorageAccountAccessKey")
    def reset_storage_account_access_key(self) -> None:
        return jsii.invoke(self, "resetStorageAccountAccessKey", [])

    @jsii.member(jsii_name="resetStorageAccountAccessKeyIsSecondary")
    def reset_storage_account_access_key_is_secondary(self) -> None:
        return jsii.invoke(self, "resetStorageAccountAccessKeyIsSecondary", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverIdInput")
    def server_id_input(self) -> builtins.str:
        return jsii.get(self, "serverIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageEndpointInput")
    def storage_endpoint_input(self) -> builtins.str:
        return jsii.get(self, "storageEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDaysInput")
    def retention_in_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionInDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyInput")
    def storage_account_access_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyIsSecondaryInput")
    def storage_account_access_key_is_secondary_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "storageAccountAccessKeyIsSecondaryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MssqlServerExtendedAuditingPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionInDays")
    def retention_in_days(self) -> jsii.Number:
        return jsii.get(self, "retentionInDays")

    @retention_in_days.setter # type: ignore
    def retention_in_days(self, value: jsii.Number) -> None:
        jsii.set(self, "retentionInDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverId")
    def server_id(self) -> builtins.str:
        return jsii.get(self, "serverId")

    @server_id.setter # type: ignore
    def server_id(self, value: builtins.str) -> None:
        jsii.set(self, "serverId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKey")
    def storage_account_access_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKey")

    @storage_account_access_key.setter # type: ignore
    def storage_account_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyIsSecondary")
    def storage_account_access_key_is_secondary(self) -> builtins.bool:
        return jsii.get(self, "storageAccountAccessKeyIsSecondary")

    @storage_account_access_key_is_secondary.setter # type: ignore
    def storage_account_access_key_is_secondary(self, value: builtins.bool) -> None:
        jsii.set(self, "storageAccountAccessKeyIsSecondary", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageEndpoint")
    def storage_endpoint(self) -> builtins.str:
        return jsii.get(self, "storageEndpoint")

    @storage_endpoint.setter # type: ignore
    def storage_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "storageEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlServerExtendedAuditingPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlServerExtendedAuditingPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlServerExtendedAuditingPolicyAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "server_id": "serverId",
        "storage_endpoint": "storageEndpoint",
        "retention_in_days": "retentionInDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_access_key_is_secondary": "storageAccountAccessKeyIsSecondary",
        "timeouts": "timeouts",
    },
)
class MssqlServerExtendedAuditingPolicyAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        server_id: builtins.str,
        storage_endpoint: builtins.str,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["MssqlServerExtendedAuditingPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param server_id: -
        :param storage_endpoint: -
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlServerExtendedAuditingPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "server_id": server_id,
            "storage_endpoint": storage_endpoint,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_account_access_key_is_secondary is not None:
            self._values["storage_account_access_key_is_secondary"] = storage_account_access_key_is_secondary
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def server_id(self) -> builtins.str:
        result = self._values.get("server_id")
        assert result is not None, "Required property 'server_id' is missing"
        return result

    @builtins.property
    def storage_endpoint(self) -> builtins.str:
        result = self._values.get("storage_endpoint")
        assert result is not None, "Required property 'storage_endpoint' is missing"
        return result

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_account_access_key_is_secondary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("storage_account_access_key_is_secondary")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MssqlServerExtendedAuditingPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerExtendedAuditingPolicyAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerExtendedAuditingPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlServerExtendedAuditingPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerExtendedAuditingPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class MssqlServerIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlServerSecurityAlertPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlServerSecurityAlertPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        state: builtins.str,
        disabled_alerts: typing.Optional[typing.List[builtins.str]] = None,
        email_account_admins: typing.Optional[builtins.bool] = None,
        email_addresses: typing.Optional[typing.List[builtins.str]] = None,
        retention_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MssqlServerSecurityAlertPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param resource_group_name: -
        :param server_name: -
        :param state: -
        :param disabled_alerts: -
        :param email_account_admins: -
        :param email_addresses: -
        :param retention_days: -
        :param storage_account_access_key: -
        :param storage_endpoint: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlServerSecurityAlertPolicyConfig(
            resource_group_name=resource_group_name,
            server_name=server_name,
            state=state,
            disabled_alerts=disabled_alerts,
            email_account_admins=email_account_admins,
            email_addresses=email_addresses,
            retention_days=retention_days,
            storage_account_access_key=storage_account_access_key,
            storage_endpoint=storage_endpoint,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlServerSecurityAlertPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetDisabledAlerts")
    def reset_disabled_alerts(self) -> None:
        return jsii.invoke(self, "resetDisabledAlerts", [])

    @jsii.member(jsii_name="resetEmailAccountAdmins")
    def reset_email_account_admins(self) -> None:
        return jsii.invoke(self, "resetEmailAccountAdmins", [])

    @jsii.member(jsii_name="resetEmailAddresses")
    def reset_email_addresses(self) -> None:
        return jsii.invoke(self, "resetEmailAddresses", [])

    @jsii.member(jsii_name="resetRetentionDays")
    def reset_retention_days(self) -> None:
        return jsii.invoke(self, "resetRetentionDays", [])

    @jsii.member(jsii_name="resetStorageAccountAccessKey")
    def reset_storage_account_access_key(self) -> None:
        return jsii.invoke(self, "resetStorageAccountAccessKey", [])

    @jsii.member(jsii_name="resetStorageEndpoint")
    def reset_storage_endpoint(self) -> None:
        return jsii.invoke(self, "resetStorageEndpoint", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="stateInput")
    def state_input(self) -> builtins.str:
        return jsii.get(self, "stateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disabledAlertsInput")
    def disabled_alerts_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "disabledAlertsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAccountAdminsInput")
    def email_account_admins_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "emailAccountAdminsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddressesInput")
    def email_addresses_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "emailAddressesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionDaysInput")
    def retention_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyInput")
    def storage_account_access_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageEndpointInput")
    def storage_endpoint_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MssqlServerSecurityAlertPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disabledAlerts")
    def disabled_alerts(self) -> typing.List[builtins.str]:
        return jsii.get(self, "disabledAlerts")

    @disabled_alerts.setter # type: ignore
    def disabled_alerts(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "disabledAlerts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAccountAdmins")
    def email_account_admins(self) -> builtins.bool:
        return jsii.get(self, "emailAccountAdmins")

    @email_account_admins.setter # type: ignore
    def email_account_admins(self, value: builtins.bool) -> None:
        jsii.set(self, "emailAccountAdmins", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailAddresses")
    def email_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "emailAddresses")

    @email_addresses.setter # type: ignore
    def email_addresses(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "emailAddresses", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionDays")
    def retention_days(self) -> jsii.Number:
        return jsii.get(self, "retentionDays")

    @retention_days.setter # type: ignore
    def retention_days(self, value: jsii.Number) -> None:
        jsii.set(self, "retentionDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="state")
    def state(self) -> builtins.str:
        return jsii.get(self, "state")

    @state.setter # type: ignore
    def state(self, value: builtins.str) -> None:
        jsii.set(self, "state", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKey")
    def storage_account_access_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKey")

    @storage_account_access_key.setter # type: ignore
    def storage_account_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageEndpoint")
    def storage_endpoint(self) -> builtins.str:
        return jsii.get(self, "storageEndpoint")

    @storage_endpoint.setter # type: ignore
    def storage_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "storageEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlServerSecurityAlertPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlServerSecurityAlertPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlServerSecurityAlertPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "state": "state",
        "disabled_alerts": "disabledAlerts",
        "email_account_admins": "emailAccountAdmins",
        "email_addresses": "emailAddresses",
        "retention_days": "retentionDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_endpoint": "storageEndpoint",
        "timeouts": "timeouts",
    },
)
class MssqlServerSecurityAlertPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        state: builtins.str,
        disabled_alerts: typing.Optional[typing.List[builtins.str]] = None,
        email_account_admins: typing.Optional[builtins.bool] = None,
        email_addresses: typing.Optional[typing.List[builtins.str]] = None,
        retention_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MssqlServerSecurityAlertPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param resource_group_name: -
        :param server_name: -
        :param state: -
        :param disabled_alerts: -
        :param email_account_admins: -
        :param email_addresses: -
        :param retention_days: -
        :param storage_account_access_key: -
        :param storage_endpoint: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlServerSecurityAlertPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "state": state,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if disabled_alerts is not None:
            self._values["disabled_alerts"] = disabled_alerts
        if email_account_admins is not None:
            self._values["email_account_admins"] = email_account_admins
        if email_addresses is not None:
            self._values["email_addresses"] = email_addresses
        if retention_days is not None:
            self._values["retention_days"] = retention_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def state(self) -> builtins.str:
        result = self._values.get("state")
        assert result is not None, "Required property 'state' is missing"
        return result

    @builtins.property
    def disabled_alerts(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("disabled_alerts")
        return result

    @builtins.property
    def email_account_admins(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("email_account_admins")
        return result

    @builtins.property
    def email_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("email_addresses")
        return result

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MssqlServerSecurityAlertPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerSecurityAlertPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerSecurityAlertPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlServerSecurityAlertPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerSecurityAlertPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlServerVulnerabilityAssessment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlServerVulnerabilityAssessment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        server_security_alert_policy_id: builtins.str,
        storage_container_path: builtins.str,
        recurring_scans: typing.Optional[typing.List["MssqlServerVulnerabilityAssessmentRecurringScans"]] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_container_sas_key: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MssqlServerVulnerabilityAssessmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param server_security_alert_policy_id: -
        :param storage_container_path: -
        :param recurring_scans: recurring_scans block.
        :param storage_account_access_key: -
        :param storage_container_sas_key: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlServerVulnerabilityAssessmentConfig(
            server_security_alert_policy_id=server_security_alert_policy_id,
            storage_container_path=storage_container_path,
            recurring_scans=recurring_scans,
            storage_account_access_key=storage_account_access_key,
            storage_container_sas_key=storage_container_sas_key,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlServerVulnerabilityAssessment, self, [scope, id, config])

    @jsii.member(jsii_name="resetRecurringScans")
    def reset_recurring_scans(self) -> None:
        return jsii.invoke(self, "resetRecurringScans", [])

    @jsii.member(jsii_name="resetStorageAccountAccessKey")
    def reset_storage_account_access_key(self) -> None:
        return jsii.invoke(self, "resetStorageAccountAccessKey", [])

    @jsii.member(jsii_name="resetStorageContainerSasKey")
    def reset_storage_container_sas_key(self) -> None:
        return jsii.invoke(self, "resetStorageContainerSasKey", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverSecurityAlertPolicyIdInput")
    def server_security_alert_policy_id_input(self) -> builtins.str:
        return jsii.get(self, "serverSecurityAlertPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerPathInput")
    def storage_container_path_input(self) -> builtins.str:
        return jsii.get(self, "storageContainerPathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurringScansInput")
    def recurring_scans_input(
        self,
    ) -> typing.Optional[typing.List["MssqlServerVulnerabilityAssessmentRecurringScans"]]:
        return jsii.get(self, "recurringScansInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKeyInput")
    def storage_account_access_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountAccessKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerSasKeyInput")
    def storage_container_sas_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageContainerSasKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MssqlServerVulnerabilityAssessmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recurringScans")
    def recurring_scans(
        self,
    ) -> typing.List["MssqlServerVulnerabilityAssessmentRecurringScans"]:
        return jsii.get(self, "recurringScans")

    @recurring_scans.setter # type: ignore
    def recurring_scans(
        self,
        value: typing.List["MssqlServerVulnerabilityAssessmentRecurringScans"],
    ) -> None:
        jsii.set(self, "recurringScans", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverSecurityAlertPolicyId")
    def server_security_alert_policy_id(self) -> builtins.str:
        return jsii.get(self, "serverSecurityAlertPolicyId")

    @server_security_alert_policy_id.setter # type: ignore
    def server_security_alert_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "serverSecurityAlertPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountAccessKey")
    def storage_account_access_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountAccessKey")

    @storage_account_access_key.setter # type: ignore
    def storage_account_access_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountAccessKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerPath")
    def storage_container_path(self) -> builtins.str:
        return jsii.get(self, "storageContainerPath")

    @storage_container_path.setter # type: ignore
    def storage_container_path(self, value: builtins.str) -> None:
        jsii.set(self, "storageContainerPath", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerSasKey")
    def storage_container_sas_key(self) -> builtins.str:
        return jsii.get(self, "storageContainerSasKey")

    @storage_container_sas_key.setter # type: ignore
    def storage_container_sas_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageContainerSasKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlServerVulnerabilityAssessmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlServerVulnerabilityAssessmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlServerVulnerabilityAssessmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "server_security_alert_policy_id": "serverSecurityAlertPolicyId",
        "storage_container_path": "storageContainerPath",
        "recurring_scans": "recurringScans",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_container_sas_key": "storageContainerSasKey",
        "timeouts": "timeouts",
    },
)
class MssqlServerVulnerabilityAssessmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        server_security_alert_policy_id: builtins.str,
        storage_container_path: builtins.str,
        recurring_scans: typing.Optional[typing.List["MssqlServerVulnerabilityAssessmentRecurringScans"]] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_container_sas_key: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["MssqlServerVulnerabilityAssessmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param server_security_alert_policy_id: -
        :param storage_container_path: -
        :param recurring_scans: recurring_scans block.
        :param storage_account_access_key: -
        :param storage_container_sas_key: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlServerVulnerabilityAssessmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "server_security_alert_policy_id": server_security_alert_policy_id,
            "storage_container_path": storage_container_path,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if recurring_scans is not None:
            self._values["recurring_scans"] = recurring_scans
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_container_sas_key is not None:
            self._values["storage_container_sas_key"] = storage_container_sas_key
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def server_security_alert_policy_id(self) -> builtins.str:
        result = self._values.get("server_security_alert_policy_id")
        assert result is not None, "Required property 'server_security_alert_policy_id' is missing"
        return result

    @builtins.property
    def storage_container_path(self) -> builtins.str:
        result = self._values.get("storage_container_path")
        assert result is not None, "Required property 'storage_container_path' is missing"
        return result

    @builtins.property
    def recurring_scans(
        self,
    ) -> typing.Optional[typing.List["MssqlServerVulnerabilityAssessmentRecurringScans"]]:
        """recurring_scans block."""
        result = self._values.get("recurring_scans")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_container_sas_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_container_sas_key")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MssqlServerVulnerabilityAssessmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerVulnerabilityAssessmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerVulnerabilityAssessmentRecurringScans",
    jsii_struct_bases=[],
    name_mapping={
        "emails": "emails",
        "email_subscription_admins": "emailSubscriptionAdmins",
        "enabled": "enabled",
    },
)
class MssqlServerVulnerabilityAssessmentRecurringScans:
    def __init__(
        self,
        *,
        emails: typing.Optional[typing.List[builtins.str]] = None,
        email_subscription_admins: typing.Optional[builtins.bool] = None,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param emails: -
        :param email_subscription_admins: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if emails is not None:
            self._values["emails"] = emails
        if email_subscription_admins is not None:
            self._values["email_subscription_admins"] = email_subscription_admins
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def emails(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("emails")
        return result

    @builtins.property
    def email_subscription_admins(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("email_subscription_admins")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerVulnerabilityAssessmentRecurringScans(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlServerVulnerabilityAssessmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlServerVulnerabilityAssessmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlServerVulnerabilityAssessmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MssqlVirtualMachine(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MssqlVirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        sql_license_type: builtins.str,
        virtual_machine_id: builtins.str,
        auto_patching: typing.Optional[typing.List["MssqlVirtualMachineAutoPatching"]] = None,
        key_vault_credential: typing.Optional[typing.List["MssqlVirtualMachineKeyVaultCredential"]] = None,
        r_services_enabled: typing.Optional[builtins.bool] = None,
        sql_connectivity_port: typing.Optional[jsii.Number] = None,
        sql_connectivity_type: typing.Optional[builtins.str] = None,
        sql_connectivity_update_password: typing.Optional[builtins.str] = None,
        sql_connectivity_update_username: typing.Optional[builtins.str] = None,
        storage_configuration: typing.Optional[typing.List["MssqlVirtualMachineStorageConfiguration"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MssqlVirtualMachineTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param sql_license_type: -
        :param virtual_machine_id: -
        :param auto_patching: auto_patching block.
        :param key_vault_credential: key_vault_credential block.
        :param r_services_enabled: -
        :param sql_connectivity_port: -
        :param sql_connectivity_type: -
        :param sql_connectivity_update_password: -
        :param sql_connectivity_update_username: -
        :param storage_configuration: storage_configuration block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MssqlVirtualMachineConfig(
            sql_license_type=sql_license_type,
            virtual_machine_id=virtual_machine_id,
            auto_patching=auto_patching,
            key_vault_credential=key_vault_credential,
            r_services_enabled=r_services_enabled,
            sql_connectivity_port=sql_connectivity_port,
            sql_connectivity_type=sql_connectivity_type,
            sql_connectivity_update_password=sql_connectivity_update_password,
            sql_connectivity_update_username=sql_connectivity_update_username,
            storage_configuration=storage_configuration,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MssqlVirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoPatching")
    def reset_auto_patching(self) -> None:
        return jsii.invoke(self, "resetAutoPatching", [])

    @jsii.member(jsii_name="resetKeyVaultCredential")
    def reset_key_vault_credential(self) -> None:
        return jsii.invoke(self, "resetKeyVaultCredential", [])

    @jsii.member(jsii_name="resetRServicesEnabled")
    def reset_r_services_enabled(self) -> None:
        return jsii.invoke(self, "resetRServicesEnabled", [])

    @jsii.member(jsii_name="resetSqlConnectivityPort")
    def reset_sql_connectivity_port(self) -> None:
        return jsii.invoke(self, "resetSqlConnectivityPort", [])

    @jsii.member(jsii_name="resetSqlConnectivityType")
    def reset_sql_connectivity_type(self) -> None:
        return jsii.invoke(self, "resetSqlConnectivityType", [])

    @jsii.member(jsii_name="resetSqlConnectivityUpdatePassword")
    def reset_sql_connectivity_update_password(self) -> None:
        return jsii.invoke(self, "resetSqlConnectivityUpdatePassword", [])

    @jsii.member(jsii_name="resetSqlConnectivityUpdateUsername")
    def reset_sql_connectivity_update_username(self) -> None:
        return jsii.invoke(self, "resetSqlConnectivityUpdateUsername", [])

    @jsii.member(jsii_name="resetStorageConfiguration")
    def reset_storage_configuration(self) -> None:
        return jsii.invoke(self, "resetStorageConfiguration", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlLicenseTypeInput")
    def sql_license_type_input(self) -> builtins.str:
        return jsii.get(self, "sqlLicenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineIdInput")
    def virtual_machine_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualMachineIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoPatchingInput")
    def auto_patching_input(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineAutoPatching"]]:
        return jsii.get(self, "autoPatchingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultCredentialInput")
    def key_vault_credential_input(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineKeyVaultCredential"]]:
        return jsii.get(self, "keyVaultCredentialInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rServicesEnabledInput")
    def r_services_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "rServicesEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityPortInput")
    def sql_connectivity_port_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "sqlConnectivityPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityTypeInput")
    def sql_connectivity_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sqlConnectivityTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityUpdatePasswordInput")
    def sql_connectivity_update_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sqlConnectivityUpdatePasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityUpdateUsernameInput")
    def sql_connectivity_update_username_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sqlConnectivityUpdateUsernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageConfigurationInput")
    def storage_configuration_input(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineStorageConfiguration"]]:
        return jsii.get(self, "storageConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MssqlVirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoPatching")
    def auto_patching(self) -> typing.List["MssqlVirtualMachineAutoPatching"]:
        return jsii.get(self, "autoPatching")

    @auto_patching.setter # type: ignore
    def auto_patching(
        self,
        value: typing.List["MssqlVirtualMachineAutoPatching"],
    ) -> None:
        jsii.set(self, "autoPatching", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultCredential")
    def key_vault_credential(
        self,
    ) -> typing.List["MssqlVirtualMachineKeyVaultCredential"]:
        return jsii.get(self, "keyVaultCredential")

    @key_vault_credential.setter # type: ignore
    def key_vault_credential(
        self,
        value: typing.List["MssqlVirtualMachineKeyVaultCredential"],
    ) -> None:
        jsii.set(self, "keyVaultCredential", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rServicesEnabled")
    def r_services_enabled(self) -> builtins.bool:
        return jsii.get(self, "rServicesEnabled")

    @r_services_enabled.setter # type: ignore
    def r_services_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "rServicesEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityPort")
    def sql_connectivity_port(self) -> jsii.Number:
        return jsii.get(self, "sqlConnectivityPort")

    @sql_connectivity_port.setter # type: ignore
    def sql_connectivity_port(self, value: jsii.Number) -> None:
        jsii.set(self, "sqlConnectivityPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityType")
    def sql_connectivity_type(self) -> builtins.str:
        return jsii.get(self, "sqlConnectivityType")

    @sql_connectivity_type.setter # type: ignore
    def sql_connectivity_type(self, value: builtins.str) -> None:
        jsii.set(self, "sqlConnectivityType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityUpdatePassword")
    def sql_connectivity_update_password(self) -> builtins.str:
        return jsii.get(self, "sqlConnectivityUpdatePassword")

    @sql_connectivity_update_password.setter # type: ignore
    def sql_connectivity_update_password(self, value: builtins.str) -> None:
        jsii.set(self, "sqlConnectivityUpdatePassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlConnectivityUpdateUsername")
    def sql_connectivity_update_username(self) -> builtins.str:
        return jsii.get(self, "sqlConnectivityUpdateUsername")

    @sql_connectivity_update_username.setter # type: ignore
    def sql_connectivity_update_username(self, value: builtins.str) -> None:
        jsii.set(self, "sqlConnectivityUpdateUsername", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlLicenseType")
    def sql_license_type(self) -> builtins.str:
        return jsii.get(self, "sqlLicenseType")

    @sql_license_type.setter # type: ignore
    def sql_license_type(self, value: builtins.str) -> None:
        jsii.set(self, "sqlLicenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageConfiguration")
    def storage_configuration(
        self,
    ) -> typing.List["MssqlVirtualMachineStorageConfiguration"]:
        return jsii.get(self, "storageConfiguration")

    @storage_configuration.setter # type: ignore
    def storage_configuration(
        self,
        value: typing.List["MssqlVirtualMachineStorageConfiguration"],
    ) -> None:
        jsii.set(self, "storageConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MssqlVirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MssqlVirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @virtual_machine_id.setter # type: ignore
    def virtual_machine_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineId", value)


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineAutoPatching",
    jsii_struct_bases=[],
    name_mapping={
        "day_of_week": "dayOfWeek",
        "maintenance_window_duration_in_minutes": "maintenanceWindowDurationInMinutes",
        "maintenance_window_starting_hour": "maintenanceWindowStartingHour",
    },
)
class MssqlVirtualMachineAutoPatching:
    def __init__(
        self,
        *,
        day_of_week: builtins.str,
        maintenance_window_duration_in_minutes: jsii.Number,
        maintenance_window_starting_hour: jsii.Number,
    ) -> None:
        """
        :param day_of_week: -
        :param maintenance_window_duration_in_minutes: -
        :param maintenance_window_starting_hour: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "day_of_week": day_of_week,
            "maintenance_window_duration_in_minutes": maintenance_window_duration_in_minutes,
            "maintenance_window_starting_hour": maintenance_window_starting_hour,
        }

    @builtins.property
    def day_of_week(self) -> builtins.str:
        result = self._values.get("day_of_week")
        assert result is not None, "Required property 'day_of_week' is missing"
        return result

    @builtins.property
    def maintenance_window_duration_in_minutes(self) -> jsii.Number:
        result = self._values.get("maintenance_window_duration_in_minutes")
        assert result is not None, "Required property 'maintenance_window_duration_in_minutes' is missing"
        return result

    @builtins.property
    def maintenance_window_starting_hour(self) -> jsii.Number:
        result = self._values.get("maintenance_window_starting_hour")
        assert result is not None, "Required property 'maintenance_window_starting_hour' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineAutoPatching(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "sql_license_type": "sqlLicenseType",
        "virtual_machine_id": "virtualMachineId",
        "auto_patching": "autoPatching",
        "key_vault_credential": "keyVaultCredential",
        "r_services_enabled": "rServicesEnabled",
        "sql_connectivity_port": "sqlConnectivityPort",
        "sql_connectivity_type": "sqlConnectivityType",
        "sql_connectivity_update_password": "sqlConnectivityUpdatePassword",
        "sql_connectivity_update_username": "sqlConnectivityUpdateUsername",
        "storage_configuration": "storageConfiguration",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class MssqlVirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        sql_license_type: builtins.str,
        virtual_machine_id: builtins.str,
        auto_patching: typing.Optional[typing.List[MssqlVirtualMachineAutoPatching]] = None,
        key_vault_credential: typing.Optional[typing.List["MssqlVirtualMachineKeyVaultCredential"]] = None,
        r_services_enabled: typing.Optional[builtins.bool] = None,
        sql_connectivity_port: typing.Optional[jsii.Number] = None,
        sql_connectivity_type: typing.Optional[builtins.str] = None,
        sql_connectivity_update_password: typing.Optional[builtins.str] = None,
        sql_connectivity_update_username: typing.Optional[builtins.str] = None,
        storage_configuration: typing.Optional[typing.List["MssqlVirtualMachineStorageConfiguration"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["MssqlVirtualMachineTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param sql_license_type: -
        :param virtual_machine_id: -
        :param auto_patching: auto_patching block.
        :param key_vault_credential: key_vault_credential block.
        :param r_services_enabled: -
        :param sql_connectivity_port: -
        :param sql_connectivity_type: -
        :param sql_connectivity_update_password: -
        :param sql_connectivity_update_username: -
        :param storage_configuration: storage_configuration block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MssqlVirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "sql_license_type": sql_license_type,
            "virtual_machine_id": virtual_machine_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_patching is not None:
            self._values["auto_patching"] = auto_patching
        if key_vault_credential is not None:
            self._values["key_vault_credential"] = key_vault_credential
        if r_services_enabled is not None:
            self._values["r_services_enabled"] = r_services_enabled
        if sql_connectivity_port is not None:
            self._values["sql_connectivity_port"] = sql_connectivity_port
        if sql_connectivity_type is not None:
            self._values["sql_connectivity_type"] = sql_connectivity_type
        if sql_connectivity_update_password is not None:
            self._values["sql_connectivity_update_password"] = sql_connectivity_update_password
        if sql_connectivity_update_username is not None:
            self._values["sql_connectivity_update_username"] = sql_connectivity_update_username
        if storage_configuration is not None:
            self._values["storage_configuration"] = storage_configuration
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def sql_license_type(self) -> builtins.str:
        result = self._values.get("sql_license_type")
        assert result is not None, "Required property 'sql_license_type' is missing"
        return result

    @builtins.property
    def virtual_machine_id(self) -> builtins.str:
        result = self._values.get("virtual_machine_id")
        assert result is not None, "Required property 'virtual_machine_id' is missing"
        return result

    @builtins.property
    def auto_patching(
        self,
    ) -> typing.Optional[typing.List[MssqlVirtualMachineAutoPatching]]:
        """auto_patching block."""
        result = self._values.get("auto_patching")
        return result

    @builtins.property
    def key_vault_credential(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineKeyVaultCredential"]]:
        """key_vault_credential block."""
        result = self._values.get("key_vault_credential")
        return result

    @builtins.property
    def r_services_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("r_services_enabled")
        return result

    @builtins.property
    def sql_connectivity_port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("sql_connectivity_port")
        return result

    @builtins.property
    def sql_connectivity_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sql_connectivity_type")
        return result

    @builtins.property
    def sql_connectivity_update_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sql_connectivity_update_password")
        return result

    @builtins.property
    def sql_connectivity_update_username(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sql_connectivity_update_username")
        return result

    @builtins.property
    def storage_configuration(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineStorageConfiguration"]]:
        """storage_configuration block."""
        result = self._values.get("storage_configuration")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MssqlVirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineKeyVaultCredential",
    jsii_struct_bases=[],
    name_mapping={
        "key_vault_url": "keyVaultUrl",
        "name": "name",
        "service_principal_name": "servicePrincipalName",
        "service_principal_secret": "servicePrincipalSecret",
    },
)
class MssqlVirtualMachineKeyVaultCredential:
    def __init__(
        self,
        *,
        key_vault_url: builtins.str,
        name: builtins.str,
        service_principal_name: builtins.str,
        service_principal_secret: builtins.str,
    ) -> None:
        """
        :param key_vault_url: -
        :param name: -
        :param service_principal_name: -
        :param service_principal_secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_url": key_vault_url,
            "name": name,
            "service_principal_name": service_principal_name,
            "service_principal_secret": service_principal_secret,
        }

    @builtins.property
    def key_vault_url(self) -> builtins.str:
        result = self._values.get("key_vault_url")
        assert result is not None, "Required property 'key_vault_url' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def service_principal_name(self) -> builtins.str:
        result = self._values.get("service_principal_name")
        assert result is not None, "Required property 'service_principal_name' is missing"
        return result

    @builtins.property
    def service_principal_secret(self) -> builtins.str:
        result = self._values.get("service_principal_secret")
        assert result is not None, "Required property 'service_principal_secret' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineKeyVaultCredential(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineStorageConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "disk_type": "diskType",
        "storage_workload_type": "storageWorkloadType",
        "data_settings": "dataSettings",
        "log_settings": "logSettings",
        "temp_db_settings": "tempDbSettings",
    },
)
class MssqlVirtualMachineStorageConfiguration:
    def __init__(
        self,
        *,
        disk_type: builtins.str,
        storage_workload_type: builtins.str,
        data_settings: typing.Optional[typing.List["MssqlVirtualMachineStorageConfigurationDataSettings"]] = None,
        log_settings: typing.Optional[typing.List["MssqlVirtualMachineStorageConfigurationLogSettings"]] = None,
        temp_db_settings: typing.Optional[typing.List["MssqlVirtualMachineStorageConfigurationTempDbSettings"]] = None,
    ) -> None:
        """
        :param disk_type: -
        :param storage_workload_type: -
        :param data_settings: data_settings block.
        :param log_settings: log_settings block.
        :param temp_db_settings: temp_db_settings block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "disk_type": disk_type,
            "storage_workload_type": storage_workload_type,
        }
        if data_settings is not None:
            self._values["data_settings"] = data_settings
        if log_settings is not None:
            self._values["log_settings"] = log_settings
        if temp_db_settings is not None:
            self._values["temp_db_settings"] = temp_db_settings

    @builtins.property
    def disk_type(self) -> builtins.str:
        result = self._values.get("disk_type")
        assert result is not None, "Required property 'disk_type' is missing"
        return result

    @builtins.property
    def storage_workload_type(self) -> builtins.str:
        result = self._values.get("storage_workload_type")
        assert result is not None, "Required property 'storage_workload_type' is missing"
        return result

    @builtins.property
    def data_settings(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineStorageConfigurationDataSettings"]]:
        """data_settings block."""
        result = self._values.get("data_settings")
        return result

    @builtins.property
    def log_settings(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineStorageConfigurationLogSettings"]]:
        """log_settings block."""
        result = self._values.get("log_settings")
        return result

    @builtins.property
    def temp_db_settings(
        self,
    ) -> typing.Optional[typing.List["MssqlVirtualMachineStorageConfigurationTempDbSettings"]]:
        """temp_db_settings block."""
        result = self._values.get("temp_db_settings")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineStorageConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineStorageConfigurationDataSettings",
    jsii_struct_bases=[],
    name_mapping={"default_file_path": "defaultFilePath", "luns": "luns"},
)
class MssqlVirtualMachineStorageConfigurationDataSettings:
    def __init__(
        self,
        *,
        default_file_path: builtins.str,
        luns: typing.List[jsii.Number],
    ) -> None:
        """
        :param default_file_path: -
        :param luns: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "default_file_path": default_file_path,
            "luns": luns,
        }

    @builtins.property
    def default_file_path(self) -> builtins.str:
        result = self._values.get("default_file_path")
        assert result is not None, "Required property 'default_file_path' is missing"
        return result

    @builtins.property
    def luns(self) -> typing.List[jsii.Number]:
        result = self._values.get("luns")
        assert result is not None, "Required property 'luns' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineStorageConfigurationDataSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineStorageConfigurationLogSettings",
    jsii_struct_bases=[],
    name_mapping={"default_file_path": "defaultFilePath", "luns": "luns"},
)
class MssqlVirtualMachineStorageConfigurationLogSettings:
    def __init__(
        self,
        *,
        default_file_path: builtins.str,
        luns: typing.List[jsii.Number],
    ) -> None:
        """
        :param default_file_path: -
        :param luns: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "default_file_path": default_file_path,
            "luns": luns,
        }

    @builtins.property
    def default_file_path(self) -> builtins.str:
        result = self._values.get("default_file_path")
        assert result is not None, "Required property 'default_file_path' is missing"
        return result

    @builtins.property
    def luns(self) -> typing.List[jsii.Number]:
        result = self._values.get("luns")
        assert result is not None, "Required property 'luns' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineStorageConfigurationLogSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineStorageConfigurationTempDbSettings",
    jsii_struct_bases=[],
    name_mapping={"default_file_path": "defaultFilePath", "luns": "luns"},
)
class MssqlVirtualMachineStorageConfigurationTempDbSettings:
    def __init__(
        self,
        *,
        default_file_path: builtins.str,
        luns: typing.List[jsii.Number],
    ) -> None:
        """
        :param default_file_path: -
        :param luns: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "default_file_path": default_file_path,
            "luns": luns,
        }

    @builtins.property
    def default_file_path(self) -> builtins.str:
        result = self._values.get("default_file_path")
        assert result is not None, "Required property 'default_file_path' is missing"
        return result

    @builtins.property
    def luns(self) -> typing.List[jsii.Number]:
        result = self._values.get("luns")
        assert result is not None, "Required property 'luns' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineStorageConfigurationTempDbSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MssqlVirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MssqlVirtualMachineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MssqlVirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MysqlActiveDirectoryAdministrator(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MysqlActiveDirectoryAdministrator",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        login: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["MysqlActiveDirectoryAdministratorTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param login: -
        :param object_id: -
        :param resource_group_name: -
        :param server_name: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MysqlActiveDirectoryAdministratorConfig(
            login=login,
            object_id=object_id,
            resource_group_name=resource_group_name,
            server_name=server_name,
            tenant_id=tenant_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MysqlActiveDirectoryAdministrator, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loginInput")
    def login_input(self) -> builtins.str:
        return jsii.get(self, "loginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectIdInput")
    def object_id_input(self) -> builtins.str:
        return jsii.get(self, "objectIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["MysqlActiveDirectoryAdministratorTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="login")
    def login(self) -> builtins.str:
        return jsii.get(self, "login")

    @login.setter # type: ignore
    def login(self, value: builtins.str) -> None:
        jsii.set(self, "login", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @object_id.setter # type: ignore
    def object_id(self, value: builtins.str) -> None:
        jsii.set(self, "objectId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MysqlActiveDirectoryAdministratorTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MysqlActiveDirectoryAdministratorTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MysqlActiveDirectoryAdministratorConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "login": "login",
        "object_id": "objectId",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "tenant_id": "tenantId",
        "timeouts": "timeouts",
    },
)
class MysqlActiveDirectoryAdministratorConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        login: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["MysqlActiveDirectoryAdministratorTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param login: -
        :param object_id: -
        :param resource_group_name: -
        :param server_name: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MysqlActiveDirectoryAdministratorTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "login": login,
            "object_id": object_id,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def login(self) -> builtins.str:
        result = self._values.get("login")
        assert result is not None, "Required property 'login' is missing"
        return result

    @builtins.property
    def object_id(self) -> builtins.str:
        result = self._values.get("object_id")
        assert result is not None, "Required property 'object_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MysqlActiveDirectoryAdministratorTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlActiveDirectoryAdministratorConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlActiveDirectoryAdministratorTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MysqlActiveDirectoryAdministratorTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlActiveDirectoryAdministratorTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MysqlConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MysqlConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["MysqlConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param value: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MysqlConfigurationConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            value=value,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MysqlConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MysqlConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MysqlConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MysqlConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.MysqlConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "value": "value",
        "timeouts": "timeouts",
    },
)
class MysqlConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["MysqlConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param value: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MysqlConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MysqlConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MysqlConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MysqlDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MysqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        charset: builtins.str,
        collation: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["MysqlDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param charset: -
        :param collation: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MysqlDatabaseConfig(
            charset=charset,
            collation=collation,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MysqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="charsetInput")
    def charset_input(self) -> builtins.str:
        return jsii.get(self, "charsetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collationInput")
    def collation_input(self) -> builtins.str:
        return jsii.get(self, "collationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MysqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="charset")
    def charset(self) -> builtins.str:
        return jsii.get(self, "charset")

    @charset.setter # type: ignore
    def charset(self, value: builtins.str) -> None:
        jsii.set(self, "charset", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @collation.setter # type: ignore
    def collation(self, value: builtins.str) -> None:
        jsii.set(self, "collation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MysqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MysqlDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MysqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "charset": "charset",
        "collation": "collation",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "timeouts": "timeouts",
    },
)
class MysqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        charset: builtins.str,
        collation: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["MysqlDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param charset: -
        :param collation: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MysqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "charset": charset,
            "collation": collation,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def charset(self) -> builtins.str:
        result = self._values.get("charset")
        assert result is not None, "Required property 'charset' is missing"
        return result

    @builtins.property
    def collation(self) -> builtins.str:
        result = self._values.get("collation")
        assert result is not None, "Required property 'collation' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MysqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MysqlDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MysqlFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MysqlFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["MysqlFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MysqlFirewallRuleConfig(
            end_ip_address=end_ip_address,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            start_ip_address=start_ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MysqlFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddressInput")
    def end_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "endIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddressInput")
    def start_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "startIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MysqlFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddress")
    def end_ip_address(self) -> builtins.str:
        return jsii.get(self, "endIpAddress")

    @end_ip_address.setter # type: ignore
    def end_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "endIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddress")
    def start_ip_address(self) -> builtins.str:
        return jsii.get(self, "startIpAddress")

    @start_ip_address.setter # type: ignore
    def start_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "startIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MysqlFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MysqlFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MysqlFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "end_ip_address": "endIpAddress",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "start_ip_address": "startIpAddress",
        "timeouts": "timeouts",
    },
)
class MysqlFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["MysqlFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MysqlFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "end_ip_address": end_ip_address,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "start_ip_address": start_ip_address,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def end_ip_address(self) -> builtins.str:
        result = self._values.get("end_ip_address")
        assert result is not None, "Required property 'end_ip_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def start_ip_address(self) -> builtins.str:
        result = self._values.get("start_ip_address")
        assert result is not None, "Required property 'start_ip_address' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MysqlFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MysqlFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MysqlServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MysqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        version: builtins.str,
        administrator_login: typing.Optional[builtins.str] = None,
        administrator_login_password: typing.Optional[builtins.str] = None,
        auto_grow_enabled: typing.Optional[builtins.bool] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_server_id: typing.Optional[builtins.str] = None,
        geo_redundant_backup_enabled: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["MysqlServerIdentity"]] = None,
        infrastructure_encryption_enabled: typing.Optional[builtins.bool] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        ssl_enforcement: typing.Optional[builtins.str] = None,
        ssl_enforcement_enabled: typing.Optional[builtins.bool] = None,
        ssl_minimal_tls_version_enforced: typing.Optional[builtins.str] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
        storage_profile: typing.Optional[typing.List["MysqlServerStorageProfile"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["MysqlServerThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["MysqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param version: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param auto_grow_enabled: -
        :param backup_retention_days: -
        :param create_mode: -
        :param creation_source_server_id: -
        :param geo_redundant_backup_enabled: -
        :param identity: identity block.
        :param infrastructure_encryption_enabled: -
        :param public_network_access_enabled: -
        :param restore_point_in_time: -
        :param ssl_enforcement: -
        :param ssl_enforcement_enabled: -
        :param ssl_minimal_tls_version_enforced: -
        :param storage_mb: -
        :param storage_profile: storage_profile block.
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MysqlServerConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            version=version,
            administrator_login=administrator_login,
            administrator_login_password=administrator_login_password,
            auto_grow_enabled=auto_grow_enabled,
            backup_retention_days=backup_retention_days,
            create_mode=create_mode,
            creation_source_server_id=creation_source_server_id,
            geo_redundant_backup_enabled=geo_redundant_backup_enabled,
            identity=identity,
            infrastructure_encryption_enabled=infrastructure_encryption_enabled,
            public_network_access_enabled=public_network_access_enabled,
            restore_point_in_time=restore_point_in_time,
            ssl_enforcement=ssl_enforcement,
            ssl_enforcement_enabled=ssl_enforcement_enabled,
            ssl_minimal_tls_version_enforced=ssl_minimal_tls_version_enforced,
            storage_mb=storage_mb,
            storage_profile=storage_profile,
            tags=tags,
            threat_detection_policy=threat_detection_policy,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MysqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdministratorLogin")
    def reset_administrator_login(self) -> None:
        return jsii.invoke(self, "resetAdministratorLogin", [])

    @jsii.member(jsii_name="resetAdministratorLoginPassword")
    def reset_administrator_login_password(self) -> None:
        return jsii.invoke(self, "resetAdministratorLoginPassword", [])

    @jsii.member(jsii_name="resetAutoGrowEnabled")
    def reset_auto_grow_enabled(self) -> None:
        return jsii.invoke(self, "resetAutoGrowEnabled", [])

    @jsii.member(jsii_name="resetBackupRetentionDays")
    def reset_backup_retention_days(self) -> None:
        return jsii.invoke(self, "resetBackupRetentionDays", [])

    @jsii.member(jsii_name="resetCreateMode")
    def reset_create_mode(self) -> None:
        return jsii.invoke(self, "resetCreateMode", [])

    @jsii.member(jsii_name="resetCreationSourceServerId")
    def reset_creation_source_server_id(self) -> None:
        return jsii.invoke(self, "resetCreationSourceServerId", [])

    @jsii.member(jsii_name="resetGeoRedundantBackupEnabled")
    def reset_geo_redundant_backup_enabled(self) -> None:
        return jsii.invoke(self, "resetGeoRedundantBackupEnabled", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetInfrastructureEncryptionEnabled")
    def reset_infrastructure_encryption_enabled(self) -> None:
        return jsii.invoke(self, "resetInfrastructureEncryptionEnabled", [])

    @jsii.member(jsii_name="resetPublicNetworkAccessEnabled")
    def reset_public_network_access_enabled(self) -> None:
        return jsii.invoke(self, "resetPublicNetworkAccessEnabled", [])

    @jsii.member(jsii_name="resetRestorePointInTime")
    def reset_restore_point_in_time(self) -> None:
        return jsii.invoke(self, "resetRestorePointInTime", [])

    @jsii.member(jsii_name="resetSslEnforcement")
    def reset_ssl_enforcement(self) -> None:
        return jsii.invoke(self, "resetSslEnforcement", [])

    @jsii.member(jsii_name="resetSslEnforcementEnabled")
    def reset_ssl_enforcement_enabled(self) -> None:
        return jsii.invoke(self, "resetSslEnforcementEnabled", [])

    @jsii.member(jsii_name="resetSslMinimalTlsVersionEnforced")
    def reset_ssl_minimal_tls_version_enforced(self) -> None:
        return jsii.invoke(self, "resetSslMinimalTlsVersionEnforced", [])

    @jsii.member(jsii_name="resetStorageMb")
    def reset_storage_mb(self) -> None:
        return jsii.invoke(self, "resetStorageMb", [])

    @jsii.member(jsii_name="resetStorageProfile")
    def reset_storage_profile(self) -> None:
        return jsii.invoke(self, "resetStorageProfile", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetThreatDetectionPolicy")
    def reset_threat_detection_policy(self) -> None:
        return jsii.invoke(self, "resetThreatDetectionPolicy", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> builtins.str:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginInput")
    def administrator_login_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "administratorLoginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPasswordInput")
    def administrator_login_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "administratorLoginPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrowEnabledInput")
    def auto_grow_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoGrowEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDaysInput")
    def backup_retention_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "backupRetentionDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createModeInput")
    def create_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceServerIdInput")
    def creation_source_server_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "creationSourceServerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackupEnabledInput")
    def geo_redundant_backup_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "geoRedundantBackupEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["MysqlServerIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="infrastructureEncryptionEnabledInput")
    def infrastructure_encryption_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "infrastructureEncryptionEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabledInput")
    def public_network_access_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "publicNetworkAccessEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTimeInput")
    def restore_point_in_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "restorePointInTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementEnabledInput")
    def ssl_enforcement_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sslEnforcementEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementInput")
    def ssl_enforcement_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sslEnforcementInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslMinimalTlsVersionEnforcedInput")
    def ssl_minimal_tls_version_enforced_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sslMinimalTlsVersionEnforcedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMbInput")
    def storage_mb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "storageMbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileInput")
    def storage_profile_input(
        self,
    ) -> typing.Optional[typing.List["MysqlServerStorageProfile"]]:
        return jsii.get(self, "storageProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicyInput")
    def threat_detection_policy_input(
        self,
    ) -> typing.Optional[typing.List["MysqlServerThreatDetectionPolicy"]]:
        return jsii.get(self, "threatDetectionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MysqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @administrator_login.setter # type: ignore
    def administrator_login(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLogin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPassword")
    def administrator_login_password(self) -> builtins.str:
        return jsii.get(self, "administratorLoginPassword")

    @administrator_login_password.setter # type: ignore
    def administrator_login_password(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLoginPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrowEnabled")
    def auto_grow_enabled(self) -> builtins.bool:
        return jsii.get(self, "autoGrowEnabled")

    @auto_grow_enabled.setter # type: ignore
    def auto_grow_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "autoGrowEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDays")
    def backup_retention_days(self) -> jsii.Number:
        return jsii.get(self, "backupRetentionDays")

    @backup_retention_days.setter # type: ignore
    def backup_retention_days(self, value: jsii.Number) -> None:
        jsii.set(self, "backupRetentionDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createMode")
    def create_mode(self) -> builtins.str:
        return jsii.get(self, "createMode")

    @create_mode.setter # type: ignore
    def create_mode(self, value: builtins.str) -> None:
        jsii.set(self, "createMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceServerId")
    def creation_source_server_id(self) -> builtins.str:
        return jsii.get(self, "creationSourceServerId")

    @creation_source_server_id.setter # type: ignore
    def creation_source_server_id(self, value: builtins.str) -> None:
        jsii.set(self, "creationSourceServerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackupEnabled")
    def geo_redundant_backup_enabled(self) -> builtins.bool:
        return jsii.get(self, "geoRedundantBackupEnabled")

    @geo_redundant_backup_enabled.setter # type: ignore
    def geo_redundant_backup_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "geoRedundantBackupEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["MysqlServerIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["MysqlServerIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="infrastructureEncryptionEnabled")
    def infrastructure_encryption_enabled(self) -> builtins.bool:
        return jsii.get(self, "infrastructureEncryptionEnabled")

    @infrastructure_encryption_enabled.setter # type: ignore
    def infrastructure_encryption_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "infrastructureEncryptionEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @public_network_access_enabled.setter # type: ignore
    def public_network_access_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "publicNetworkAccessEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTime")
    def restore_point_in_time(self) -> builtins.str:
        return jsii.get(self, "restorePointInTime")

    @restore_point_in_time.setter # type: ignore
    def restore_point_in_time(self, value: builtins.str) -> None:
        jsii.set(self, "restorePointInTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcement")
    def ssl_enforcement(self) -> builtins.str:
        return jsii.get(self, "sslEnforcement")

    @ssl_enforcement.setter # type: ignore
    def ssl_enforcement(self, value: builtins.str) -> None:
        jsii.set(self, "sslEnforcement", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementEnabled")
    def ssl_enforcement_enabled(self) -> builtins.bool:
        return jsii.get(self, "sslEnforcementEnabled")

    @ssl_enforcement_enabled.setter # type: ignore
    def ssl_enforcement_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "sslEnforcementEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslMinimalTlsVersionEnforced")
    def ssl_minimal_tls_version_enforced(self) -> builtins.str:
        return jsii.get(self, "sslMinimalTlsVersionEnforced")

    @ssl_minimal_tls_version_enforced.setter # type: ignore
    def ssl_minimal_tls_version_enforced(self, value: builtins.str) -> None:
        jsii.set(self, "sslMinimalTlsVersionEnforced", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMb")
    def storage_mb(self) -> jsii.Number:
        return jsii.get(self, "storageMb")

    @storage_mb.setter # type: ignore
    def storage_mb(self, value: jsii.Number) -> None:
        jsii.set(self, "storageMb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfile")
    def storage_profile(self) -> typing.List["MysqlServerStorageProfile"]:
        return jsii.get(self, "storageProfile")

    @storage_profile.setter # type: ignore
    def storage_profile(self, value: typing.List["MysqlServerStorageProfile"]) -> None:
        jsii.set(self, "storageProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicy")
    def threat_detection_policy(
        self,
    ) -> typing.List["MysqlServerThreatDetectionPolicy"]:
        return jsii.get(self, "threatDetectionPolicy")

    @threat_detection_policy.setter # type: ignore
    def threat_detection_policy(
        self,
        value: typing.List["MysqlServerThreatDetectionPolicy"],
    ) -> None:
        jsii.set(self, "threatDetectionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MysqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MysqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.MysqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "version": "version",
        "administrator_login": "administratorLogin",
        "administrator_login_password": "administratorLoginPassword",
        "auto_grow_enabled": "autoGrowEnabled",
        "backup_retention_days": "backupRetentionDays",
        "create_mode": "createMode",
        "creation_source_server_id": "creationSourceServerId",
        "geo_redundant_backup_enabled": "geoRedundantBackupEnabled",
        "identity": "identity",
        "infrastructure_encryption_enabled": "infrastructureEncryptionEnabled",
        "public_network_access_enabled": "publicNetworkAccessEnabled",
        "restore_point_in_time": "restorePointInTime",
        "ssl_enforcement": "sslEnforcement",
        "ssl_enforcement_enabled": "sslEnforcementEnabled",
        "ssl_minimal_tls_version_enforced": "sslMinimalTlsVersionEnforced",
        "storage_mb": "storageMb",
        "storage_profile": "storageProfile",
        "tags": "tags",
        "threat_detection_policy": "threatDetectionPolicy",
        "timeouts": "timeouts",
    },
)
class MysqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        version: builtins.str,
        administrator_login: typing.Optional[builtins.str] = None,
        administrator_login_password: typing.Optional[builtins.str] = None,
        auto_grow_enabled: typing.Optional[builtins.bool] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_server_id: typing.Optional[builtins.str] = None,
        geo_redundant_backup_enabled: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["MysqlServerIdentity"]] = None,
        infrastructure_encryption_enabled: typing.Optional[builtins.bool] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        ssl_enforcement: typing.Optional[builtins.str] = None,
        ssl_enforcement_enabled: typing.Optional[builtins.bool] = None,
        ssl_minimal_tls_version_enforced: typing.Optional[builtins.str] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
        storage_profile: typing.Optional[typing.List["MysqlServerStorageProfile"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["MysqlServerThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["MysqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param version: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param auto_grow_enabled: -
        :param backup_retention_days: -
        :param create_mode: -
        :param creation_source_server_id: -
        :param geo_redundant_backup_enabled: -
        :param identity: identity block.
        :param infrastructure_encryption_enabled: -
        :param public_network_access_enabled: -
        :param restore_point_in_time: -
        :param ssl_enforcement: -
        :param ssl_enforcement_enabled: -
        :param ssl_minimal_tls_version_enforced: -
        :param storage_mb: -
        :param storage_profile: storage_profile block.
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MysqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "version": version,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if administrator_login is not None:
            self._values["administrator_login"] = administrator_login
        if administrator_login_password is not None:
            self._values["administrator_login_password"] = administrator_login_password
        if auto_grow_enabled is not None:
            self._values["auto_grow_enabled"] = auto_grow_enabled
        if backup_retention_days is not None:
            self._values["backup_retention_days"] = backup_retention_days
        if create_mode is not None:
            self._values["create_mode"] = create_mode
        if creation_source_server_id is not None:
            self._values["creation_source_server_id"] = creation_source_server_id
        if geo_redundant_backup_enabled is not None:
            self._values["geo_redundant_backup_enabled"] = geo_redundant_backup_enabled
        if identity is not None:
            self._values["identity"] = identity
        if infrastructure_encryption_enabled is not None:
            self._values["infrastructure_encryption_enabled"] = infrastructure_encryption_enabled
        if public_network_access_enabled is not None:
            self._values["public_network_access_enabled"] = public_network_access_enabled
        if restore_point_in_time is not None:
            self._values["restore_point_in_time"] = restore_point_in_time
        if ssl_enforcement is not None:
            self._values["ssl_enforcement"] = ssl_enforcement
        if ssl_enforcement_enabled is not None:
            self._values["ssl_enforcement_enabled"] = ssl_enforcement_enabled
        if ssl_minimal_tls_version_enforced is not None:
            self._values["ssl_minimal_tls_version_enforced"] = ssl_minimal_tls_version_enforced
        if storage_mb is not None:
            self._values["storage_mb"] = storage_mb
        if storage_profile is not None:
            self._values["storage_profile"] = storage_profile
        if tags is not None:
            self._values["tags"] = tags
        if threat_detection_policy is not None:
            self._values["threat_detection_policy"] = threat_detection_policy
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def administrator_login(self) -> typing.Optional[builtins.str]:
        result = self._values.get("administrator_login")
        return result

    @builtins.property
    def administrator_login_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("administrator_login_password")
        return result

    @builtins.property
    def auto_grow_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_grow_enabled")
        return result

    @builtins.property
    def backup_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("backup_retention_days")
        return result

    @builtins.property
    def create_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_mode")
        return result

    @builtins.property
    def creation_source_server_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("creation_source_server_id")
        return result

    @builtins.property
    def geo_redundant_backup_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("geo_redundant_backup_enabled")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["MysqlServerIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def infrastructure_encryption_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("infrastructure_encryption_enabled")
        return result

    @builtins.property
    def public_network_access_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("public_network_access_enabled")
        return result

    @builtins.property
    def restore_point_in_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("restore_point_in_time")
        return result

    @builtins.property
    def ssl_enforcement(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssl_enforcement")
        return result

    @builtins.property
    def ssl_enforcement_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ssl_enforcement_enabled")
        return result

    @builtins.property
    def ssl_minimal_tls_version_enforced(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssl_minimal_tls_version_enforced")
        return result

    @builtins.property
    def storage_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("storage_mb")
        return result

    @builtins.property
    def storage_profile(
        self,
    ) -> typing.Optional[typing.List["MysqlServerStorageProfile"]]:
        """storage_profile block."""
        result = self._values.get("storage_profile")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def threat_detection_policy(
        self,
    ) -> typing.Optional[typing.List["MysqlServerThreatDetectionPolicy"]]:
        """threat_detection_policy block."""
        result = self._values.get("threat_detection_policy")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MysqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlServerIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class MysqlServerIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlServerIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MysqlServerKey(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MysqlServerKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_key_id: builtins.str,
        server_id: builtins.str,
        timeouts: typing.Optional["MysqlServerKeyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_key_id: -
        :param server_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MysqlServerKeyConfig(
            key_vault_key_id=key_vault_key_id,
            server_id=server_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MysqlServerKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyIdInput")
    def key_vault_key_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverIdInput")
    def server_id_input(self) -> builtins.str:
        return jsii.get(self, "serverIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MysqlServerKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @key_vault_key_id.setter # type: ignore
    def key_vault_key_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultKeyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverId")
    def server_id(self) -> builtins.str:
        return jsii.get(self, "serverId")

    @server_id.setter # type: ignore
    def server_id(self, value: builtins.str) -> None:
        jsii.set(self, "serverId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MysqlServerKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MysqlServerKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MysqlServerKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_key_id": "keyVaultKeyId",
        "server_id": "serverId",
        "timeouts": "timeouts",
    },
)
class MysqlServerKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_key_id: builtins.str,
        server_id: builtins.str,
        timeouts: typing.Optional["MysqlServerKeyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_key_id: -
        :param server_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MysqlServerKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_key_id": key_vault_key_id,
            "server_id": server_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_key_id(self) -> builtins.str:
        result = self._values.get("key_vault_key_id")
        assert result is not None, "Required property 'key_vault_key_id' is missing"
        return result

    @builtins.property
    def server_id(self) -> builtins.str:
        result = self._values.get("server_id")
        assert result is not None, "Required property 'server_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MysqlServerKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlServerKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlServerKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MysqlServerKeyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlServerKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlServerStorageProfile",
    jsii_struct_bases=[],
    name_mapping={
        "auto_grow": "autoGrow",
        "backup_retention_days": "backupRetentionDays",
        "geo_redundant_backup": "geoRedundantBackup",
        "storage_mb": "storageMb",
    },
)
class MysqlServerStorageProfile:
    def __init__(
        self,
        *,
        auto_grow: typing.Optional[builtins.str] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        geo_redundant_backup: typing.Optional[builtins.str] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param auto_grow: -
        :param backup_retention_days: -
        :param geo_redundant_backup: -
        :param storage_mb: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if auto_grow is not None:
            self._values["auto_grow"] = auto_grow
        if backup_retention_days is not None:
            self._values["backup_retention_days"] = backup_retention_days
        if geo_redundant_backup is not None:
            self._values["geo_redundant_backup"] = geo_redundant_backup
        if storage_mb is not None:
            self._values["storage_mb"] = storage_mb

    @builtins.property
    def auto_grow(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_grow")
        return result

    @builtins.property
    def backup_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("backup_retention_days")
        return result

    @builtins.property
    def geo_redundant_backup(self) -> typing.Optional[builtins.str]:
        result = self._values.get("geo_redundant_backup")
        return result

    @builtins.property
    def storage_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("storage_mb")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlServerStorageProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlServerThreatDetectionPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "disabled_alerts": "disabledAlerts",
        "email_account_admins": "emailAccountAdmins",
        "email_addresses": "emailAddresses",
        "enabled": "enabled",
        "retention_days": "retentionDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_endpoint": "storageEndpoint",
    },
)
class MysqlServerThreatDetectionPolicy:
    def __init__(
        self,
        *,
        disabled_alerts: typing.Optional[typing.List[builtins.str]] = None,
        email_account_admins: typing.Optional[builtins.bool] = None,
        email_addresses: typing.Optional[typing.List[builtins.str]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        retention_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param disabled_alerts: -
        :param email_account_admins: -
        :param email_addresses: -
        :param enabled: -
        :param retention_days: -
        :param storage_account_access_key: -
        :param storage_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if disabled_alerts is not None:
            self._values["disabled_alerts"] = disabled_alerts
        if email_account_admins is not None:
            self._values["email_account_admins"] = email_account_admins
        if email_addresses is not None:
            self._values["email_addresses"] = email_addresses
        if enabled is not None:
            self._values["enabled"] = enabled
        if retention_days is not None:
            self._values["retention_days"] = retention_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint

    @builtins.property
    def disabled_alerts(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("disabled_alerts")
        return result

    @builtins.property
    def email_account_admins(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("email_account_admins")
        return result

    @builtins.property
    def email_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("email_addresses")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlServerThreatDetectionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MysqlServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class MysqlVirtualNetworkRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.MysqlVirtualNetworkRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["MysqlVirtualNetworkRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MysqlVirtualNetworkRuleConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            subnet_id=subnet_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(MysqlVirtualNetworkRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["MysqlVirtualNetworkRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "MysqlVirtualNetworkRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "MysqlVirtualNetworkRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.MysqlVirtualNetworkRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "subnet_id": "subnetId",
        "timeouts": "timeouts",
    },
)
class MysqlVirtualNetworkRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["MysqlVirtualNetworkRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = MysqlVirtualNetworkRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["MysqlVirtualNetworkRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlVirtualNetworkRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.MysqlVirtualNetworkRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class MysqlVirtualNetworkRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "MysqlVirtualNetworkRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NatGateway(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NatGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        public_ip_address_ids: typing.Optional[typing.List[builtins.str]] = None,
        public_ip_prefix_ids: typing.Optional[typing.List[builtins.str]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NatGatewayTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param idle_timeout_in_minutes: -
        :param public_ip_address_ids: -
        :param public_ip_prefix_ids: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NatGatewayConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            idle_timeout_in_minutes=idle_timeout_in_minutes,
            public_ip_address_ids=public_ip_address_ids,
            public_ip_prefix_ids=public_ip_prefix_ids,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NatGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetIdleTimeoutInMinutes")
    def reset_idle_timeout_in_minutes(self) -> None:
        return jsii.invoke(self, "resetIdleTimeoutInMinutes", [])

    @jsii.member(jsii_name="resetPublicIpAddressIds")
    def reset_public_ip_address_ids(self) -> None:
        return jsii.invoke(self, "resetPublicIpAddressIds", [])

    @jsii.member(jsii_name="resetPublicIpPrefixIds")
    def reset_public_ip_prefix_ids(self) -> None:
        return jsii.invoke(self, "resetPublicIpPrefixIds", [])

    @jsii.member(jsii_name="resetSkuName")
    def reset_sku_name(self) -> None:
        return jsii.invoke(self, "resetSkuName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGuid")
    def resource_guid(self) -> builtins.str:
        return jsii.get(self, "resourceGuid")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutesInput")
    def idle_timeout_in_minutes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "idleTimeoutInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressIdsInput")
    def public_ip_address_ids_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "publicIpAddressIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpPrefixIdsInput")
    def public_ip_prefix_ids_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "publicIpPrefixIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NatGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @idle_timeout_in_minutes.setter # type: ignore
    def idle_timeout_in_minutes(self, value: jsii.Number) -> None:
        jsii.set(self, "idleTimeoutInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressIds")
    def public_ip_address_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddressIds")

    @public_ip_address_ids.setter # type: ignore
    def public_ip_address_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "publicIpAddressIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpPrefixIds")
    def public_ip_prefix_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpPrefixIds")

    @public_ip_prefix_ids.setter # type: ignore
    def public_ip_prefix_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "publicIpPrefixIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NatGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NatGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.NatGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "public_ip_address_ids": "publicIpAddressIds",
        "public_ip_prefix_ids": "publicIpPrefixIds",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class NatGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        public_ip_address_ids: typing.Optional[typing.List[builtins.str]] = None,
        public_ip_prefix_ids: typing.Optional[typing.List[builtins.str]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NatGatewayTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param idle_timeout_in_minutes: -
        :param public_ip_address_ids: -
        :param public_ip_prefix_ids: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NatGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if public_ip_address_ids is not None:
            self._values["public_ip_address_ids"] = public_ip_address_ids
        if public_ip_prefix_ids is not None:
            self._values["public_ip_prefix_ids"] = public_ip_prefix_ids
        if sku_name is not None:
            self._values["sku_name"] = sku_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def public_ip_address_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("public_ip_address_ids")
        return result

    @builtins.property
    def public_ip_prefix_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("public_ip_prefix_ids")
        return result

    @builtins.property
    def sku_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NatGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NatGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NatGatewayPublicIpAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NatGatewayPublicIpAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        nat_gateway_id: builtins.str,
        public_ip_address_id: builtins.str,
        timeouts: typing.Optional["NatGatewayPublicIpAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param nat_gateway_id: -
        :param public_ip_address_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NatGatewayPublicIpAssociationConfig(
            nat_gateway_id=nat_gateway_id,
            public_ip_address_id=public_ip_address_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NatGatewayPublicIpAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natGatewayIdInput")
    def nat_gateway_id_input(self) -> builtins.str:
        return jsii.get(self, "natGatewayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressIdInput")
    def public_ip_address_id_input(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["NatGatewayPublicIpAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natGatewayId")
    def nat_gateway_id(self) -> builtins.str:
        return jsii.get(self, "natGatewayId")

    @nat_gateway_id.setter # type: ignore
    def nat_gateway_id(self, value: builtins.str) -> None:
        jsii.set(self, "natGatewayId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressId")
    def public_ip_address_id(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressId")

    @public_ip_address_id.setter # type: ignore
    def public_ip_address_id(self, value: builtins.str) -> None:
        jsii.set(self, "publicIpAddressId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NatGatewayPublicIpAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NatGatewayPublicIpAssociationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NatGatewayPublicIpAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "nat_gateway_id": "natGatewayId",
        "public_ip_address_id": "publicIpAddressId",
        "timeouts": "timeouts",
    },
)
class NatGatewayPublicIpAssociationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        nat_gateway_id: builtins.str,
        public_ip_address_id: builtins.str,
        timeouts: typing.Optional["NatGatewayPublicIpAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param nat_gateway_id: -
        :param public_ip_address_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NatGatewayPublicIpAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "nat_gateway_id": nat_gateway_id,
            "public_ip_address_id": public_ip_address_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def nat_gateway_id(self) -> builtins.str:
        result = self._values.get("nat_gateway_id")
        assert result is not None, "Required property 'nat_gateway_id' is missing"
        return result

    @builtins.property
    def public_ip_address_id(self) -> builtins.str:
        result = self._values.get("public_ip_address_id")
        assert result is not None, "Required property 'public_ip_address_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NatGatewayPublicIpAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NatGatewayPublicIpAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NatGatewayPublicIpAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class NatGatewayPublicIpAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NatGatewayPublicIpAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NatGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NatGatewayTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NatGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetappAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetappAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        active_directory: typing.Optional[typing.List["NetappAccountActiveDirectory"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param active_directory: active_directory block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetappAccountConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            active_directory=active_directory,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetappAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetActiveDirectory")
    def reset_active_directory(self) -> None:
        return jsii.invoke(self, "resetActiveDirectory", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activeDirectoryInput")
    def active_directory_input(
        self,
    ) -> typing.Optional[typing.List["NetappAccountActiveDirectory"]]:
        return jsii.get(self, "activeDirectoryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetappAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activeDirectory")
    def active_directory(self) -> typing.List["NetappAccountActiveDirectory"]:
        return jsii.get(self, "activeDirectory")

    @active_directory.setter # type: ignore
    def active_directory(
        self,
        value: typing.List["NetappAccountActiveDirectory"],
    ) -> None:
        jsii.set(self, "activeDirectory", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetappAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetappAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetappAccountActiveDirectory",
    jsii_struct_bases=[],
    name_mapping={
        "dns_servers": "dnsServers",
        "domain": "domain",
        "password": "password",
        "smb_server_name": "smbServerName",
        "username": "username",
        "organizational_unit": "organizationalUnit",
    },
)
class NetappAccountActiveDirectory:
    def __init__(
        self,
        *,
        dns_servers: typing.List[builtins.str],
        domain: builtins.str,
        password: builtins.str,
        smb_server_name: builtins.str,
        username: builtins.str,
        organizational_unit: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param dns_servers: -
        :param domain: -
        :param password: -
        :param smb_server_name: -
        :param username: -
        :param organizational_unit: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "dns_servers": dns_servers,
            "domain": domain,
            "password": password,
            "smb_server_name": smb_server_name,
            "username": username,
        }
        if organizational_unit is not None:
            self._values["organizational_unit"] = organizational_unit

    @builtins.property
    def dns_servers(self) -> typing.List[builtins.str]:
        result = self._values.get("dns_servers")
        assert result is not None, "Required property 'dns_servers' is missing"
        return result

    @builtins.property
    def domain(self) -> builtins.str:
        result = self._values.get("domain")
        assert result is not None, "Required property 'domain' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def smb_server_name(self) -> builtins.str:
        result = self._values.get("smb_server_name")
        assert result is not None, "Required property 'smb_server_name' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    @builtins.property
    def organizational_unit(self) -> typing.Optional[builtins.str]:
        result = self._values.get("organizational_unit")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappAccountActiveDirectory(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetappAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "active_directory": "activeDirectory",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetappAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        active_directory: typing.Optional[typing.List[NetappAccountActiveDirectory]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param active_directory: active_directory block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetappAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if active_directory is not None:
            self._values["active_directory"] = active_directory
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def active_directory(
        self,
    ) -> typing.Optional[typing.List[NetappAccountActiveDirectory]]:
        """active_directory block."""
        result = self._values.get("active_directory")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetappAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetappAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetappAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetappPool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetappPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_level: builtins.str,
        size_in_tb: jsii.Number,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service_level: -
        :param size_in_tb: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetappPoolConfig(
            account_name=account_name,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            service_level=service_level,
            size_in_tb=size_in_tb,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetappPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceLevelInput")
    def service_level_input(self) -> builtins.str:
        return jsii.get(self, "serviceLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInTbInput")
    def size_in_tb_input(self) -> jsii.Number:
        return jsii.get(self, "sizeInTbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetappPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceLevel")
    def service_level(self) -> builtins.str:
        return jsii.get(self, "serviceLevel")

    @service_level.setter # type: ignore
    def service_level(self, value: builtins.str) -> None:
        jsii.set(self, "serviceLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInTb")
    def size_in_tb(self) -> jsii.Number:
        return jsii.get(self, "sizeInTb")

    @size_in_tb.setter # type: ignore
    def size_in_tb(self, value: jsii.Number) -> None:
        jsii.set(self, "sizeInTb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetappPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetappPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetappPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "service_level": "serviceLevel",
        "size_in_tb": "sizeInTb",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetappPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_level: builtins.str,
        size_in_tb: jsii.Number,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service_level: -
        :param size_in_tb: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetappPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "service_level": service_level,
            "size_in_tb": size_in_tb,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_level(self) -> builtins.str:
        result = self._values.get("service_level")
        assert result is not None, "Required property 'service_level' is missing"
        return result

    @builtins.property
    def size_in_tb(self) -> jsii.Number:
        result = self._values.get("size_in_tb")
        assert result is not None, "Required property 'size_in_tb' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetappPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetappPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetappPoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetappSnapshot(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetappSnapshot",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        volume_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappSnapshotTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param location: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param volume_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetappSnapshotConfig(
            account_name=account_name,
            location=location,
            name=name,
            pool_name=pool_name,
            resource_group_name=resource_group_name,
            volume_name=volume_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetappSnapshot, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolNameInput")
    def pool_name_input(self) -> builtins.str:
        return jsii.get(self, "poolNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="volumeNameInput")
    def volume_name_input(self) -> builtins.str:
        return jsii.get(self, "volumeNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetappSnapshotTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolName")
    def pool_name(self) -> builtins.str:
        return jsii.get(self, "poolName")

    @pool_name.setter # type: ignore
    def pool_name(self, value: builtins.str) -> None:
        jsii.set(self, "poolName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetappSnapshotTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetappSnapshotTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="volumeName")
    def volume_name(self) -> builtins.str:
        return jsii.get(self, "volumeName")

    @volume_name.setter # type: ignore
    def volume_name(self, value: builtins.str) -> None:
        jsii.set(self, "volumeName", value)


@jsii.data_type(
    jsii_type="azurerm.NetappSnapshotConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "location": "location",
        "name": "name",
        "pool_name": "poolName",
        "resource_group_name": "resourceGroupName",
        "volume_name": "volumeName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetappSnapshotConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        volume_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappSnapshotTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param location: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param volume_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetappSnapshotTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "location": location,
            "name": name,
            "pool_name": pool_name,
            "resource_group_name": resource_group_name,
            "volume_name": volume_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def pool_name(self) -> builtins.str:
        result = self._values.get("pool_name")
        assert result is not None, "Required property 'pool_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def volume_name(self) -> builtins.str:
        result = self._values.get("volume_name")
        assert result is not None, "Required property 'volume_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetappSnapshotTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappSnapshotConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetappSnapshotTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetappSnapshotTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappSnapshotTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetappVolume(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetappVolume",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        service_level: builtins.str,
        storage_quota_in_gb: jsii.Number,
        subnet_id: builtins.str,
        volume_path: builtins.str,
        export_policy_rule: typing.Optional[typing.List["NetappVolumeExportPolicyRule"]] = None,
        protocols: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappVolumeTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_name: -
        :param location: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param service_level: -
        :param storage_quota_in_gb: -
        :param subnet_id: -
        :param volume_path: -
        :param export_policy_rule: export_policy_rule block.
        :param protocols: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetappVolumeConfig(
            account_name=account_name,
            location=location,
            name=name,
            pool_name=pool_name,
            resource_group_name=resource_group_name,
            service_level=service_level,
            storage_quota_in_gb=storage_quota_in_gb,
            subnet_id=subnet_id,
            volume_path=volume_path,
            export_policy_rule=export_policy_rule,
            protocols=protocols,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetappVolume, self, [scope, id, config])

    @jsii.member(jsii_name="resetExportPolicyRule")
    def reset_export_policy_rule(self) -> None:
        return jsii.invoke(self, "resetExportPolicyRule", [])

    @jsii.member(jsii_name="resetProtocols")
    def reset_protocols(self) -> None:
        return jsii.invoke(self, "resetProtocols", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountNameInput")
    def account_name_input(self) -> builtins.str:
        return jsii.get(self, "accountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mountIpAddresses")
    def mount_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "mountIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolNameInput")
    def pool_name_input(self) -> builtins.str:
        return jsii.get(self, "poolNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceLevelInput")
    def service_level_input(self) -> builtins.str:
        return jsii.get(self, "serviceLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageQuotaInGbInput")
    def storage_quota_in_gb_input(self) -> jsii.Number:
        return jsii.get(self, "storageQuotaInGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="volumePathInput")
    def volume_path_input(self) -> builtins.str:
        return jsii.get(self, "volumePathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="exportPolicyRuleInput")
    def export_policy_rule_input(
        self,
    ) -> typing.Optional[typing.List["NetappVolumeExportPolicyRule"]]:
        return jsii.get(self, "exportPolicyRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolsInput")
    def protocols_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "protocolsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetappVolumeTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountName")
    def account_name(self) -> builtins.str:
        return jsii.get(self, "accountName")

    @account_name.setter # type: ignore
    def account_name(self, value: builtins.str) -> None:
        jsii.set(self, "accountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="exportPolicyRule")
    def export_policy_rule(self) -> typing.List["NetappVolumeExportPolicyRule"]:
        return jsii.get(self, "exportPolicyRule")

    @export_policy_rule.setter # type: ignore
    def export_policy_rule(
        self,
        value: typing.List["NetappVolumeExportPolicyRule"],
    ) -> None:
        jsii.set(self, "exportPolicyRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolName")
    def pool_name(self) -> builtins.str:
        return jsii.get(self, "poolName")

    @pool_name.setter # type: ignore
    def pool_name(self, value: builtins.str) -> None:
        jsii.set(self, "poolName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocols")
    def protocols(self) -> typing.List[builtins.str]:
        return jsii.get(self, "protocols")

    @protocols.setter # type: ignore
    def protocols(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "protocols", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceLevel")
    def service_level(self) -> builtins.str:
        return jsii.get(self, "serviceLevel")

    @service_level.setter # type: ignore
    def service_level(self, value: builtins.str) -> None:
        jsii.set(self, "serviceLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageQuotaInGb")
    def storage_quota_in_gb(self) -> jsii.Number:
        return jsii.get(self, "storageQuotaInGb")

    @storage_quota_in_gb.setter # type: ignore
    def storage_quota_in_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "storageQuotaInGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetappVolumeTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetappVolumeTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="volumePath")
    def volume_path(self) -> builtins.str:
        return jsii.get(self, "volumePath")

    @volume_path.setter # type: ignore
    def volume_path(self, value: builtins.str) -> None:
        jsii.set(self, "volumePath", value)


@jsii.data_type(
    jsii_type="azurerm.NetappVolumeConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_name": "accountName",
        "location": "location",
        "name": "name",
        "pool_name": "poolName",
        "resource_group_name": "resourceGroupName",
        "service_level": "serviceLevel",
        "storage_quota_in_gb": "storageQuotaInGb",
        "subnet_id": "subnetId",
        "volume_path": "volumePath",
        "export_policy_rule": "exportPolicyRule",
        "protocols": "protocols",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetappVolumeConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        pool_name: builtins.str,
        resource_group_name: builtins.str,
        service_level: builtins.str,
        storage_quota_in_gb: jsii.Number,
        subnet_id: builtins.str,
        volume_path: builtins.str,
        export_policy_rule: typing.Optional[typing.List["NetappVolumeExportPolicyRule"]] = None,
        protocols: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetappVolumeTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_name: -
        :param location: -
        :param name: -
        :param pool_name: -
        :param resource_group_name: -
        :param service_level: -
        :param storage_quota_in_gb: -
        :param subnet_id: -
        :param volume_path: -
        :param export_policy_rule: export_policy_rule block.
        :param protocols: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetappVolumeTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_name": account_name,
            "location": location,
            "name": name,
            "pool_name": pool_name,
            "resource_group_name": resource_group_name,
            "service_level": service_level,
            "storage_quota_in_gb": storage_quota_in_gb,
            "subnet_id": subnet_id,
            "volume_path": volume_path,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if export_policy_rule is not None:
            self._values["export_policy_rule"] = export_policy_rule
        if protocols is not None:
            self._values["protocols"] = protocols
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_name(self) -> builtins.str:
        result = self._values.get("account_name")
        assert result is not None, "Required property 'account_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def pool_name(self) -> builtins.str:
        result = self._values.get("pool_name")
        assert result is not None, "Required property 'pool_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_level(self) -> builtins.str:
        result = self._values.get("service_level")
        assert result is not None, "Required property 'service_level' is missing"
        return result

    @builtins.property
    def storage_quota_in_gb(self) -> jsii.Number:
        result = self._values.get("storage_quota_in_gb")
        assert result is not None, "Required property 'storage_quota_in_gb' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def volume_path(self) -> builtins.str:
        result = self._values.get("volume_path")
        assert result is not None, "Required property 'volume_path' is missing"
        return result

    @builtins.property
    def export_policy_rule(
        self,
    ) -> typing.Optional[typing.List["NetappVolumeExportPolicyRule"]]:
        """export_policy_rule block."""
        result = self._values.get("export_policy_rule")
        return result

    @builtins.property
    def protocols(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("protocols")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetappVolumeTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappVolumeConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetappVolumeExportPolicyRule",
    jsii_struct_bases=[],
    name_mapping={
        "allowed_clients": "allowedClients",
        "rule_index": "ruleIndex",
        "cifs_enabled": "cifsEnabled",
        "nfsv3_enabled": "nfsv3Enabled",
        "nfsv4_enabled": "nfsv4Enabled",
        "protocols_enabled": "protocolsEnabled",
        "unix_read_only": "unixReadOnly",
        "unix_read_write": "unixReadWrite",
    },
)
class NetappVolumeExportPolicyRule:
    def __init__(
        self,
        *,
        allowed_clients: typing.List[builtins.str],
        rule_index: jsii.Number,
        cifs_enabled: typing.Optional[builtins.bool] = None,
        nfsv3_enabled: typing.Optional[builtins.bool] = None,
        nfsv4_enabled: typing.Optional[builtins.bool] = None,
        protocols_enabled: typing.Optional[typing.List[builtins.str]] = None,
        unix_read_only: typing.Optional[builtins.bool] = None,
        unix_read_write: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param allowed_clients: -
        :param rule_index: -
        :param cifs_enabled: -
        :param nfsv3_enabled: -
        :param nfsv4_enabled: -
        :param protocols_enabled: -
        :param unix_read_only: -
        :param unix_read_write: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_clients": allowed_clients,
            "rule_index": rule_index,
        }
        if cifs_enabled is not None:
            self._values["cifs_enabled"] = cifs_enabled
        if nfsv3_enabled is not None:
            self._values["nfsv3_enabled"] = nfsv3_enabled
        if nfsv4_enabled is not None:
            self._values["nfsv4_enabled"] = nfsv4_enabled
        if protocols_enabled is not None:
            self._values["protocols_enabled"] = protocols_enabled
        if unix_read_only is not None:
            self._values["unix_read_only"] = unix_read_only
        if unix_read_write is not None:
            self._values["unix_read_write"] = unix_read_write

    @builtins.property
    def allowed_clients(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_clients")
        assert result is not None, "Required property 'allowed_clients' is missing"
        return result

    @builtins.property
    def rule_index(self) -> jsii.Number:
        result = self._values.get("rule_index")
        assert result is not None, "Required property 'rule_index' is missing"
        return result

    @builtins.property
    def cifs_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("cifs_enabled")
        return result

    @builtins.property
    def nfsv3_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("nfsv3_enabled")
        return result

    @builtins.property
    def nfsv4_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("nfsv4_enabled")
        return result

    @builtins.property
    def protocols_enabled(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("protocols_enabled")
        return result

    @builtins.property
    def unix_read_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("unix_read_only")
        return result

    @builtins.property
    def unix_read_write(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("unix_read_write")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappVolumeExportPolicyRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetappVolumeTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetappVolumeTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetappVolumeTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkConnectionMonitor(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkConnectionMonitor",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        endpoint: typing.List["NetworkConnectionMonitorEndpoint"],
        location: builtins.str,
        name: builtins.str,
        network_watcher_id: builtins.str,
        test_configuration: typing.List["NetworkConnectionMonitorTestConfiguration"],
        test_group: typing.List["NetworkConnectionMonitorTestGroup"],
        auto_start: typing.Optional[builtins.bool] = None,
        destination: typing.Optional[typing.List["NetworkConnectionMonitorDestination"]] = None,
        interval_in_seconds: typing.Optional[jsii.Number] = None,
        notes: typing.Optional[builtins.str] = None,
        output_workspace_resource_ids: typing.Optional[typing.List[builtins.str]] = None,
        source: typing.Optional[typing.List["NetworkConnectionMonitorSource"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkConnectionMonitorTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param endpoint: endpoint block.
        :param location: -
        :param name: -
        :param network_watcher_id: -
        :param test_configuration: test_configuration block.
        :param test_group: test_group block.
        :param auto_start: -
        :param destination: destination block.
        :param interval_in_seconds: -
        :param notes: -
        :param output_workspace_resource_ids: -
        :param source: source block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkConnectionMonitorConfig(
            endpoint=endpoint,
            location=location,
            name=name,
            network_watcher_id=network_watcher_id,
            test_configuration=test_configuration,
            test_group=test_group,
            auto_start=auto_start,
            destination=destination,
            interval_in_seconds=interval_in_seconds,
            notes=notes,
            output_workspace_resource_ids=output_workspace_resource_ids,
            source=source,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkConnectionMonitor, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoStart")
    def reset_auto_start(self) -> None:
        return jsii.invoke(self, "resetAutoStart", [])

    @jsii.member(jsii_name="resetDestination")
    def reset_destination(self) -> None:
        return jsii.invoke(self, "resetDestination", [])

    @jsii.member(jsii_name="resetIntervalInSeconds")
    def reset_interval_in_seconds(self) -> None:
        return jsii.invoke(self, "resetIntervalInSeconds", [])

    @jsii.member(jsii_name="resetNotes")
    def reset_notes(self) -> None:
        return jsii.invoke(self, "resetNotes", [])

    @jsii.member(jsii_name="resetOutputWorkspaceResourceIds")
    def reset_output_workspace_resource_ids(self) -> None:
        return jsii.invoke(self, "resetOutputWorkspaceResourceIds", [])

    @jsii.member(jsii_name="resetSource")
    def reset_source(self) -> None:
        return jsii.invoke(self, "resetSource", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointInput")
    def endpoint_input(self) -> typing.List["NetworkConnectionMonitorEndpoint"]:
        return jsii.get(self, "endpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherIdInput")
    def network_watcher_id_input(self) -> builtins.str:
        return jsii.get(self, "networkWatcherIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="testConfigurationInput")
    def test_configuration_input(
        self,
    ) -> typing.List["NetworkConnectionMonitorTestConfiguration"]:
        return jsii.get(self, "testConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="testGroupInput")
    def test_group_input(self) -> typing.List["NetworkConnectionMonitorTestGroup"]:
        return jsii.get(self, "testGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoStartInput")
    def auto_start_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoStartInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationInput")
    def destination_input(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorDestination"]]:
        return jsii.get(self, "destinationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInSecondsInput")
    def interval_in_seconds_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "intervalInSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notesInput")
    def notes_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "notesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputWorkspaceResourceIdsInput")
    def output_workspace_resource_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "outputWorkspaceResourceIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceInput")
    def source_input(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorSource"]]:
        return jsii.get(self, "sourceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkConnectionMonitorTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoStart")
    def auto_start(self) -> builtins.bool:
        return jsii.get(self, "autoStart")

    @auto_start.setter # type: ignore
    def auto_start(self, value: builtins.bool) -> None:
        jsii.set(self, "autoStart", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destination")
    def destination(self) -> typing.List["NetworkConnectionMonitorDestination"]:
        return jsii.get(self, "destination")

    @destination.setter # type: ignore
    def destination(
        self,
        value: typing.List["NetworkConnectionMonitorDestination"],
    ) -> None:
        jsii.set(self, "destination", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> typing.List["NetworkConnectionMonitorEndpoint"]:
        return jsii.get(self, "endpoint")

    @endpoint.setter # type: ignore
    def endpoint(self, value: typing.List["NetworkConnectionMonitorEndpoint"]) -> None:
        jsii.set(self, "endpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="intervalInSeconds")
    def interval_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "intervalInSeconds")

    @interval_in_seconds.setter # type: ignore
    def interval_in_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "intervalInSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherId")
    def network_watcher_id(self) -> builtins.str:
        return jsii.get(self, "networkWatcherId")

    @network_watcher_id.setter # type: ignore
    def network_watcher_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkWatcherId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notes")
    def notes(self) -> builtins.str:
        return jsii.get(self, "notes")

    @notes.setter # type: ignore
    def notes(self, value: builtins.str) -> None:
        jsii.set(self, "notes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputWorkspaceResourceIds")
    def output_workspace_resource_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "outputWorkspaceResourceIds")

    @output_workspace_resource_ids.setter # type: ignore
    def output_workspace_resource_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "outputWorkspaceResourceIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="source")
    def source(self) -> typing.List["NetworkConnectionMonitorSource"]:
        return jsii.get(self, "source")

    @source.setter # type: ignore
    def source(self, value: typing.List["NetworkConnectionMonitorSource"]) -> None:
        jsii.set(self, "source", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="testConfiguration")
    def test_configuration(
        self,
    ) -> typing.List["NetworkConnectionMonitorTestConfiguration"]:
        return jsii.get(self, "testConfiguration")

    @test_configuration.setter # type: ignore
    def test_configuration(
        self,
        value: typing.List["NetworkConnectionMonitorTestConfiguration"],
    ) -> None:
        jsii.set(self, "testConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="testGroup")
    def test_group(self) -> typing.List["NetworkConnectionMonitorTestGroup"]:
        return jsii.get(self, "testGroup")

    @test_group.setter # type: ignore
    def test_group(
        self,
        value: typing.List["NetworkConnectionMonitorTestGroup"],
    ) -> None:
        jsii.set(self, "testGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkConnectionMonitorTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkConnectionMonitorTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "endpoint": "endpoint",
        "location": "location",
        "name": "name",
        "network_watcher_id": "networkWatcherId",
        "test_configuration": "testConfiguration",
        "test_group": "testGroup",
        "auto_start": "autoStart",
        "destination": "destination",
        "interval_in_seconds": "intervalInSeconds",
        "notes": "notes",
        "output_workspace_resource_ids": "outputWorkspaceResourceIds",
        "source": "source",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetworkConnectionMonitorConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        endpoint: typing.List["NetworkConnectionMonitorEndpoint"],
        location: builtins.str,
        name: builtins.str,
        network_watcher_id: builtins.str,
        test_configuration: typing.List["NetworkConnectionMonitorTestConfiguration"],
        test_group: typing.List["NetworkConnectionMonitorTestGroup"],
        auto_start: typing.Optional[builtins.bool] = None,
        destination: typing.Optional[typing.List["NetworkConnectionMonitorDestination"]] = None,
        interval_in_seconds: typing.Optional[jsii.Number] = None,
        notes: typing.Optional[builtins.str] = None,
        output_workspace_resource_ids: typing.Optional[typing.List[builtins.str]] = None,
        source: typing.Optional[typing.List["NetworkConnectionMonitorSource"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkConnectionMonitorTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param endpoint: endpoint block.
        :param location: -
        :param name: -
        :param network_watcher_id: -
        :param test_configuration: test_configuration block.
        :param test_group: test_group block.
        :param auto_start: -
        :param destination: destination block.
        :param interval_in_seconds: -
        :param notes: -
        :param output_workspace_resource_ids: -
        :param source: source block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkConnectionMonitorTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "endpoint": endpoint,
            "location": location,
            "name": name,
            "network_watcher_id": network_watcher_id,
            "test_configuration": test_configuration,
            "test_group": test_group,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_start is not None:
            self._values["auto_start"] = auto_start
        if destination is not None:
            self._values["destination"] = destination
        if interval_in_seconds is not None:
            self._values["interval_in_seconds"] = interval_in_seconds
        if notes is not None:
            self._values["notes"] = notes
        if output_workspace_resource_ids is not None:
            self._values["output_workspace_resource_ids"] = output_workspace_resource_ids
        if source is not None:
            self._values["source"] = source
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def endpoint(self) -> typing.List["NetworkConnectionMonitorEndpoint"]:
        """endpoint block."""
        result = self._values.get("endpoint")
        assert result is not None, "Required property 'endpoint' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_watcher_id(self) -> builtins.str:
        result = self._values.get("network_watcher_id")
        assert result is not None, "Required property 'network_watcher_id' is missing"
        return result

    @builtins.property
    def test_configuration(
        self,
    ) -> typing.List["NetworkConnectionMonitorTestConfiguration"]:
        """test_configuration block."""
        result = self._values.get("test_configuration")
        assert result is not None, "Required property 'test_configuration' is missing"
        return result

    @builtins.property
    def test_group(self) -> typing.List["NetworkConnectionMonitorTestGroup"]:
        """test_group block."""
        result = self._values.get("test_group")
        assert result is not None, "Required property 'test_group' is missing"
        return result

    @builtins.property
    def auto_start(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_start")
        return result

    @builtins.property
    def destination(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorDestination"]]:
        """destination block."""
        result = self._values.get("destination")
        return result

    @builtins.property
    def interval_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval_in_seconds")
        return result

    @builtins.property
    def notes(self) -> typing.Optional[builtins.str]:
        result = self._values.get("notes")
        return result

    @builtins.property
    def output_workspace_resource_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("output_workspace_resource_ids")
        return result

    @builtins.property
    def source(self) -> typing.Optional[typing.List["NetworkConnectionMonitorSource"]]:
        """source block."""
        result = self._values.get("source")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkConnectionMonitorTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorDestination",
    jsii_struct_bases=[],
    name_mapping={
        "address": "address",
        "port": "port",
        "virtual_machine_id": "virtualMachineId",
    },
)
class NetworkConnectionMonitorDestination:
    def __init__(
        self,
        *,
        address: typing.Optional[builtins.str] = None,
        port: typing.Optional[jsii.Number] = None,
        virtual_machine_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param address: -
        :param port: -
        :param virtual_machine_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if address is not None:
            self._values["address"] = address
        if port is not None:
            self._values["port"] = port
        if virtual_machine_id is not None:
            self._values["virtual_machine_id"] = virtual_machine_id

    @builtins.property
    def address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("address")
        return result

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    @builtins.property
    def virtual_machine_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_machine_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorDestination(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorEndpoint",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "address": "address",
        "filter": "filter",
        "virtual_machine_id": "virtualMachineId",
    },
)
class NetworkConnectionMonitorEndpoint:
    def __init__(
        self,
        *,
        name: builtins.str,
        address: typing.Optional[builtins.str] = None,
        filter: typing.Optional[typing.List["NetworkConnectionMonitorEndpointFilter"]] = None,
        virtual_machine_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param address: -
        :param filter: filter block.
        :param virtual_machine_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if address is not None:
            self._values["address"] = address
        if filter is not None:
            self._values["filter"] = filter
        if virtual_machine_id is not None:
            self._values["virtual_machine_id"] = virtual_machine_id

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("address")
        return result

    @builtins.property
    def filter(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorEndpointFilter"]]:
        """filter block."""
        result = self._values.get("filter")
        return result

    @builtins.property
    def virtual_machine_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_machine_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorEndpoint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorEndpointFilter",
    jsii_struct_bases=[],
    name_mapping={"item": "item", "type": "type"},
)
class NetworkConnectionMonitorEndpointFilter:
    def __init__(
        self,
        *,
        item: typing.Optional[typing.List["NetworkConnectionMonitorEndpointFilterItem"]] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param item: item block.
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if item is not None:
            self._values["item"] = item
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def item(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorEndpointFilterItem"]]:
        """item block."""
        result = self._values.get("item")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorEndpointFilter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorEndpointFilterItem",
    jsii_struct_bases=[],
    name_mapping={"address": "address", "type": "type"},
)
class NetworkConnectionMonitorEndpointFilterItem:
    def __init__(
        self,
        *,
        address: typing.Optional[builtins.str] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param address: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if address is not None:
            self._values["address"] = address
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("address")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorEndpointFilterItem(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorSource",
    jsii_struct_bases=[],
    name_mapping={"port": "port", "virtual_machine_id": "virtualMachineId"},
)
class NetworkConnectionMonitorSource:
    def __init__(
        self,
        *,
        port: typing.Optional[jsii.Number] = None,
        virtual_machine_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param port: -
        :param virtual_machine_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if port is not None:
            self._values["port"] = port
        if virtual_machine_id is not None:
            self._values["virtual_machine_id"] = virtual_machine_id

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    @builtins.property
    def virtual_machine_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_machine_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorSource(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTestConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "protocol": "protocol",
        "http_configuration": "httpConfiguration",
        "icmp_configuration": "icmpConfiguration",
        "preferred_ip_version": "preferredIpVersion",
        "success_threshold": "successThreshold",
        "tcp_configuration": "tcpConfiguration",
        "test_frequency_in_seconds": "testFrequencyInSeconds",
    },
)
class NetworkConnectionMonitorTestConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        protocol: builtins.str,
        http_configuration: typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationHttpConfiguration"]] = None,
        icmp_configuration: typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationIcmpConfiguration"]] = None,
        preferred_ip_version: typing.Optional[builtins.str] = None,
        success_threshold: typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationSuccessThreshold"]] = None,
        tcp_configuration: typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationTcpConfiguration"]] = None,
        test_frequency_in_seconds: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param name: -
        :param protocol: -
        :param http_configuration: http_configuration block.
        :param icmp_configuration: icmp_configuration block.
        :param preferred_ip_version: -
        :param success_threshold: success_threshold block.
        :param tcp_configuration: tcp_configuration block.
        :param test_frequency_in_seconds: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "protocol": protocol,
        }
        if http_configuration is not None:
            self._values["http_configuration"] = http_configuration
        if icmp_configuration is not None:
            self._values["icmp_configuration"] = icmp_configuration
        if preferred_ip_version is not None:
            self._values["preferred_ip_version"] = preferred_ip_version
        if success_threshold is not None:
            self._values["success_threshold"] = success_threshold
        if tcp_configuration is not None:
            self._values["tcp_configuration"] = tcp_configuration
        if test_frequency_in_seconds is not None:
            self._values["test_frequency_in_seconds"] = test_frequency_in_seconds

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def http_configuration(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationHttpConfiguration"]]:
        """http_configuration block."""
        result = self._values.get("http_configuration")
        return result

    @builtins.property
    def icmp_configuration(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationIcmpConfiguration"]]:
        """icmp_configuration block."""
        result = self._values.get("icmp_configuration")
        return result

    @builtins.property
    def preferred_ip_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("preferred_ip_version")
        return result

    @builtins.property
    def success_threshold(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationSuccessThreshold"]]:
        """success_threshold block."""
        result = self._values.get("success_threshold")
        return result

    @builtins.property
    def tcp_configuration(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationTcpConfiguration"]]:
        """tcp_configuration block."""
        result = self._values.get("tcp_configuration")
        return result

    @builtins.property
    def test_frequency_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("test_frequency_in_seconds")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTestConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTestConfigurationHttpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "method": "method",
        "path": "path",
        "port": "port",
        "prefer_https": "preferHttps",
        "request_header": "requestHeader",
        "valid_status_code_ranges": "validStatusCodeRanges",
    },
)
class NetworkConnectionMonitorTestConfigurationHttpConfiguration:
    def __init__(
        self,
        *,
        method: typing.Optional[builtins.str] = None,
        path: typing.Optional[builtins.str] = None,
        port: typing.Optional[jsii.Number] = None,
        prefer_https: typing.Optional[builtins.bool] = None,
        request_header: typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationHttpConfigurationRequestHeader"]] = None,
        valid_status_code_ranges: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param method: -
        :param path: -
        :param port: -
        :param prefer_https: -
        :param request_header: request_header block.
        :param valid_status_code_ranges: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if method is not None:
            self._values["method"] = method
        if path is not None:
            self._values["path"] = path
        if port is not None:
            self._values["port"] = port
        if prefer_https is not None:
            self._values["prefer_https"] = prefer_https
        if request_header is not None:
            self._values["request_header"] = request_header
        if valid_status_code_ranges is not None:
            self._values["valid_status_code_ranges"] = valid_status_code_ranges

    @builtins.property
    def method(self) -> typing.Optional[builtins.str]:
        result = self._values.get("method")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("port")
        return result

    @builtins.property
    def prefer_https(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("prefer_https")
        return result

    @builtins.property
    def request_header(
        self,
    ) -> typing.Optional[typing.List["NetworkConnectionMonitorTestConfigurationHttpConfigurationRequestHeader"]]:
        """request_header block."""
        result = self._values.get("request_header")
        return result

    @builtins.property
    def valid_status_code_ranges(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("valid_status_code_ranges")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTestConfigurationHttpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTestConfigurationHttpConfigurationRequestHeader",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "value": "value"},
)
class NetworkConnectionMonitorTestConfigurationHttpConfigurationRequestHeader:
    def __init__(self, *, name: builtins.str, value: builtins.str) -> None:
        """
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTestConfigurationHttpConfigurationRequestHeader(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTestConfigurationIcmpConfiguration",
    jsii_struct_bases=[],
    name_mapping={"trace_route_enabled": "traceRouteEnabled"},
)
class NetworkConnectionMonitorTestConfigurationIcmpConfiguration:
    def __init__(
        self,
        *,
        trace_route_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param trace_route_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if trace_route_enabled is not None:
            self._values["trace_route_enabled"] = trace_route_enabled

    @builtins.property
    def trace_route_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("trace_route_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTestConfigurationIcmpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTestConfigurationSuccessThreshold",
    jsii_struct_bases=[],
    name_mapping={
        "checks_failed_percent": "checksFailedPercent",
        "round_trip_time_ms": "roundTripTimeMs",
    },
)
class NetworkConnectionMonitorTestConfigurationSuccessThreshold:
    def __init__(
        self,
        *,
        checks_failed_percent: typing.Optional[jsii.Number] = None,
        round_trip_time_ms: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param checks_failed_percent: -
        :param round_trip_time_ms: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if checks_failed_percent is not None:
            self._values["checks_failed_percent"] = checks_failed_percent
        if round_trip_time_ms is not None:
            self._values["round_trip_time_ms"] = round_trip_time_ms

    @builtins.property
    def checks_failed_percent(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("checks_failed_percent")
        return result

    @builtins.property
    def round_trip_time_ms(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("round_trip_time_ms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTestConfigurationSuccessThreshold(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTestConfigurationTcpConfiguration",
    jsii_struct_bases=[],
    name_mapping={"port": "port", "trace_route_enabled": "traceRouteEnabled"},
)
class NetworkConnectionMonitorTestConfigurationTcpConfiguration:
    def __init__(
        self,
        *,
        port: jsii.Number,
        trace_route_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param port: -
        :param trace_route_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "port": port,
        }
        if trace_route_enabled is not None:
            self._values["trace_route_enabled"] = trace_route_enabled

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def trace_route_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("trace_route_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTestConfigurationTcpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTestGroup",
    jsii_struct_bases=[],
    name_mapping={
        "destination_endpoints": "destinationEndpoints",
        "name": "name",
        "source_endpoints": "sourceEndpoints",
        "test_configuration_names": "testConfigurationNames",
        "enabled": "enabled",
    },
)
class NetworkConnectionMonitorTestGroup:
    def __init__(
        self,
        *,
        destination_endpoints: typing.List[builtins.str],
        name: builtins.str,
        source_endpoints: typing.List[builtins.str],
        test_configuration_names: typing.List[builtins.str],
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param destination_endpoints: -
        :param name: -
        :param source_endpoints: -
        :param test_configuration_names: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destination_endpoints": destination_endpoints,
            "name": name,
            "source_endpoints": source_endpoints,
            "test_configuration_names": test_configuration_names,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def destination_endpoints(self) -> typing.List[builtins.str]:
        result = self._values.get("destination_endpoints")
        assert result is not None, "Required property 'destination_endpoints' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def source_endpoints(self) -> typing.List[builtins.str]:
        result = self._values.get("source_endpoints")
        assert result is not None, "Required property 'source_endpoints' is missing"
        return result

    @builtins.property
    def test_configuration_names(self) -> typing.List[builtins.str]:
        result = self._values.get("test_configuration_names")
        assert result is not None, "Required property 'test_configuration_names' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTestGroup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkConnectionMonitorTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkConnectionMonitorTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkConnectionMonitorTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkDdosProtectionPlan(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkDdosProtectionPlan",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkDdosProtectionPlanTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkDdosProtectionPlanConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkDdosProtectionPlan, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkIds")
    def virtual_network_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "virtualNetworkIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkDdosProtectionPlanTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkDdosProtectionPlanTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkDdosProtectionPlanTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkDdosProtectionPlanConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetworkDdosProtectionPlanConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkDdosProtectionPlanTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkDdosProtectionPlanTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkDdosProtectionPlanTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkDdosProtectionPlanConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkDdosProtectionPlanTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkDdosProtectionPlanTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkDdosProtectionPlanTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkInterface(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkInterface",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        ip_configuration: typing.List["NetworkInterfaceIpConfiguration"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        enable_accelerated_networking: typing.Optional[builtins.bool] = None,
        enable_ip_forwarding: typing.Optional[builtins.bool] = None,
        internal_dns_name_label: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkInterfaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param ip_configuration: ip_configuration block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param dns_servers: -
        :param enable_accelerated_networking: -
        :param enable_ip_forwarding: -
        :param internal_dns_name_label: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkInterfaceConfig(
            ip_configuration=ip_configuration,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            dns_servers=dns_servers,
            enable_accelerated_networking=enable_accelerated_networking,
            enable_ip_forwarding=enable_ip_forwarding,
            internal_dns_name_label=internal_dns_name_label,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkInterface, self, [scope, id, config])

    @jsii.member(jsii_name="resetDnsServers")
    def reset_dns_servers(self) -> None:
        return jsii.invoke(self, "resetDnsServers", [])

    @jsii.member(jsii_name="resetEnableAcceleratedNetworking")
    def reset_enable_accelerated_networking(self) -> None:
        return jsii.invoke(self, "resetEnableAcceleratedNetworking", [])

    @jsii.member(jsii_name="resetEnableIpForwarding")
    def reset_enable_ip_forwarding(self) -> None:
        return jsii.invoke(self, "resetEnableIpForwarding", [])

    @jsii.member(jsii_name="resetInternalDnsNameLabel")
    def reset_internal_dns_name_label(self) -> None:
        return jsii.invoke(self, "resetInternalDnsNameLabel", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="appliedDnsServers")
    def applied_dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "appliedDnsServers")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internalDomainNameSuffix")
    def internal_domain_name_suffix(self) -> builtins.str:
        return jsii.get(self, "internalDomainNameSuffix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationInput")
    def ip_configuration_input(self) -> typing.List["NetworkInterfaceIpConfiguration"]:
        return jsii.get(self, "ipConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="macAddress")
    def mac_address(self) -> builtins.str:
        return jsii.get(self, "macAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServersInput")
    def dns_servers_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "dnsServersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAcceleratedNetworkingInput")
    def enable_accelerated_networking_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableAcceleratedNetworkingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableIpForwardingInput")
    def enable_ip_forwarding_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableIpForwardingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internalDnsNameLabelInput")
    def internal_dns_name_label_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "internalDnsNameLabelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkInterfaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServers")
    def dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsServers")

    @dns_servers.setter # type: ignore
    def dns_servers(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "dnsServers", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAcceleratedNetworking")
    def enable_accelerated_networking(self) -> builtins.bool:
        return jsii.get(self, "enableAcceleratedNetworking")

    @enable_accelerated_networking.setter # type: ignore
    def enable_accelerated_networking(self, value: builtins.bool) -> None:
        jsii.set(self, "enableAcceleratedNetworking", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableIpForwarding")
    def enable_ip_forwarding(self) -> builtins.bool:
        return jsii.get(self, "enableIpForwarding")

    @enable_ip_forwarding.setter # type: ignore
    def enable_ip_forwarding(self, value: builtins.bool) -> None:
        jsii.set(self, "enableIpForwarding", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internalDnsNameLabel")
    def internal_dns_name_label(self) -> builtins.str:
        return jsii.get(self, "internalDnsNameLabel")

    @internal_dns_name_label.setter # type: ignore
    def internal_dns_name_label(self, value: builtins.str) -> None:
        jsii.set(self, "internalDnsNameLabel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(self) -> typing.List["NetworkInterfaceIpConfiguration"]:
        return jsii.get(self, "ipConfiguration")

    @ip_configuration.setter # type: ignore
    def ip_configuration(
        self,
        value: typing.List["NetworkInterfaceIpConfiguration"],
    ) -> None:
        jsii.set(self, "ipConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkInterfaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkInterfaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class NetworkInterfaceApplicationGatewayBackendAddressPoolAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkInterfaceApplicationGatewayBackendAddressPoolAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_address_pool_id: builtins.str,
        ip_configuration_name: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_address_pool_id: -
        :param ip_configuration_name: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationConfig(
            backend_address_pool_id=backend_address_pool_id,
            ip_configuration_name=ip_configuration_name,
            network_interface_id=network_interface_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkInterfaceApplicationGatewayBackendAddressPoolAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolIdInput")
    def backend_address_pool_id_input(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationNameInput")
    def ip_configuration_name_input(self) -> builtins.str:
        return jsii.get(self, "ipConfigurationNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdInput")
    def network_interface_id_input(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolId")
    def backend_address_pool_id(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolId")

    @backend_address_pool_id.setter # type: ignore
    def backend_address_pool_id(self, value: builtins.str) -> None:
        jsii.set(self, "backendAddressPoolId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationName")
    def ip_configuration_name(self) -> builtins.str:
        return jsii.get(self, "ipConfigurationName")

    @ip_configuration_name.setter # type: ignore
    def ip_configuration_name(self, value: builtins.str) -> None:
        jsii.set(self, "ipConfigurationName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceId")
    def network_interface_id(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceId")

    @network_interface_id.setter # type: ignore
    def network_interface_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkInterfaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(
        self,
    ) -> "NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_address_pool_id": "backendAddressPoolId",
        "ip_configuration_name": "ipConfigurationName",
        "network_interface_id": "networkInterfaceId",
        "timeouts": "timeouts",
    },
)
class NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationConfig(
    cdktf.TerraformMetaArguments,
):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_address_pool_id: builtins.str,
        ip_configuration_name: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_address_pool_id: -
        :param ip_configuration_name: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_address_pool_id": backend_address_pool_id,
            "ip_configuration_name": ip_configuration_name,
            "network_interface_id": network_interface_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_address_pool_id(self) -> builtins.str:
        result = self._values.get("backend_address_pool_id")
        assert result is not None, "Required property 'backend_address_pool_id' is missing"
        return result

    @builtins.property
    def ip_configuration_name(self) -> builtins.str:
        result = self._values.get("ip_configuration_name")
        assert result is not None, "Required property 'ip_configuration_name' is missing"
        return result

    @builtins.property
    def network_interface_id(self) -> builtins.str:
        result = self._values.get("network_interface_id")
        assert result is not None, "Required property 'network_interface_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkInterfaceApplicationSecurityGroupAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkInterfaceApplicationSecurityGroupAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_security_group_id: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceApplicationSecurityGroupAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_security_group_id: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkInterfaceApplicationSecurityGroupAssociationConfig(
            application_security_group_id=application_security_group_id,
            network_interface_id=network_interface_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkInterfaceApplicationSecurityGroupAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationSecurityGroupIdInput")
    def application_security_group_id_input(self) -> builtins.str:
        return jsii.get(self, "applicationSecurityGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdInput")
    def network_interface_id_input(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["NetworkInterfaceApplicationSecurityGroupAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationSecurityGroupId")
    def application_security_group_id(self) -> builtins.str:
        return jsii.get(self, "applicationSecurityGroupId")

    @application_security_group_id.setter # type: ignore
    def application_security_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationSecurityGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceId")
    def network_interface_id(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceId")

    @network_interface_id.setter # type: ignore
    def network_interface_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkInterfaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkInterfaceApplicationSecurityGroupAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "NetworkInterfaceApplicationSecurityGroupAssociationTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceApplicationSecurityGroupAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_security_group_id": "applicationSecurityGroupId",
        "network_interface_id": "networkInterfaceId",
        "timeouts": "timeouts",
    },
)
class NetworkInterfaceApplicationSecurityGroupAssociationConfig(
    cdktf.TerraformMetaArguments,
):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_security_group_id: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceApplicationSecurityGroupAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_security_group_id: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkInterfaceApplicationSecurityGroupAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_security_group_id": application_security_group_id,
            "network_interface_id": network_interface_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_security_group_id(self) -> builtins.str:
        result = self._values.get("application_security_group_id")
        assert result is not None, "Required property 'application_security_group_id' is missing"
        return result

    @builtins.property
    def network_interface_id(self) -> builtins.str:
        result = self._values.get("network_interface_id")
        assert result is not None, "Required property 'network_interface_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["NetworkInterfaceApplicationSecurityGroupAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceApplicationSecurityGroupAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceApplicationSecurityGroupAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkInterfaceApplicationSecurityGroupAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceApplicationSecurityGroupAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkInterfaceBackendAddressPoolAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkInterfaceBackendAddressPoolAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        backend_address_pool_id: builtins.str,
        ip_configuration_name: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceBackendAddressPoolAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_address_pool_id: -
        :param ip_configuration_name: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkInterfaceBackendAddressPoolAssociationConfig(
            backend_address_pool_id=backend_address_pool_id,
            ip_configuration_name=ip_configuration_name,
            network_interface_id=network_interface_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkInterfaceBackendAddressPoolAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolIdInput")
    def backend_address_pool_id_input(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationNameInput")
    def ip_configuration_name_input(self) -> builtins.str:
        return jsii.get(self, "ipConfigurationNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdInput")
    def network_interface_id_input(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["NetworkInterfaceBackendAddressPoolAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backendAddressPoolId")
    def backend_address_pool_id(self) -> builtins.str:
        return jsii.get(self, "backendAddressPoolId")

    @backend_address_pool_id.setter # type: ignore
    def backend_address_pool_id(self, value: builtins.str) -> None:
        jsii.set(self, "backendAddressPoolId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationName")
    def ip_configuration_name(self) -> builtins.str:
        return jsii.get(self, "ipConfigurationName")

    @ip_configuration_name.setter # type: ignore
    def ip_configuration_name(self, value: builtins.str) -> None:
        jsii.set(self, "ipConfigurationName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceId")
    def network_interface_id(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceId")

    @network_interface_id.setter # type: ignore
    def network_interface_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkInterfaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkInterfaceBackendAddressPoolAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "NetworkInterfaceBackendAddressPoolAssociationTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceBackendAddressPoolAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "backend_address_pool_id": "backendAddressPoolId",
        "ip_configuration_name": "ipConfigurationName",
        "network_interface_id": "networkInterfaceId",
        "timeouts": "timeouts",
    },
)
class NetworkInterfaceBackendAddressPoolAssociationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        backend_address_pool_id: builtins.str,
        ip_configuration_name: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceBackendAddressPoolAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_address_pool_id: -
        :param ip_configuration_name: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkInterfaceBackendAddressPoolAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "backend_address_pool_id": backend_address_pool_id,
            "ip_configuration_name": ip_configuration_name,
            "network_interface_id": network_interface_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def backend_address_pool_id(self) -> builtins.str:
        result = self._values.get("backend_address_pool_id")
        assert result is not None, "Required property 'backend_address_pool_id' is missing"
        return result

    @builtins.property
    def ip_configuration_name(self) -> builtins.str:
        result = self._values.get("ip_configuration_name")
        assert result is not None, "Required property 'ip_configuration_name' is missing"
        return result

    @builtins.property
    def network_interface_id(self) -> builtins.str:
        result = self._values.get("network_interface_id")
        assert result is not None, "Required property 'network_interface_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["NetworkInterfaceBackendAddressPoolAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceBackendAddressPoolAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceBackendAddressPoolAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkInterfaceBackendAddressPoolAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceBackendAddressPoolAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "ip_configuration": "ipConfiguration",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "dns_servers": "dnsServers",
        "enable_accelerated_networking": "enableAcceleratedNetworking",
        "enable_ip_forwarding": "enableIpForwarding",
        "internal_dns_name_label": "internalDnsNameLabel",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetworkInterfaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        ip_configuration: typing.List["NetworkInterfaceIpConfiguration"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        enable_accelerated_networking: typing.Optional[builtins.bool] = None,
        enable_ip_forwarding: typing.Optional[builtins.bool] = None,
        internal_dns_name_label: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkInterfaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param ip_configuration: ip_configuration block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param dns_servers: -
        :param enable_accelerated_networking: -
        :param enable_ip_forwarding: -
        :param internal_dns_name_label: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkInterfaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "ip_configuration": ip_configuration,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if dns_servers is not None:
            self._values["dns_servers"] = dns_servers
        if enable_accelerated_networking is not None:
            self._values["enable_accelerated_networking"] = enable_accelerated_networking
        if enable_ip_forwarding is not None:
            self._values["enable_ip_forwarding"] = enable_ip_forwarding
        if internal_dns_name_label is not None:
            self._values["internal_dns_name_label"] = internal_dns_name_label
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def ip_configuration(self) -> typing.List["NetworkInterfaceIpConfiguration"]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        assert result is not None, "Required property 'ip_configuration' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def dns_servers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("dns_servers")
        return result

    @builtins.property
    def enable_accelerated_networking(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_accelerated_networking")
        return result

    @builtins.property
    def enable_ip_forwarding(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_ip_forwarding")
        return result

    @builtins.property
    def internal_dns_name_label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("internal_dns_name_label")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkInterfaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "private_ip_address_allocation": "privateIpAddressAllocation",
        "primary": "primary",
        "private_ip_address": "privateIpAddress",
        "private_ip_address_version": "privateIpAddressVersion",
        "public_ip_address_id": "publicIpAddressId",
        "subnet_id": "subnetId",
    },
)
class NetworkInterfaceIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        private_ip_address_allocation: builtins.str,
        primary: typing.Optional[builtins.bool] = None,
        private_ip_address: typing.Optional[builtins.str] = None,
        private_ip_address_version: typing.Optional[builtins.str] = None,
        public_ip_address_id: typing.Optional[builtins.str] = None,
        subnet_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param private_ip_address_allocation: -
        :param primary: -
        :param private_ip_address: -
        :param private_ip_address_version: -
        :param public_ip_address_id: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "private_ip_address_allocation": private_ip_address_allocation,
        }
        if primary is not None:
            self._values["primary"] = primary
        if private_ip_address is not None:
            self._values["private_ip_address"] = private_ip_address
        if private_ip_address_version is not None:
            self._values["private_ip_address_version"] = private_ip_address_version
        if public_ip_address_id is not None:
            self._values["public_ip_address_id"] = public_ip_address_id
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def private_ip_address_allocation(self) -> builtins.str:
        result = self._values.get("private_ip_address_allocation")
        assert result is not None, "Required property 'private_ip_address_allocation' is missing"
        return result

    @builtins.property
    def primary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("primary")
        return result

    @builtins.property
    def private_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address")
        return result

    @builtins.property
    def private_ip_address_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address_version")
        return result

    @builtins.property
    def public_ip_address_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_address_id")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkInterfaceNatRuleAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkInterfaceNatRuleAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        ip_configuration_name: builtins.str,
        nat_rule_id: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceNatRuleAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param ip_configuration_name: -
        :param nat_rule_id: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkInterfaceNatRuleAssociationConfig(
            ip_configuration_name=ip_configuration_name,
            nat_rule_id=nat_rule_id,
            network_interface_id=network_interface_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkInterfaceNatRuleAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationNameInput")
    def ip_configuration_name_input(self) -> builtins.str:
        return jsii.get(self, "ipConfigurationNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natRuleIdInput")
    def nat_rule_id_input(self) -> builtins.str:
        return jsii.get(self, "natRuleIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdInput")
    def network_interface_id_input(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["NetworkInterfaceNatRuleAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationName")
    def ip_configuration_name(self) -> builtins.str:
        return jsii.get(self, "ipConfigurationName")

    @ip_configuration_name.setter # type: ignore
    def ip_configuration_name(self, value: builtins.str) -> None:
        jsii.set(self, "ipConfigurationName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natRuleId")
    def nat_rule_id(self) -> builtins.str:
        return jsii.get(self, "natRuleId")

    @nat_rule_id.setter # type: ignore
    def nat_rule_id(self, value: builtins.str) -> None:
        jsii.set(self, "natRuleId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceId")
    def network_interface_id(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceId")

    @network_interface_id.setter # type: ignore
    def network_interface_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkInterfaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkInterfaceNatRuleAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkInterfaceNatRuleAssociationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceNatRuleAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "ip_configuration_name": "ipConfigurationName",
        "nat_rule_id": "natRuleId",
        "network_interface_id": "networkInterfaceId",
        "timeouts": "timeouts",
    },
)
class NetworkInterfaceNatRuleAssociationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        ip_configuration_name: builtins.str,
        nat_rule_id: builtins.str,
        network_interface_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceNatRuleAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param ip_configuration_name: -
        :param nat_rule_id: -
        :param network_interface_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkInterfaceNatRuleAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "ip_configuration_name": ip_configuration_name,
            "nat_rule_id": nat_rule_id,
            "network_interface_id": network_interface_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def ip_configuration_name(self) -> builtins.str:
        result = self._values.get("ip_configuration_name")
        assert result is not None, "Required property 'ip_configuration_name' is missing"
        return result

    @builtins.property
    def nat_rule_id(self) -> builtins.str:
        result = self._values.get("nat_rule_id")
        assert result is not None, "Required property 'nat_rule_id' is missing"
        return result

    @builtins.property
    def network_interface_id(self) -> builtins.str:
        result = self._values.get("network_interface_id")
        assert result is not None, "Required property 'network_interface_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkInterfaceNatRuleAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceNatRuleAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceNatRuleAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkInterfaceNatRuleAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceNatRuleAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkInterfaceSecurityGroupAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkInterfaceSecurityGroupAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        network_interface_id: builtins.str,
        network_security_group_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceSecurityGroupAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param network_interface_id: -
        :param network_security_group_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkInterfaceSecurityGroupAssociationConfig(
            network_interface_id=network_interface_id,
            network_security_group_id=network_security_group_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkInterfaceSecurityGroupAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdInput")
    def network_interface_id_input(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupIdInput")
    def network_security_group_id_input(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["NetworkInterfaceSecurityGroupAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceId")
    def network_interface_id(self) -> builtins.str:
        return jsii.get(self, "networkInterfaceId")

    @network_interface_id.setter # type: ignore
    def network_interface_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkInterfaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupId")
    def network_security_group_id(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupId")

    @network_security_group_id.setter # type: ignore
    def network_security_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkSecurityGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkInterfaceSecurityGroupAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "NetworkInterfaceSecurityGroupAssociationTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceSecurityGroupAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "network_interface_id": "networkInterfaceId",
        "network_security_group_id": "networkSecurityGroupId",
        "timeouts": "timeouts",
    },
)
class NetworkInterfaceSecurityGroupAssociationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        network_interface_id: builtins.str,
        network_security_group_id: builtins.str,
        timeouts: typing.Optional["NetworkInterfaceSecurityGroupAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param network_interface_id: -
        :param network_security_group_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkInterfaceSecurityGroupAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "network_interface_id": network_interface_id,
            "network_security_group_id": network_security_group_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def network_interface_id(self) -> builtins.str:
        result = self._values.get("network_interface_id")
        assert result is not None, "Required property 'network_interface_id' is missing"
        return result

    @builtins.property
    def network_security_group_id(self) -> builtins.str:
        result = self._values.get("network_security_group_id")
        assert result is not None, "Required property 'network_security_group_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["NetworkInterfaceSecurityGroupAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceSecurityGroupAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceSecurityGroupAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkInterfaceSecurityGroupAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceSecurityGroupAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkInterfaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkInterfaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkInterfaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkPacketCapture(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkPacketCapture",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        network_watcher_name: builtins.str,
        resource_group_name: builtins.str,
        storage_location: typing.List["NetworkPacketCaptureStorageLocation"],
        target_resource_id: builtins.str,
        filter: typing.Optional[typing.List["NetworkPacketCaptureFilter"]] = None,
        maximum_bytes_per_packet: typing.Optional[jsii.Number] = None,
        maximum_bytes_per_session: typing.Optional[jsii.Number] = None,
        maximum_capture_duration: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["NetworkPacketCaptureTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param network_watcher_name: -
        :param resource_group_name: -
        :param storage_location: storage_location block.
        :param target_resource_id: -
        :param filter: filter block.
        :param maximum_bytes_per_packet: -
        :param maximum_bytes_per_session: -
        :param maximum_capture_duration: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkPacketCaptureConfig(
            name=name,
            network_watcher_name=network_watcher_name,
            resource_group_name=resource_group_name,
            storage_location=storage_location,
            target_resource_id=target_resource_id,
            filter=filter,
            maximum_bytes_per_packet=maximum_bytes_per_packet,
            maximum_bytes_per_session=maximum_bytes_per_session,
            maximum_capture_duration=maximum_capture_duration,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkPacketCapture, self, [scope, id, config])

    @jsii.member(jsii_name="resetFilter")
    def reset_filter(self) -> None:
        return jsii.invoke(self, "resetFilter", [])

    @jsii.member(jsii_name="resetMaximumBytesPerPacket")
    def reset_maximum_bytes_per_packet(self) -> None:
        return jsii.invoke(self, "resetMaximumBytesPerPacket", [])

    @jsii.member(jsii_name="resetMaximumBytesPerSession")
    def reset_maximum_bytes_per_session(self) -> None:
        return jsii.invoke(self, "resetMaximumBytesPerSession", [])

    @jsii.member(jsii_name="resetMaximumCaptureDuration")
    def reset_maximum_capture_duration(self) -> None:
        return jsii.invoke(self, "resetMaximumCaptureDuration", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherNameInput")
    def network_watcher_name_input(self) -> builtins.str:
        return jsii.get(self, "networkWatcherNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageLocationInput")
    def storage_location_input(
        self,
    ) -> typing.List["NetworkPacketCaptureStorageLocation"]:
        return jsii.get(self, "storageLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterInput")
    def filter_input(
        self,
    ) -> typing.Optional[typing.List["NetworkPacketCaptureFilter"]]:
        return jsii.get(self, "filterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerPacketInput")
    def maximum_bytes_per_packet_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumBytesPerPacketInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerSessionInput")
    def maximum_bytes_per_session_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumBytesPerSessionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumCaptureDurationInput")
    def maximum_capture_duration_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumCaptureDurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkPacketCaptureTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filter")
    def filter(self) -> typing.List["NetworkPacketCaptureFilter"]:
        return jsii.get(self, "filter")

    @filter.setter # type: ignore
    def filter(self, value: typing.List["NetworkPacketCaptureFilter"]) -> None:
        jsii.set(self, "filter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerPacket")
    def maximum_bytes_per_packet(self) -> jsii.Number:
        return jsii.get(self, "maximumBytesPerPacket")

    @maximum_bytes_per_packet.setter # type: ignore
    def maximum_bytes_per_packet(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumBytesPerPacket", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerSession")
    def maximum_bytes_per_session(self) -> jsii.Number:
        return jsii.get(self, "maximumBytesPerSession")

    @maximum_bytes_per_session.setter # type: ignore
    def maximum_bytes_per_session(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumBytesPerSession", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumCaptureDuration")
    def maximum_capture_duration(self) -> jsii.Number:
        return jsii.get(self, "maximumCaptureDuration")

    @maximum_capture_duration.setter # type: ignore
    def maximum_capture_duration(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumCaptureDuration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherName")
    def network_watcher_name(self) -> builtins.str:
        return jsii.get(self, "networkWatcherName")

    @network_watcher_name.setter # type: ignore
    def network_watcher_name(self, value: builtins.str) -> None:
        jsii.set(self, "networkWatcherName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageLocation")
    def storage_location(self) -> typing.List["NetworkPacketCaptureStorageLocation"]:
        return jsii.get(self, "storageLocation")

    @storage_location.setter # type: ignore
    def storage_location(
        self,
        value: typing.List["NetworkPacketCaptureStorageLocation"],
    ) -> None:
        jsii.set(self, "storageLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkPacketCaptureTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkPacketCaptureTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkPacketCaptureConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "network_watcher_name": "networkWatcherName",
        "resource_group_name": "resourceGroupName",
        "storage_location": "storageLocation",
        "target_resource_id": "targetResourceId",
        "filter": "filter",
        "maximum_bytes_per_packet": "maximumBytesPerPacket",
        "maximum_bytes_per_session": "maximumBytesPerSession",
        "maximum_capture_duration": "maximumCaptureDuration",
        "timeouts": "timeouts",
    },
)
class NetworkPacketCaptureConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        network_watcher_name: builtins.str,
        resource_group_name: builtins.str,
        storage_location: typing.List["NetworkPacketCaptureStorageLocation"],
        target_resource_id: builtins.str,
        filter: typing.Optional[typing.List["NetworkPacketCaptureFilter"]] = None,
        maximum_bytes_per_packet: typing.Optional[jsii.Number] = None,
        maximum_bytes_per_session: typing.Optional[jsii.Number] = None,
        maximum_capture_duration: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["NetworkPacketCaptureTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param network_watcher_name: -
        :param resource_group_name: -
        :param storage_location: storage_location block.
        :param target_resource_id: -
        :param filter: filter block.
        :param maximum_bytes_per_packet: -
        :param maximum_bytes_per_session: -
        :param maximum_capture_duration: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkPacketCaptureTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "network_watcher_name": network_watcher_name,
            "resource_group_name": resource_group_name,
            "storage_location": storage_location,
            "target_resource_id": target_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if filter is not None:
            self._values["filter"] = filter
        if maximum_bytes_per_packet is not None:
            self._values["maximum_bytes_per_packet"] = maximum_bytes_per_packet
        if maximum_bytes_per_session is not None:
            self._values["maximum_bytes_per_session"] = maximum_bytes_per_session
        if maximum_capture_duration is not None:
            self._values["maximum_capture_duration"] = maximum_capture_duration
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_watcher_name(self) -> builtins.str:
        result = self._values.get("network_watcher_name")
        assert result is not None, "Required property 'network_watcher_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_location(self) -> typing.List["NetworkPacketCaptureStorageLocation"]:
        """storage_location block."""
        result = self._values.get("storage_location")
        assert result is not None, "Required property 'storage_location' is missing"
        return result

    @builtins.property
    def target_resource_id(self) -> builtins.str:
        result = self._values.get("target_resource_id")
        assert result is not None, "Required property 'target_resource_id' is missing"
        return result

    @builtins.property
    def filter(self) -> typing.Optional[typing.List["NetworkPacketCaptureFilter"]]:
        """filter block."""
        result = self._values.get("filter")
        return result

    @builtins.property
    def maximum_bytes_per_packet(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_bytes_per_packet")
        return result

    @builtins.property
    def maximum_bytes_per_session(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_bytes_per_session")
        return result

    @builtins.property
    def maximum_capture_duration(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_capture_duration")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkPacketCaptureTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkPacketCaptureConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkPacketCaptureFilter",
    jsii_struct_bases=[],
    name_mapping={
        "protocol": "protocol",
        "local_ip_address": "localIpAddress",
        "local_port": "localPort",
        "remote_ip_address": "remoteIpAddress",
        "remote_port": "remotePort",
    },
)
class NetworkPacketCaptureFilter:
    def __init__(
        self,
        *,
        protocol: builtins.str,
        local_ip_address: typing.Optional[builtins.str] = None,
        local_port: typing.Optional[builtins.str] = None,
        remote_ip_address: typing.Optional[builtins.str] = None,
        remote_port: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param protocol: -
        :param local_ip_address: -
        :param local_port: -
        :param remote_ip_address: -
        :param remote_port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "protocol": protocol,
        }
        if local_ip_address is not None:
            self._values["local_ip_address"] = local_ip_address
        if local_port is not None:
            self._values["local_port"] = local_port
        if remote_ip_address is not None:
            self._values["remote_ip_address"] = remote_ip_address
        if remote_port is not None:
            self._values["remote_port"] = remote_port

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def local_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("local_ip_address")
        return result

    @builtins.property
    def local_port(self) -> typing.Optional[builtins.str]:
        result = self._values.get("local_port")
        return result

    @builtins.property
    def remote_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("remote_ip_address")
        return result

    @builtins.property
    def remote_port(self) -> typing.Optional[builtins.str]:
        result = self._values.get("remote_port")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkPacketCaptureFilter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkPacketCaptureStorageLocation",
    jsii_struct_bases=[],
    name_mapping={"file_path": "filePath", "storage_account_id": "storageAccountId"},
)
class NetworkPacketCaptureStorageLocation:
    def __init__(
        self,
        *,
        file_path: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param file_path: -
        :param storage_account_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if file_path is not None:
            self._values["file_path"] = file_path
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id

    @builtins.property
    def file_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_path")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkPacketCaptureStorageLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkPacketCaptureTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkPacketCaptureTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkPacketCaptureTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkProfile(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkProfile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        container_network_interface: typing.List["NetworkProfileContainerNetworkInterface"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkProfileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param container_network_interface: container_network_interface block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkProfileConfig(
            container_network_interface=container_network_interface,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkProfile, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerNetworkInterfaceIds")
    def container_network_interface_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "containerNetworkInterfaceIds")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerNetworkInterfaceInput")
    def container_network_interface_input(
        self,
    ) -> typing.List["NetworkProfileContainerNetworkInterface"]:
        return jsii.get(self, "containerNetworkInterfaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkProfileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerNetworkInterface")
    def container_network_interface(
        self,
    ) -> typing.List["NetworkProfileContainerNetworkInterface"]:
        return jsii.get(self, "containerNetworkInterface")

    @container_network_interface.setter # type: ignore
    def container_network_interface(
        self,
        value: typing.List["NetworkProfileContainerNetworkInterface"],
    ) -> None:
        jsii.set(self, "containerNetworkInterface", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkProfileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkProfileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkProfileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "container_network_interface": "containerNetworkInterface",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetworkProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        container_network_interface: typing.List["NetworkProfileContainerNetworkInterface"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkProfileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param container_network_interface: container_network_interface block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkProfileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "container_network_interface": container_network_interface,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def container_network_interface(
        self,
    ) -> typing.List["NetworkProfileContainerNetworkInterface"]:
        """container_network_interface block."""
        result = self._values.get("container_network_interface")
        assert result is not None, "Required property 'container_network_interface' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkProfileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkProfileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkProfileContainerNetworkInterface",
    jsii_struct_bases=[],
    name_mapping={"ip_configuration": "ipConfiguration", "name": "name"},
)
class NetworkProfileContainerNetworkInterface:
    def __init__(
        self,
        *,
        ip_configuration: typing.List["NetworkProfileContainerNetworkInterfaceIpConfiguration"],
        name: builtins.str,
    ) -> None:
        """
        :param ip_configuration: ip_configuration block.
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "ip_configuration": ip_configuration,
            "name": name,
        }

    @builtins.property
    def ip_configuration(
        self,
    ) -> typing.List["NetworkProfileContainerNetworkInterfaceIpConfiguration"]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        assert result is not None, "Required property 'ip_configuration' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkProfileContainerNetworkInterface(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkProfileContainerNetworkInterfaceIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "subnet_id": "subnetId"},
)
class NetworkProfileContainerNetworkInterfaceIpConfiguration:
    def __init__(self, *, name: builtins.str, subnet_id: builtins.str) -> None:
        """
        :param name: -
        :param subnet_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "subnet_id": subnet_id,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkProfileContainerNetworkInterfaceIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkProfileTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkProfileTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkProfileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkSecurityGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkSecurityGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        security_rule: typing.Optional[typing.List["NetworkSecurityGroupSecurityRule"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkSecurityGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param security_rule: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkSecurityGroupConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            security_rule=security_rule,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkSecurityGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetSecurityRule")
    def reset_security_rule(self) -> None:
        return jsii.invoke(self, "resetSecurityRule", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="securityRuleInput")
    def security_rule_input(
        self,
    ) -> typing.Optional[typing.List["NetworkSecurityGroupSecurityRule"]]:
        return jsii.get(self, "securityRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkSecurityGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="securityRule")
    def security_rule(self) -> typing.List["NetworkSecurityGroupSecurityRule"]:
        return jsii.get(self, "securityRule")

    @security_rule.setter # type: ignore
    def security_rule(
        self,
        value: typing.List["NetworkSecurityGroupSecurityRule"],
    ) -> None:
        jsii.set(self, "securityRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkSecurityGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkSecurityGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkSecurityGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "security_rule": "securityRule",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetworkSecurityGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        security_rule: typing.Optional[typing.List["NetworkSecurityGroupSecurityRule"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkSecurityGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param security_rule: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkSecurityGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if security_rule is not None:
            self._values["security_rule"] = security_rule
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def security_rule(
        self,
    ) -> typing.Optional[typing.List["NetworkSecurityGroupSecurityRule"]]:
        result = self._values.get("security_rule")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkSecurityGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkSecurityGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkSecurityGroupSecurityRule",
    jsii_struct_bases=[],
    name_mapping={
        "access": "access",
        "description": "description",
        "destination_address_prefix": "destinationAddressPrefix",
        "destination_address_prefixes": "destinationAddressPrefixes",
        "destination_application_security_group_ids": "destinationApplicationSecurityGroupIds",
        "destination_port_range": "destinationPortRange",
        "destination_port_ranges": "destinationPortRanges",
        "direction": "direction",
        "name": "name",
        "priority": "priority",
        "protocol": "protocol",
        "source_address_prefix": "sourceAddressPrefix",
        "source_address_prefixes": "sourceAddressPrefixes",
        "source_application_security_group_ids": "sourceApplicationSecurityGroupIds",
        "source_port_range": "sourcePortRange",
        "source_port_ranges": "sourcePortRanges",
    },
)
class NetworkSecurityGroupSecurityRule:
    def __init__(
        self,
        *,
        access: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        destination_address_prefix: typing.Optional[builtins.str] = None,
        destination_address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        destination_application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        destination_port_range: typing.Optional[builtins.str] = None,
        destination_port_ranges: typing.Optional[typing.List[builtins.str]] = None,
        direction: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        priority: typing.Optional[jsii.Number] = None,
        protocol: typing.Optional[builtins.str] = None,
        source_address_prefix: typing.Optional[builtins.str] = None,
        source_address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        source_application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        source_port_range: typing.Optional[builtins.str] = None,
        source_port_ranges: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param access: -
        :param description: -
        :param destination_address_prefix: -
        :param destination_address_prefixes: -
        :param destination_application_security_group_ids: -
        :param destination_port_range: -
        :param destination_port_ranges: -
        :param direction: -
        :param name: -
        :param priority: -
        :param protocol: -
        :param source_address_prefix: -
        :param source_address_prefixes: -
        :param source_application_security_group_ids: -
        :param source_port_range: -
        :param source_port_ranges: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if access is not None:
            self._values["access"] = access
        if description is not None:
            self._values["description"] = description
        if destination_address_prefix is not None:
            self._values["destination_address_prefix"] = destination_address_prefix
        if destination_address_prefixes is not None:
            self._values["destination_address_prefixes"] = destination_address_prefixes
        if destination_application_security_group_ids is not None:
            self._values["destination_application_security_group_ids"] = destination_application_security_group_ids
        if destination_port_range is not None:
            self._values["destination_port_range"] = destination_port_range
        if destination_port_ranges is not None:
            self._values["destination_port_ranges"] = destination_port_ranges
        if direction is not None:
            self._values["direction"] = direction
        if name is not None:
            self._values["name"] = name
        if priority is not None:
            self._values["priority"] = priority
        if protocol is not None:
            self._values["protocol"] = protocol
        if source_address_prefix is not None:
            self._values["source_address_prefix"] = source_address_prefix
        if source_address_prefixes is not None:
            self._values["source_address_prefixes"] = source_address_prefixes
        if source_application_security_group_ids is not None:
            self._values["source_application_security_group_ids"] = source_application_security_group_ids
        if source_port_range is not None:
            self._values["source_port_range"] = source_port_range
        if source_port_ranges is not None:
            self._values["source_port_ranges"] = source_port_ranges

    @builtins.property
    def access(self) -> typing.Optional[builtins.str]:
        result = self._values.get("access")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def destination_address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("destination_address_prefix")
        return result

    @builtins.property
    def destination_address_prefixes(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_address_prefixes")
        return result

    @builtins.property
    def destination_application_security_group_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_application_security_group_ids")
        return result

    @builtins.property
    def destination_port_range(self) -> typing.Optional[builtins.str]:
        result = self._values.get("destination_port_range")
        return result

    @builtins.property
    def destination_port_ranges(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_port_ranges")
        return result

    @builtins.property
    def direction(self) -> typing.Optional[builtins.str]:
        result = self._values.get("direction")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protocol")
        return result

    @builtins.property
    def source_address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_address_prefix")
        return result

    @builtins.property
    def source_address_prefixes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_address_prefixes")
        return result

    @builtins.property
    def source_application_security_group_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_application_security_group_ids")
        return result

    @builtins.property
    def source_port_range(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_port_range")
        return result

    @builtins.property
    def source_port_ranges(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_port_ranges")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkSecurityGroupSecurityRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkSecurityGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkSecurityGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkSecurityGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkSecurityRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkSecurityRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        access: builtins.str,
        direction: builtins.str,
        name: builtins.str,
        network_security_group_name: builtins.str,
        priority: jsii.Number,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        destination_address_prefix: typing.Optional[builtins.str] = None,
        destination_address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        destination_application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        destination_port_range: typing.Optional[builtins.str] = None,
        destination_port_ranges: typing.Optional[typing.List[builtins.str]] = None,
        source_address_prefix: typing.Optional[builtins.str] = None,
        source_address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        source_application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        source_port_range: typing.Optional[builtins.str] = None,
        source_port_ranges: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["NetworkSecurityRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param access: -
        :param direction: -
        :param name: -
        :param network_security_group_name: -
        :param priority: -
        :param protocol: -
        :param resource_group_name: -
        :param description: -
        :param destination_address_prefix: -
        :param destination_address_prefixes: -
        :param destination_application_security_group_ids: -
        :param destination_port_range: -
        :param destination_port_ranges: -
        :param source_address_prefix: -
        :param source_address_prefixes: -
        :param source_application_security_group_ids: -
        :param source_port_range: -
        :param source_port_ranges: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkSecurityRuleConfig(
            access=access,
            direction=direction,
            name=name,
            network_security_group_name=network_security_group_name,
            priority=priority,
            protocol=protocol,
            resource_group_name=resource_group_name,
            description=description,
            destination_address_prefix=destination_address_prefix,
            destination_address_prefixes=destination_address_prefixes,
            destination_application_security_group_ids=destination_application_security_group_ids,
            destination_port_range=destination_port_range,
            destination_port_ranges=destination_port_ranges,
            source_address_prefix=source_address_prefix,
            source_address_prefixes=source_address_prefixes,
            source_application_security_group_ids=source_application_security_group_ids,
            source_port_range=source_port_range,
            source_port_ranges=source_port_ranges,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkSecurityRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetDestinationAddressPrefix")
    def reset_destination_address_prefix(self) -> None:
        return jsii.invoke(self, "resetDestinationAddressPrefix", [])

    @jsii.member(jsii_name="resetDestinationAddressPrefixes")
    def reset_destination_address_prefixes(self) -> None:
        return jsii.invoke(self, "resetDestinationAddressPrefixes", [])

    @jsii.member(jsii_name="resetDestinationApplicationSecurityGroupIds")
    def reset_destination_application_security_group_ids(self) -> None:
        return jsii.invoke(self, "resetDestinationApplicationSecurityGroupIds", [])

    @jsii.member(jsii_name="resetDestinationPortRange")
    def reset_destination_port_range(self) -> None:
        return jsii.invoke(self, "resetDestinationPortRange", [])

    @jsii.member(jsii_name="resetDestinationPortRanges")
    def reset_destination_port_ranges(self) -> None:
        return jsii.invoke(self, "resetDestinationPortRanges", [])

    @jsii.member(jsii_name="resetSourceAddressPrefix")
    def reset_source_address_prefix(self) -> None:
        return jsii.invoke(self, "resetSourceAddressPrefix", [])

    @jsii.member(jsii_name="resetSourceAddressPrefixes")
    def reset_source_address_prefixes(self) -> None:
        return jsii.invoke(self, "resetSourceAddressPrefixes", [])

    @jsii.member(jsii_name="resetSourceApplicationSecurityGroupIds")
    def reset_source_application_security_group_ids(self) -> None:
        return jsii.invoke(self, "resetSourceApplicationSecurityGroupIds", [])

    @jsii.member(jsii_name="resetSourcePortRange")
    def reset_source_port_range(self) -> None:
        return jsii.invoke(self, "resetSourcePortRange", [])

    @jsii.member(jsii_name="resetSourcePortRanges")
    def reset_source_port_ranges(self) -> None:
        return jsii.invoke(self, "resetSourcePortRanges", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessInput")
    def access_input(self) -> builtins.str:
        return jsii.get(self, "accessInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="directionInput")
    def direction_input(self) -> builtins.str:
        return jsii.get(self, "directionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupNameInput")
    def network_security_group_name_input(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> jsii.Number:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocolInput")
    def protocol_input(self) -> builtins.str:
        return jsii.get(self, "protocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationAddressPrefixesInput")
    def destination_address_prefixes_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "destinationAddressPrefixesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationAddressPrefixInput")
    def destination_address_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "destinationAddressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationApplicationSecurityGroupIdsInput")
    def destination_application_security_group_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "destinationApplicationSecurityGroupIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationPortRangeInput")
    def destination_port_range_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "destinationPortRangeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationPortRangesInput")
    def destination_port_ranges_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "destinationPortRangesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceAddressPrefixesInput")
    def source_address_prefixes_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "sourceAddressPrefixesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceAddressPrefixInput")
    def source_address_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceAddressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceApplicationSecurityGroupIdsInput")
    def source_application_security_group_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "sourceApplicationSecurityGroupIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePortRangeInput")
    def source_port_range_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourcePortRangeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePortRangesInput")
    def source_port_ranges_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "sourcePortRangesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkSecurityRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="access")
    def access(self) -> builtins.str:
        return jsii.get(self, "access")

    @access.setter # type: ignore
    def access(self, value: builtins.str) -> None:
        jsii.set(self, "access", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationAddressPrefix")
    def destination_address_prefix(self) -> builtins.str:
        return jsii.get(self, "destinationAddressPrefix")

    @destination_address_prefix.setter # type: ignore
    def destination_address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "destinationAddressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationAddressPrefixes")
    def destination_address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "destinationAddressPrefixes")

    @destination_address_prefixes.setter # type: ignore
    def destination_address_prefixes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "destinationAddressPrefixes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationApplicationSecurityGroupIds")
    def destination_application_security_group_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "destinationApplicationSecurityGroupIds")

    @destination_application_security_group_ids.setter # type: ignore
    def destination_application_security_group_ids(
        self,
        value: typing.List[builtins.str],
    ) -> None:
        jsii.set(self, "destinationApplicationSecurityGroupIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationPortRange")
    def destination_port_range(self) -> builtins.str:
        return jsii.get(self, "destinationPortRange")

    @destination_port_range.setter # type: ignore
    def destination_port_range(self, value: builtins.str) -> None:
        jsii.set(self, "destinationPortRange", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="destinationPortRanges")
    def destination_port_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "destinationPortRanges")

    @destination_port_ranges.setter # type: ignore
    def destination_port_ranges(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "destinationPortRanges", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="direction")
    def direction(self) -> builtins.str:
        return jsii.get(self, "direction")

    @direction.setter # type: ignore
    def direction(self, value: builtins.str) -> None:
        jsii.set(self, "direction", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupName")
    def network_security_group_name(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupName")

    @network_security_group_name.setter # type: ignore
    def network_security_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "networkSecurityGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: jsii.Number) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> builtins.str:
        return jsii.get(self, "protocol")

    @protocol.setter # type: ignore
    def protocol(self, value: builtins.str) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceAddressPrefix")
    def source_address_prefix(self) -> builtins.str:
        return jsii.get(self, "sourceAddressPrefix")

    @source_address_prefix.setter # type: ignore
    def source_address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "sourceAddressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceAddressPrefixes")
    def source_address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "sourceAddressPrefixes")

    @source_address_prefixes.setter # type: ignore
    def source_address_prefixes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "sourceAddressPrefixes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceApplicationSecurityGroupIds")
    def source_application_security_group_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "sourceApplicationSecurityGroupIds")

    @source_application_security_group_ids.setter # type: ignore
    def source_application_security_group_ids(
        self,
        value: typing.List[builtins.str],
    ) -> None:
        jsii.set(self, "sourceApplicationSecurityGroupIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePortRange")
    def source_port_range(self) -> builtins.str:
        return jsii.get(self, "sourcePortRange")

    @source_port_range.setter # type: ignore
    def source_port_range(self, value: builtins.str) -> None:
        jsii.set(self, "sourcePortRange", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourcePortRanges")
    def source_port_ranges(self) -> typing.List[builtins.str]:
        return jsii.get(self, "sourcePortRanges")

    @source_port_ranges.setter # type: ignore
    def source_port_ranges(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "sourcePortRanges", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkSecurityRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkSecurityRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkSecurityRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "access": "access",
        "direction": "direction",
        "name": "name",
        "network_security_group_name": "networkSecurityGroupName",
        "priority": "priority",
        "protocol": "protocol",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "destination_address_prefix": "destinationAddressPrefix",
        "destination_address_prefixes": "destinationAddressPrefixes",
        "destination_application_security_group_ids": "destinationApplicationSecurityGroupIds",
        "destination_port_range": "destinationPortRange",
        "destination_port_ranges": "destinationPortRanges",
        "source_address_prefix": "sourceAddressPrefix",
        "source_address_prefixes": "sourceAddressPrefixes",
        "source_application_security_group_ids": "sourceApplicationSecurityGroupIds",
        "source_port_range": "sourcePortRange",
        "source_port_ranges": "sourcePortRanges",
        "timeouts": "timeouts",
    },
)
class NetworkSecurityRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        access: builtins.str,
        direction: builtins.str,
        name: builtins.str,
        network_security_group_name: builtins.str,
        priority: jsii.Number,
        protocol: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        destination_address_prefix: typing.Optional[builtins.str] = None,
        destination_address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        destination_application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        destination_port_range: typing.Optional[builtins.str] = None,
        destination_port_ranges: typing.Optional[typing.List[builtins.str]] = None,
        source_address_prefix: typing.Optional[builtins.str] = None,
        source_address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        source_application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        source_port_range: typing.Optional[builtins.str] = None,
        source_port_ranges: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["NetworkSecurityRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param access: -
        :param direction: -
        :param name: -
        :param network_security_group_name: -
        :param priority: -
        :param protocol: -
        :param resource_group_name: -
        :param description: -
        :param destination_address_prefix: -
        :param destination_address_prefixes: -
        :param destination_application_security_group_ids: -
        :param destination_port_range: -
        :param destination_port_ranges: -
        :param source_address_prefix: -
        :param source_address_prefixes: -
        :param source_application_security_group_ids: -
        :param source_port_range: -
        :param source_port_ranges: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkSecurityRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "access": access,
            "direction": direction,
            "name": name,
            "network_security_group_name": network_security_group_name,
            "priority": priority,
            "protocol": protocol,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if destination_address_prefix is not None:
            self._values["destination_address_prefix"] = destination_address_prefix
        if destination_address_prefixes is not None:
            self._values["destination_address_prefixes"] = destination_address_prefixes
        if destination_application_security_group_ids is not None:
            self._values["destination_application_security_group_ids"] = destination_application_security_group_ids
        if destination_port_range is not None:
            self._values["destination_port_range"] = destination_port_range
        if destination_port_ranges is not None:
            self._values["destination_port_ranges"] = destination_port_ranges
        if source_address_prefix is not None:
            self._values["source_address_prefix"] = source_address_prefix
        if source_address_prefixes is not None:
            self._values["source_address_prefixes"] = source_address_prefixes
        if source_application_security_group_ids is not None:
            self._values["source_application_security_group_ids"] = source_application_security_group_ids
        if source_port_range is not None:
            self._values["source_port_range"] = source_port_range
        if source_port_ranges is not None:
            self._values["source_port_ranges"] = source_port_ranges
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def access(self) -> builtins.str:
        result = self._values.get("access")
        assert result is not None, "Required property 'access' is missing"
        return result

    @builtins.property
    def direction(self) -> builtins.str:
        result = self._values.get("direction")
        assert result is not None, "Required property 'direction' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_security_group_name(self) -> builtins.str:
        result = self._values.get("network_security_group_name")
        assert result is not None, "Required property 'network_security_group_name' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def destination_address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("destination_address_prefix")
        return result

    @builtins.property
    def destination_address_prefixes(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_address_prefixes")
        return result

    @builtins.property
    def destination_application_security_group_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_application_security_group_ids")
        return result

    @builtins.property
    def destination_port_range(self) -> typing.Optional[builtins.str]:
        result = self._values.get("destination_port_range")
        return result

    @builtins.property
    def destination_port_ranges(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("destination_port_ranges")
        return result

    @builtins.property
    def source_address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_address_prefix")
        return result

    @builtins.property
    def source_address_prefixes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_address_prefixes")
        return result

    @builtins.property
    def source_application_security_group_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_application_security_group_ids")
        return result

    @builtins.property
    def source_port_range(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_port_range")
        return result

    @builtins.property
    def source_port_ranges(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("source_port_ranges")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkSecurityRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkSecurityRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkSecurityRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkSecurityRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkSecurityRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkWatcher(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkWatcher",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkWatcherTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkWatcherConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkWatcher, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkWatcherTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkWatcherTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkWatcherTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkWatcherConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NetworkWatcherConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NetworkWatcherTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkWatcherTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkWatcherTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkWatcherConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NetworkWatcherFlowLog(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NetworkWatcherFlowLog",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        enabled: builtins.bool,
        network_security_group_id: builtins.str,
        network_watcher_name: builtins.str,
        resource_group_name: builtins.str,
        retention_policy: typing.List["NetworkWatcherFlowLogRetentionPolicy"],
        storage_account_id: builtins.str,
        timeouts: typing.Optional["NetworkWatcherFlowLogTimeouts"] = None,
        traffic_analytics: typing.Optional[typing.List["NetworkWatcherFlowLogTrafficAnalytics"]] = None,
        version: typing.Optional[jsii.Number] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param enabled: -
        :param network_security_group_id: -
        :param network_watcher_name: -
        :param resource_group_name: -
        :param retention_policy: retention_policy block.
        :param storage_account_id: -
        :param timeouts: timeouts block.
        :param traffic_analytics: traffic_analytics block.
        :param version: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkWatcherFlowLogConfig(
            enabled=enabled,
            network_security_group_id=network_security_group_id,
            network_watcher_name=network_watcher_name,
            resource_group_name=resource_group_name,
            retention_policy=retention_policy,
            storage_account_id=storage_account_id,
            timeouts=timeouts,
            traffic_analytics=traffic_analytics,
            version=version,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NetworkWatcherFlowLog, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTrafficAnalytics")
    def reset_traffic_analytics(self) -> None:
        return jsii.invoke(self, "resetTrafficAnalytics", [])

    @jsii.member(jsii_name="resetVersion")
    def reset_version(self) -> None:
        return jsii.invoke(self, "resetVersion", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> builtins.bool:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupIdInput")
    def network_security_group_id_input(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherNameInput")
    def network_watcher_name_input(self) -> builtins.str:
        return jsii.get(self, "networkWatcherNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionPolicyInput")
    def retention_policy_input(
        self,
    ) -> typing.List["NetworkWatcherFlowLogRetentionPolicy"]:
        return jsii.get(self, "retentionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NetworkWatcherFlowLogTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trafficAnalyticsInput")
    def traffic_analytics_input(
        self,
    ) -> typing.Optional[typing.List["NetworkWatcherFlowLogTrafficAnalytics"]]:
        return jsii.get(self, "trafficAnalyticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupId")
    def network_security_group_id(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupId")

    @network_security_group_id.setter # type: ignore
    def network_security_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkSecurityGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherName")
    def network_watcher_name(self) -> builtins.str:
        return jsii.get(self, "networkWatcherName")

    @network_watcher_name.setter # type: ignore
    def network_watcher_name(self, value: builtins.str) -> None:
        jsii.set(self, "networkWatcherName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="retentionPolicy")
    def retention_policy(self) -> typing.List["NetworkWatcherFlowLogRetentionPolicy"]:
        return jsii.get(self, "retentionPolicy")

    @retention_policy.setter # type: ignore
    def retention_policy(
        self,
        value: typing.List["NetworkWatcherFlowLogRetentionPolicy"],
    ) -> None:
        jsii.set(self, "retentionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NetworkWatcherFlowLogTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NetworkWatcherFlowLogTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trafficAnalytics")
    def traffic_analytics(self) -> typing.List["NetworkWatcherFlowLogTrafficAnalytics"]:
        return jsii.get(self, "trafficAnalytics")

    @traffic_analytics.setter # type: ignore
    def traffic_analytics(
        self,
        value: typing.List["NetworkWatcherFlowLogTrafficAnalytics"],
    ) -> None:
        jsii.set(self, "trafficAnalytics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> jsii.Number:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: jsii.Number) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.NetworkWatcherFlowLogConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "enabled": "enabled",
        "network_security_group_id": "networkSecurityGroupId",
        "network_watcher_name": "networkWatcherName",
        "resource_group_name": "resourceGroupName",
        "retention_policy": "retentionPolicy",
        "storage_account_id": "storageAccountId",
        "timeouts": "timeouts",
        "traffic_analytics": "trafficAnalytics",
        "version": "version",
    },
)
class NetworkWatcherFlowLogConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        enabled: builtins.bool,
        network_security_group_id: builtins.str,
        network_watcher_name: builtins.str,
        resource_group_name: builtins.str,
        retention_policy: typing.List["NetworkWatcherFlowLogRetentionPolicy"],
        storage_account_id: builtins.str,
        timeouts: typing.Optional["NetworkWatcherFlowLogTimeouts"] = None,
        traffic_analytics: typing.Optional[typing.List["NetworkWatcherFlowLogTrafficAnalytics"]] = None,
        version: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param enabled: -
        :param network_security_group_id: -
        :param network_watcher_name: -
        :param resource_group_name: -
        :param retention_policy: retention_policy block.
        :param storage_account_id: -
        :param timeouts: timeouts block.
        :param traffic_analytics: traffic_analytics block.
        :param version: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NetworkWatcherFlowLogTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "network_security_group_id": network_security_group_id,
            "network_watcher_name": network_watcher_name,
            "resource_group_name": resource_group_name,
            "retention_policy": retention_policy,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if traffic_analytics is not None:
            self._values["traffic_analytics"] = traffic_analytics
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def network_security_group_id(self) -> builtins.str:
        result = self._values.get("network_security_group_id")
        assert result is not None, "Required property 'network_security_group_id' is missing"
        return result

    @builtins.property
    def network_watcher_name(self) -> builtins.str:
        result = self._values.get("network_watcher_name")
        assert result is not None, "Required property 'network_watcher_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def retention_policy(self) -> typing.List["NetworkWatcherFlowLogRetentionPolicy"]:
        """retention_policy block."""
        result = self._values.get("retention_policy")
        assert result is not None, "Required property 'retention_policy' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkWatcherFlowLogTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def traffic_analytics(
        self,
    ) -> typing.Optional[typing.List["NetworkWatcherFlowLogTrafficAnalytics"]]:
        """traffic_analytics block."""
        result = self._values.get("traffic_analytics")
        return result

    @builtins.property
    def version(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkWatcherFlowLogConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkWatcherFlowLogRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={"days": "days", "enabled": "enabled"},
)
class NetworkWatcherFlowLogRetentionPolicy:
    def __init__(self, *, days: jsii.Number, enabled: builtins.bool) -> None:
        """
        :param days: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "days": days,
            "enabled": enabled,
        }

    @builtins.property
    def days(self) -> jsii.Number:
        result = self._values.get("days")
        assert result is not None, "Required property 'days' is missing"
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkWatcherFlowLogRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkWatcherFlowLogTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkWatcherFlowLogTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkWatcherFlowLogTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkWatcherFlowLogTrafficAnalytics",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "workspace_id": "workspaceId",
        "workspace_region": "workspaceRegion",
        "workspace_resource_id": "workspaceResourceId",
        "interval_in_minutes": "intervalInMinutes",
    },
)
class NetworkWatcherFlowLogTrafficAnalytics:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        workspace_id: builtins.str,
        workspace_region: builtins.str,
        workspace_resource_id: builtins.str,
        interval_in_minutes: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param enabled: -
        :param workspace_id: -
        :param workspace_region: -
        :param workspace_resource_id: -
        :param interval_in_minutes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "workspace_id": workspace_id,
            "workspace_region": workspace_region,
            "workspace_resource_id": workspace_resource_id,
        }
        if interval_in_minutes is not None:
            self._values["interval_in_minutes"] = interval_in_minutes

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def workspace_id(self) -> builtins.str:
        result = self._values.get("workspace_id")
        assert result is not None, "Required property 'workspace_id' is missing"
        return result

    @builtins.property
    def workspace_region(self) -> builtins.str:
        result = self._values.get("workspace_region")
        assert result is not None, "Required property 'workspace_region' is missing"
        return result

    @builtins.property
    def workspace_resource_id(self) -> builtins.str:
        result = self._values.get("workspace_resource_id")
        assert result is not None, "Required property 'workspace_resource_id' is missing"
        return result

    @builtins.property
    def interval_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval_in_minutes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkWatcherFlowLogTrafficAnalytics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NetworkWatcherTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NetworkWatcherTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NetworkWatcherTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NotificationHub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NotificationHub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        apns_credential: typing.Optional[typing.List["NotificationHubApnsCredential"]] = None,
        gcm_credential: typing.Optional[typing.List["NotificationHubGcmCredential"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NotificationHubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param apns_credential: apns_credential block.
        :param gcm_credential: gcm_credential block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NotificationHubConfig(
            location=location,
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            apns_credential=apns_credential,
            gcm_credential=gcm_credential,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NotificationHub, self, [scope, id, config])

    @jsii.member(jsii_name="resetApnsCredential")
    def reset_apns_credential(self) -> None:
        return jsii.invoke(self, "resetApnsCredential", [])

    @jsii.member(jsii_name="resetGcmCredential")
    def reset_gcm_credential(self) -> None:
        return jsii.invoke(self, "resetGcmCredential", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apnsCredentialInput")
    def apns_credential_input(
        self,
    ) -> typing.Optional[typing.List["NotificationHubApnsCredential"]]:
        return jsii.get(self, "apnsCredentialInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gcmCredentialInput")
    def gcm_credential_input(
        self,
    ) -> typing.Optional[typing.List["NotificationHubGcmCredential"]]:
        return jsii.get(self, "gcmCredentialInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NotificationHubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="apnsCredential")
    def apns_credential(self) -> typing.List["NotificationHubApnsCredential"]:
        return jsii.get(self, "apnsCredential")

    @apns_credential.setter # type: ignore
    def apns_credential(
        self,
        value: typing.List["NotificationHubApnsCredential"],
    ) -> None:
        jsii.set(self, "apnsCredential", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="gcmCredential")
    def gcm_credential(self) -> typing.List["NotificationHubGcmCredential"]:
        return jsii.get(self, "gcmCredential")

    @gcm_credential.setter # type: ignore
    def gcm_credential(
        self,
        value: typing.List["NotificationHubGcmCredential"],
    ) -> None:
        jsii.set(self, "gcmCredential", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NotificationHubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NotificationHubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NotificationHubApnsCredential",
    jsii_struct_bases=[],
    name_mapping={
        "application_mode": "applicationMode",
        "bundle_id": "bundleId",
        "key_id": "keyId",
        "team_id": "teamId",
        "token": "token",
    },
)
class NotificationHubApnsCredential:
    def __init__(
        self,
        *,
        application_mode: builtins.str,
        bundle_id: builtins.str,
        key_id: builtins.str,
        team_id: builtins.str,
        token: builtins.str,
    ) -> None:
        """
        :param application_mode: -
        :param bundle_id: -
        :param key_id: -
        :param team_id: -
        :param token: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "application_mode": application_mode,
            "bundle_id": bundle_id,
            "key_id": key_id,
            "team_id": team_id,
            "token": token,
        }

    @builtins.property
    def application_mode(self) -> builtins.str:
        result = self._values.get("application_mode")
        assert result is not None, "Required property 'application_mode' is missing"
        return result

    @builtins.property
    def bundle_id(self) -> builtins.str:
        result = self._values.get("bundle_id")
        assert result is not None, "Required property 'bundle_id' is missing"
        return result

    @builtins.property
    def key_id(self) -> builtins.str:
        result = self._values.get("key_id")
        assert result is not None, "Required property 'key_id' is missing"
        return result

    @builtins.property
    def team_id(self) -> builtins.str:
        result = self._values.get("team_id")
        assert result is not None, "Required property 'team_id' is missing"
        return result

    @builtins.property
    def token(self) -> builtins.str:
        result = self._values.get("token")
        assert result is not None, "Required property 'token' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubApnsCredential(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NotificationHubAuthorizationRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NotificationHubAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        notification_hub_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["NotificationHubAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param notification_hub_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NotificationHubAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            notification_hub_name=notification_hub_name,
            resource_group_name=resource_group_name,
            listen=listen,
            manage=manage,
            send=send,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NotificationHubAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetListen")
    def reset_listen(self) -> None:
        return jsii.invoke(self, "resetListen", [])

    @jsii.member(jsii_name="resetManage")
    def reset_manage(self) -> None:
        return jsii.invoke(self, "resetManage", [])

    @jsii.member(jsii_name="resetSend")
    def reset_send(self) -> None:
        return jsii.invoke(self, "resetSend", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationHubNameInput")
    def notification_hub_name_input(self) -> builtins.str:
        return jsii.get(self, "notificationHubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listenInput")
    def listen_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "listenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manageInput")
    def manage_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "manageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendInput")
    def send_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sendInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["NotificationHubAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @listen.setter # type: ignore
    def listen(self, value: builtins.bool) -> None:
        jsii.set(self, "listen", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @manage.setter # type: ignore
    def manage(self, value: builtins.bool) -> None:
        jsii.set(self, "manage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notificationHubName")
    def notification_hub_name(self) -> builtins.str:
        return jsii.get(self, "notificationHubName")

    @notification_hub_name.setter # type: ignore
    def notification_hub_name(self, value: builtins.str) -> None:
        jsii.set(self, "notificationHubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @send.setter # type: ignore
    def send(self, value: builtins.bool) -> None:
        jsii.set(self, "send", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NotificationHubAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NotificationHubAuthorizationRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NotificationHubAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "notification_hub_name": "notificationHubName",
        "resource_group_name": "resourceGroupName",
        "listen": "listen",
        "manage": "manage",
        "send": "send",
        "timeouts": "timeouts",
    },
)
class NotificationHubAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        notification_hub_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["NotificationHubAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param notification_hub_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NotificationHubAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "notification_hub_name": notification_hub_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if listen is not None:
            self._values["listen"] = listen
        if manage is not None:
            self._values["manage"] = manage
        if send is not None:
            self._values["send"] = send
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def notification_hub_name(self) -> builtins.str:
        result = self._values.get("notification_hub_name")
        assert result is not None, "Required property 'notification_hub_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def listen(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("listen")
        return result

    @builtins.property
    def manage(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manage")
        return result

    @builtins.property
    def send(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NotificationHubAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NotificationHubAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NotificationHubAuthorizationRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NotificationHubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "apns_credential": "apnsCredential",
        "gcm_credential": "gcmCredential",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NotificationHubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        apns_credential: typing.Optional[typing.List[NotificationHubApnsCredential]] = None,
        gcm_credential: typing.Optional[typing.List["NotificationHubGcmCredential"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NotificationHubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param apns_credential: apns_credential block.
        :param gcm_credential: gcm_credential block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NotificationHubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if apns_credential is not None:
            self._values["apns_credential"] = apns_credential
        if gcm_credential is not None:
            self._values["gcm_credential"] = gcm_credential
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def apns_credential(
        self,
    ) -> typing.Optional[typing.List[NotificationHubApnsCredential]]:
        """apns_credential block."""
        result = self._values.get("apns_credential")
        return result

    @builtins.property
    def gcm_credential(
        self,
    ) -> typing.Optional[typing.List["NotificationHubGcmCredential"]]:
        """gcm_credential block."""
        result = self._values.get("gcm_credential")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NotificationHubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NotificationHubGcmCredential",
    jsii_struct_bases=[],
    name_mapping={"api_key": "apiKey"},
)
class NotificationHubGcmCredential:
    def __init__(self, *, api_key: builtins.str) -> None:
        """
        :param api_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "api_key": api_key,
        }

    @builtins.property
    def api_key(self) -> builtins.str:
        result = self._values.get("api_key")
        assert result is not None, "Required property 'api_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubGcmCredential(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class NotificationHubNamespace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.NotificationHubNamespace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        namespace_type: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NotificationHubNamespaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param namespace_type: -
        :param resource_group_name: -
        :param sku_name: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NotificationHubNamespaceConfig(
            location=location,
            name=name,
            namespace_type=namespace_type,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            enabled=enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(NotificationHubNamespace, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceTypeInput")
    def namespace_type_input(self) -> builtins.str:
        return jsii.get(self, "namespaceTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusEndpoint")
    def servicebus_endpoint(self) -> builtins.str:
        return jsii.get(self, "servicebusEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["NotificationHubNamespaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceType")
    def namespace_type(self) -> builtins.str:
        return jsii.get(self, "namespaceType")

    @namespace_type.setter # type: ignore
    def namespace_type(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "NotificationHubNamespaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "NotificationHubNamespaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.NotificationHubNamespaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "namespace_type": "namespaceType",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "enabled": "enabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class NotificationHubNamespaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        namespace_type: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["NotificationHubNamespaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param namespace_type: -
        :param resource_group_name: -
        :param sku_name: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = NotificationHubNamespaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "namespace_type": namespace_type,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enabled is not None:
            self._values["enabled"] = enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_type(self) -> builtins.str:
        result = self._values.get("namespace_type")
        assert result is not None, "Required property 'namespace_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["NotificationHubNamespaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubNamespaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NotificationHubNamespaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NotificationHubNamespaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubNamespaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.NotificationHubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class NotificationHubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "NotificationHubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class OrchestratedVirtualMachineScaleSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.OrchestratedVirtualMachineScaleSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        platform_fault_domain_count: jsii.Number,
        resource_group_name: builtins.str,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["OrchestratedVirtualMachineScaleSetTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param platform_fault_domain_count: -
        :param resource_group_name: -
        :param proximity_placement_group_id: -
        :param single_placement_group: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OrchestratedVirtualMachineScaleSetConfig(
            location=location,
            name=name,
            platform_fault_domain_count=platform_fault_domain_count,
            resource_group_name=resource_group_name,
            proximity_placement_group_id=proximity_placement_group_id,
            single_placement_group=single_placement_group,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(OrchestratedVirtualMachineScaleSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetSinglePlacementGroup")
    def reset_single_placement_group(self) -> None:
        return jsii.invoke(self, "resetSinglePlacementGroup", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCountInput")
    def platform_fault_domain_count_input(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueId")
    def unique_id(self) -> builtins.str:
        return jsii.get(self, "uniqueId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroupInput")
    def single_placement_group_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "singlePlacementGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["OrchestratedVirtualMachineScaleSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCount")
    def platform_fault_domain_count(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCount")

    @platform_fault_domain_count.setter # type: ignore
    def platform_fault_domain_count(self, value: jsii.Number) -> None:
        jsii.set(self, "platformFaultDomainCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroup")
    def single_placement_group(self) -> builtins.bool:
        return jsii.get(self, "singlePlacementGroup")

    @single_placement_group.setter # type: ignore
    def single_placement_group(self, value: builtins.bool) -> None:
        jsii.set(self, "singlePlacementGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "OrchestratedVirtualMachineScaleSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "OrchestratedVirtualMachineScaleSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.OrchestratedVirtualMachineScaleSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "platform_fault_domain_count": "platformFaultDomainCount",
        "resource_group_name": "resourceGroupName",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "single_placement_group": "singlePlacementGroup",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class OrchestratedVirtualMachineScaleSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        platform_fault_domain_count: jsii.Number,
        resource_group_name: builtins.str,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["OrchestratedVirtualMachineScaleSetTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param platform_fault_domain_count: -
        :param resource_group_name: -
        :param proximity_placement_group_id: -
        :param single_placement_group: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = OrchestratedVirtualMachineScaleSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "platform_fault_domain_count": platform_fault_domain_count,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if single_placement_group is not None:
            self._values["single_placement_group"] = single_placement_group
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def platform_fault_domain_count(self) -> jsii.Number:
        result = self._values.get("platform_fault_domain_count")
        assert result is not None, "Required property 'platform_fault_domain_count' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def single_placement_group(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("single_placement_group")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["OrchestratedVirtualMachineScaleSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "OrchestratedVirtualMachineScaleSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.OrchestratedVirtualMachineScaleSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class OrchestratedVirtualMachineScaleSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "OrchestratedVirtualMachineScaleSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PacketCapture(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PacketCapture",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        network_watcher_name: builtins.str,
        resource_group_name: builtins.str,
        storage_location: typing.List["PacketCaptureStorageLocation"],
        target_resource_id: builtins.str,
        filter: typing.Optional[typing.List["PacketCaptureFilter"]] = None,
        maximum_bytes_per_packet: typing.Optional[jsii.Number] = None,
        maximum_bytes_per_session: typing.Optional[jsii.Number] = None,
        maximum_capture_duration: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["PacketCaptureTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param network_watcher_name: -
        :param resource_group_name: -
        :param storage_location: storage_location block.
        :param target_resource_id: -
        :param filter: filter block.
        :param maximum_bytes_per_packet: -
        :param maximum_bytes_per_session: -
        :param maximum_capture_duration: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PacketCaptureConfig(
            name=name,
            network_watcher_name=network_watcher_name,
            resource_group_name=resource_group_name,
            storage_location=storage_location,
            target_resource_id=target_resource_id,
            filter=filter,
            maximum_bytes_per_packet=maximum_bytes_per_packet,
            maximum_bytes_per_session=maximum_bytes_per_session,
            maximum_capture_duration=maximum_capture_duration,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PacketCapture, self, [scope, id, config])

    @jsii.member(jsii_name="resetFilter")
    def reset_filter(self) -> None:
        return jsii.invoke(self, "resetFilter", [])

    @jsii.member(jsii_name="resetMaximumBytesPerPacket")
    def reset_maximum_bytes_per_packet(self) -> None:
        return jsii.invoke(self, "resetMaximumBytesPerPacket", [])

    @jsii.member(jsii_name="resetMaximumBytesPerSession")
    def reset_maximum_bytes_per_session(self) -> None:
        return jsii.invoke(self, "resetMaximumBytesPerSession", [])

    @jsii.member(jsii_name="resetMaximumCaptureDuration")
    def reset_maximum_capture_duration(self) -> None:
        return jsii.invoke(self, "resetMaximumCaptureDuration", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherNameInput")
    def network_watcher_name_input(self) -> builtins.str:
        return jsii.get(self, "networkWatcherNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageLocationInput")
    def storage_location_input(self) -> typing.List["PacketCaptureStorageLocation"]:
        return jsii.get(self, "storageLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> builtins.str:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterInput")
    def filter_input(self) -> typing.Optional[typing.List["PacketCaptureFilter"]]:
        return jsii.get(self, "filterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerPacketInput")
    def maximum_bytes_per_packet_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumBytesPerPacketInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerSessionInput")
    def maximum_bytes_per_session_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumBytesPerSessionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumCaptureDurationInput")
    def maximum_capture_duration_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumCaptureDurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PacketCaptureTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filter")
    def filter(self) -> typing.List["PacketCaptureFilter"]:
        return jsii.get(self, "filter")

    @filter.setter # type: ignore
    def filter(self, value: typing.List["PacketCaptureFilter"]) -> None:
        jsii.set(self, "filter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerPacket")
    def maximum_bytes_per_packet(self) -> jsii.Number:
        return jsii.get(self, "maximumBytesPerPacket")

    @maximum_bytes_per_packet.setter # type: ignore
    def maximum_bytes_per_packet(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumBytesPerPacket", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumBytesPerSession")
    def maximum_bytes_per_session(self) -> jsii.Number:
        return jsii.get(self, "maximumBytesPerSession")

    @maximum_bytes_per_session.setter # type: ignore
    def maximum_bytes_per_session(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumBytesPerSession", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumCaptureDuration")
    def maximum_capture_duration(self) -> jsii.Number:
        return jsii.get(self, "maximumCaptureDuration")

    @maximum_capture_duration.setter # type: ignore
    def maximum_capture_duration(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumCaptureDuration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkWatcherName")
    def network_watcher_name(self) -> builtins.str:
        return jsii.get(self, "networkWatcherName")

    @network_watcher_name.setter # type: ignore
    def network_watcher_name(self, value: builtins.str) -> None:
        jsii.set(self, "networkWatcherName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageLocation")
    def storage_location(self) -> typing.List["PacketCaptureStorageLocation"]:
        return jsii.get(self, "storageLocation")

    @storage_location.setter # type: ignore
    def storage_location(
        self,
        value: typing.List["PacketCaptureStorageLocation"],
    ) -> None:
        jsii.set(self, "storageLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PacketCaptureTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PacketCaptureTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PacketCaptureConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "network_watcher_name": "networkWatcherName",
        "resource_group_name": "resourceGroupName",
        "storage_location": "storageLocation",
        "target_resource_id": "targetResourceId",
        "filter": "filter",
        "maximum_bytes_per_packet": "maximumBytesPerPacket",
        "maximum_bytes_per_session": "maximumBytesPerSession",
        "maximum_capture_duration": "maximumCaptureDuration",
        "timeouts": "timeouts",
    },
)
class PacketCaptureConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        network_watcher_name: builtins.str,
        resource_group_name: builtins.str,
        storage_location: typing.List["PacketCaptureStorageLocation"],
        target_resource_id: builtins.str,
        filter: typing.Optional[typing.List["PacketCaptureFilter"]] = None,
        maximum_bytes_per_packet: typing.Optional[jsii.Number] = None,
        maximum_bytes_per_session: typing.Optional[jsii.Number] = None,
        maximum_capture_duration: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["PacketCaptureTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param network_watcher_name: -
        :param resource_group_name: -
        :param storage_location: storage_location block.
        :param target_resource_id: -
        :param filter: filter block.
        :param maximum_bytes_per_packet: -
        :param maximum_bytes_per_session: -
        :param maximum_capture_duration: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PacketCaptureTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "network_watcher_name": network_watcher_name,
            "resource_group_name": resource_group_name,
            "storage_location": storage_location,
            "target_resource_id": target_resource_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if filter is not None:
            self._values["filter"] = filter
        if maximum_bytes_per_packet is not None:
            self._values["maximum_bytes_per_packet"] = maximum_bytes_per_packet
        if maximum_bytes_per_session is not None:
            self._values["maximum_bytes_per_session"] = maximum_bytes_per_session
        if maximum_capture_duration is not None:
            self._values["maximum_capture_duration"] = maximum_capture_duration
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_watcher_name(self) -> builtins.str:
        result = self._values.get("network_watcher_name")
        assert result is not None, "Required property 'network_watcher_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_location(self) -> typing.List["PacketCaptureStorageLocation"]:
        """storage_location block."""
        result = self._values.get("storage_location")
        assert result is not None, "Required property 'storage_location' is missing"
        return result

    @builtins.property
    def target_resource_id(self) -> builtins.str:
        result = self._values.get("target_resource_id")
        assert result is not None, "Required property 'target_resource_id' is missing"
        return result

    @builtins.property
    def filter(self) -> typing.Optional[typing.List["PacketCaptureFilter"]]:
        """filter block."""
        result = self._values.get("filter")
        return result

    @builtins.property
    def maximum_bytes_per_packet(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_bytes_per_packet")
        return result

    @builtins.property
    def maximum_bytes_per_session(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_bytes_per_session")
        return result

    @builtins.property
    def maximum_capture_duration(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_capture_duration")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PacketCaptureTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PacketCaptureConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PacketCaptureFilter",
    jsii_struct_bases=[],
    name_mapping={
        "protocol": "protocol",
        "local_ip_address": "localIpAddress",
        "local_port": "localPort",
        "remote_ip_address": "remoteIpAddress",
        "remote_port": "remotePort",
    },
)
class PacketCaptureFilter:
    def __init__(
        self,
        *,
        protocol: builtins.str,
        local_ip_address: typing.Optional[builtins.str] = None,
        local_port: typing.Optional[builtins.str] = None,
        remote_ip_address: typing.Optional[builtins.str] = None,
        remote_port: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param protocol: -
        :param local_ip_address: -
        :param local_port: -
        :param remote_ip_address: -
        :param remote_port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "protocol": protocol,
        }
        if local_ip_address is not None:
            self._values["local_ip_address"] = local_ip_address
        if local_port is not None:
            self._values["local_port"] = local_port
        if remote_ip_address is not None:
            self._values["remote_ip_address"] = remote_ip_address
        if remote_port is not None:
            self._values["remote_port"] = remote_port

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def local_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("local_ip_address")
        return result

    @builtins.property
    def local_port(self) -> typing.Optional[builtins.str]:
        result = self._values.get("local_port")
        return result

    @builtins.property
    def remote_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("remote_ip_address")
        return result

    @builtins.property
    def remote_port(self) -> typing.Optional[builtins.str]:
        result = self._values.get("remote_port")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PacketCaptureFilter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PacketCaptureStorageLocation",
    jsii_struct_bases=[],
    name_mapping={"file_path": "filePath", "storage_account_id": "storageAccountId"},
)
class PacketCaptureStorageLocation:
    def __init__(
        self,
        *,
        file_path: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param file_path: -
        :param storage_account_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if file_path is not None:
            self._values["file_path"] = file_path
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id

    @builtins.property
    def file_path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("file_path")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PacketCaptureStorageLocation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PacketCaptureTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PacketCaptureTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PacketCaptureTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PointToSiteVpnGateway(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PointToSiteVpnGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        connection_configuration: typing.List["PointToSiteVpnGatewayConnectionConfiguration"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scale_unit: jsii.Number,
        virtual_hub_id: builtins.str,
        vpn_server_configuration_id: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PointToSiteVpnGatewayTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param connection_configuration: connection_configuration block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scale_unit: -
        :param virtual_hub_id: -
        :param vpn_server_configuration_id: -
        :param dns_servers: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PointToSiteVpnGatewayConfig(
            connection_configuration=connection_configuration,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            scale_unit=scale_unit,
            virtual_hub_id=virtual_hub_id,
            vpn_server_configuration_id=vpn_server_configuration_id,
            dns_servers=dns_servers,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PointToSiteVpnGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetDnsServers")
    def reset_dns_servers(self) -> None:
        return jsii.invoke(self, "resetDnsServers", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionConfigurationInput")
    def connection_configuration_input(
        self,
    ) -> typing.List["PointToSiteVpnGatewayConnectionConfiguration"]:
        return jsii.get(self, "connectionConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleUnitInput")
    def scale_unit_input(self) -> jsii.Number:
        return jsii.get(self, "scaleUnitInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnServerConfigurationIdInput")
    def vpn_server_configuration_id_input(self) -> builtins.str:
        return jsii.get(self, "vpnServerConfigurationIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServersInput")
    def dns_servers_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "dnsServersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PointToSiteVpnGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionConfiguration")
    def connection_configuration(
        self,
    ) -> typing.List["PointToSiteVpnGatewayConnectionConfiguration"]:
        return jsii.get(self, "connectionConfiguration")

    @connection_configuration.setter # type: ignore
    def connection_configuration(
        self,
        value: typing.List["PointToSiteVpnGatewayConnectionConfiguration"],
    ) -> None:
        jsii.set(self, "connectionConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServers")
    def dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsServers")

    @dns_servers.setter # type: ignore
    def dns_servers(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "dnsServers", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleUnit")
    def scale_unit(self) -> jsii.Number:
        return jsii.get(self, "scaleUnit")

    @scale_unit.setter # type: ignore
    def scale_unit(self, value: jsii.Number) -> None:
        jsii.set(self, "scaleUnit", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PointToSiteVpnGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PointToSiteVpnGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnServerConfigurationId")
    def vpn_server_configuration_id(self) -> builtins.str:
        return jsii.get(self, "vpnServerConfigurationId")

    @vpn_server_configuration_id.setter # type: ignore
    def vpn_server_configuration_id(self, value: builtins.str) -> None:
        jsii.set(self, "vpnServerConfigurationId", value)


@jsii.data_type(
    jsii_type="azurerm.PointToSiteVpnGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "connection_configuration": "connectionConfiguration",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "scale_unit": "scaleUnit",
        "virtual_hub_id": "virtualHubId",
        "vpn_server_configuration_id": "vpnServerConfigurationId",
        "dns_servers": "dnsServers",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PointToSiteVpnGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        connection_configuration: typing.List["PointToSiteVpnGatewayConnectionConfiguration"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scale_unit: jsii.Number,
        virtual_hub_id: builtins.str,
        vpn_server_configuration_id: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PointToSiteVpnGatewayTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param connection_configuration: connection_configuration block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scale_unit: -
        :param virtual_hub_id: -
        :param vpn_server_configuration_id: -
        :param dns_servers: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PointToSiteVpnGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "connection_configuration": connection_configuration,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "scale_unit": scale_unit,
            "virtual_hub_id": virtual_hub_id,
            "vpn_server_configuration_id": vpn_server_configuration_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if dns_servers is not None:
            self._values["dns_servers"] = dns_servers
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def connection_configuration(
        self,
    ) -> typing.List["PointToSiteVpnGatewayConnectionConfiguration"]:
        """connection_configuration block."""
        result = self._values.get("connection_configuration")
        assert result is not None, "Required property 'connection_configuration' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def scale_unit(self) -> jsii.Number:
        result = self._values.get("scale_unit")
        assert result is not None, "Required property 'scale_unit' is missing"
        return result

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def vpn_server_configuration_id(self) -> builtins.str:
        result = self._values.get("vpn_server_configuration_id")
        assert result is not None, "Required property 'vpn_server_configuration_id' is missing"
        return result

    @builtins.property
    def dns_servers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("dns_servers")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PointToSiteVpnGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PointToSiteVpnGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PointToSiteVpnGatewayConnectionConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "vpn_client_address_pool": "vpnClientAddressPool",
        "route": "route",
    },
)
class PointToSiteVpnGatewayConnectionConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        vpn_client_address_pool: typing.List["PointToSiteVpnGatewayConnectionConfigurationVpnClientAddressPool"],
        route: typing.Optional[typing.List["PointToSiteVpnGatewayConnectionConfigurationRoute"]] = None,
    ) -> None:
        """
        :param name: -
        :param vpn_client_address_pool: vpn_client_address_pool block.
        :param route: route block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "vpn_client_address_pool": vpn_client_address_pool,
        }
        if route is not None:
            self._values["route"] = route

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def vpn_client_address_pool(
        self,
    ) -> typing.List["PointToSiteVpnGatewayConnectionConfigurationVpnClientAddressPool"]:
        """vpn_client_address_pool block."""
        result = self._values.get("vpn_client_address_pool")
        assert result is not None, "Required property 'vpn_client_address_pool' is missing"
        return result

    @builtins.property
    def route(
        self,
    ) -> typing.Optional[typing.List["PointToSiteVpnGatewayConnectionConfigurationRoute"]]:
        """route block."""
        result = self._values.get("route")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PointToSiteVpnGatewayConnectionConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PointToSiteVpnGatewayConnectionConfigurationRoute",
    jsii_struct_bases=[],
    name_mapping={
        "associated_route_table_id": "associatedRouteTableId",
        "propagated_route_table": "propagatedRouteTable",
    },
)
class PointToSiteVpnGatewayConnectionConfigurationRoute:
    def __init__(
        self,
        *,
        associated_route_table_id: builtins.str,
        propagated_route_table: typing.Optional[typing.List["PointToSiteVpnGatewayConnectionConfigurationRoutePropagatedRouteTable"]] = None,
    ) -> None:
        """
        :param associated_route_table_id: -
        :param propagated_route_table: propagated_route_table block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "associated_route_table_id": associated_route_table_id,
        }
        if propagated_route_table is not None:
            self._values["propagated_route_table"] = propagated_route_table

    @builtins.property
    def associated_route_table_id(self) -> builtins.str:
        result = self._values.get("associated_route_table_id")
        assert result is not None, "Required property 'associated_route_table_id' is missing"
        return result

    @builtins.property
    def propagated_route_table(
        self,
    ) -> typing.Optional[typing.List["PointToSiteVpnGatewayConnectionConfigurationRoutePropagatedRouteTable"]]:
        """propagated_route_table block."""
        result = self._values.get("propagated_route_table")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PointToSiteVpnGatewayConnectionConfigurationRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PointToSiteVpnGatewayConnectionConfigurationRoutePropagatedRouteTable",
    jsii_struct_bases=[],
    name_mapping={"ids": "ids", "labels": "labels"},
)
class PointToSiteVpnGatewayConnectionConfigurationRoutePropagatedRouteTable:
    def __init__(
        self,
        *,
        ids: typing.List[builtins.str],
        labels: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param ids: -
        :param labels: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "ids": ids,
        }
        if labels is not None:
            self._values["labels"] = labels

    @builtins.property
    def ids(self) -> typing.List[builtins.str]:
        result = self._values.get("ids")
        assert result is not None, "Required property 'ids' is missing"
        return result

    @builtins.property
    def labels(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("labels")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PointToSiteVpnGatewayConnectionConfigurationRoutePropagatedRouteTable(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PointToSiteVpnGatewayConnectionConfigurationVpnClientAddressPool",
    jsii_struct_bases=[],
    name_mapping={"address_prefixes": "addressPrefixes"},
)
class PointToSiteVpnGatewayConnectionConfigurationVpnClientAddressPool:
    def __init__(self, *, address_prefixes: typing.List[builtins.str]) -> None:
        """
        :param address_prefixes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "address_prefixes": address_prefixes,
        }

    @builtins.property
    def address_prefixes(self) -> typing.List[builtins.str]:
        result = self._values.get("address_prefixes")
        assert result is not None, "Required property 'address_prefixes' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PointToSiteVpnGatewayConnectionConfigurationVpnClientAddressPool(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PointToSiteVpnGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PointToSiteVpnGatewayTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PointToSiteVpnGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PolicyAssignment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PolicyAssignment",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        policy_definition_id: builtins.str,
        scope: builtins.str,
        description: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        enforcement_mode: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["PolicyAssignmentIdentity"]] = None,
        location: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[builtins.str] = None,
        not_scopes: typing.Optional[typing.List[builtins.str]] = None,
        parameters: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicyAssignmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param name: -
        :param policy_definition_id: -
        :param scope: -
        :param description: -
        :param display_name: -
        :param enforcement_mode: -
        :param identity: identity block.
        :param location: -
        :param metadata: -
        :param not_scopes: -
        :param parameters: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PolicyAssignmentConfig(
            name=name,
            policy_definition_id=policy_definition_id,
            scope=scope,
            description=description,
            display_name=display_name,
            enforcement_mode=enforcement_mode,
            identity=identity,
            location=location,
            metadata=metadata,
            not_scopes=not_scopes,
            parameters=parameters,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PolicyAssignment, self, [scope_, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetDisplayName")
    def reset_display_name(self) -> None:
        return jsii.invoke(self, "resetDisplayName", [])

    @jsii.member(jsii_name="resetEnforcementMode")
    def reset_enforcement_mode(self) -> None:
        return jsii.invoke(self, "resetEnforcementMode", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLocation")
    def reset_location(self) -> None:
        return jsii.invoke(self, "resetLocation", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetNotScopes")
    def reset_not_scopes(self) -> None:
        return jsii.invoke(self, "resetNotScopes", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionIdInput")
    def policy_definition_id_input(self) -> builtins.str:
        return jsii.get(self, "policyDefinitionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcementModeInput")
    def enforcement_mode_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enforcementModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["PolicyAssignmentIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notScopesInput")
    def not_scopes_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "notScopesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PolicyAssignmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcementMode")
    def enforcement_mode(self) -> builtins.bool:
        return jsii.get(self, "enforcementMode")

    @enforcement_mode.setter # type: ignore
    def enforcement_mode(self, value: builtins.bool) -> None:
        jsii.set(self, "enforcementMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["PolicyAssignmentIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["PolicyAssignmentIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> builtins.str:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: builtins.str) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="notScopes")
    def not_scopes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "notScopes")

    @not_scopes.setter # type: ignore
    def not_scopes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "notScopes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> builtins.str:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: builtins.str) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionId")
    def policy_definition_id(self) -> builtins.str:
        return jsii.get(self, "policyDefinitionId")

    @policy_definition_id.setter # type: ignore
    def policy_definition_id(self, value: builtins.str) -> None:
        jsii.set(self, "policyDefinitionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PolicyAssignmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PolicyAssignmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PolicyAssignmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "policy_definition_id": "policyDefinitionId",
        "scope": "scope",
        "description": "description",
        "display_name": "displayName",
        "enforcement_mode": "enforcementMode",
        "identity": "identity",
        "location": "location",
        "metadata": "metadata",
        "not_scopes": "notScopes",
        "parameters": "parameters",
        "timeouts": "timeouts",
    },
)
class PolicyAssignmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        policy_definition_id: builtins.str,
        scope: builtins.str,
        description: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
        enforcement_mode: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["PolicyAssignmentIdentity"]] = None,
        location: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[builtins.str] = None,
        not_scopes: typing.Optional[typing.List[builtins.str]] = None,
        parameters: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicyAssignmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param policy_definition_id: -
        :param scope: -
        :param description: -
        :param display_name: -
        :param enforcement_mode: -
        :param identity: identity block.
        :param location: -
        :param metadata: -
        :param not_scopes: -
        :param parameters: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PolicyAssignmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "policy_definition_id": policy_definition_id,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if display_name is not None:
            self._values["display_name"] = display_name
        if enforcement_mode is not None:
            self._values["enforcement_mode"] = enforcement_mode
        if identity is not None:
            self._values["identity"] = identity
        if location is not None:
            self._values["location"] = location
        if metadata is not None:
            self._values["metadata"] = metadata
        if not_scopes is not None:
            self._values["not_scopes"] = not_scopes
        if parameters is not None:
            self._values["parameters"] = parameters
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def policy_definition_id(self) -> builtins.str:
        result = self._values.get("policy_definition_id")
        assert result is not None, "Required property 'policy_definition_id' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    @builtins.property
    def enforcement_mode(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enforcement_mode")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["PolicyAssignmentIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def location(self) -> typing.Optional[builtins.str]:
        result = self._values.get("location")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[builtins.str]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def not_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("not_scopes")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PolicyAssignmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicyAssignmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PolicyAssignmentIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class PolicyAssignmentIdentity:
    def __init__(self, *, type: typing.Optional[builtins.str] = None) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicyAssignmentIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PolicyAssignmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PolicyAssignmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicyAssignmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PolicyDefinition(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PolicyDefinition",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: builtins.str,
        mode: builtins.str,
        name: builtins.str,
        policy_type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        management_group_id: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[builtins.str] = None,
        policy_rule: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicyDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param mode: -
        :param name: -
        :param policy_type: -
        :param description: -
        :param management_group_id: -
        :param management_group_name: -
        :param metadata: -
        :param parameters: -
        :param policy_rule: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PolicyDefinitionConfig(
            display_name=display_name,
            mode=mode,
            name=name,
            policy_type=policy_type,
            description=description,
            management_group_id=management_group_id,
            management_group_name=management_group_name,
            metadata=metadata,
            parameters=parameters,
            policy_rule=policy_rule,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PolicyDefinition, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetManagementGroupId")
    def reset_management_group_id(self) -> None:
        return jsii.invoke(self, "resetManagementGroupId", [])

    @jsii.member(jsii_name="resetManagementGroupName")
    def reset_management_group_name(self) -> None:
        return jsii.invoke(self, "resetManagementGroupName", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetPolicyRule")
    def reset_policy_rule(self) -> None:
        return jsii.invoke(self, "resetPolicyRule", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="modeInput")
    def mode_input(self) -> builtins.str:
        return jsii.get(self, "modeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyTypeInput")
    def policy_type_input(self) -> builtins.str:
        return jsii.get(self, "policyTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupIdInput")
    def management_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupNameInput")
    def management_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managementGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyRuleInput")
    def policy_rule_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "policyRuleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PolicyDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupId")
    def management_group_id(self) -> builtins.str:
        return jsii.get(self, "managementGroupId")

    @management_group_id.setter # type: ignore
    def management_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "managementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupName")
    def management_group_name(self) -> builtins.str:
        return jsii.get(self, "managementGroupName")

    @management_group_name.setter # type: ignore
    def management_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "managementGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> builtins.str:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: builtins.str) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="mode")
    def mode(self) -> builtins.str:
        return jsii.get(self, "mode")

    @mode.setter # type: ignore
    def mode(self, value: builtins.str) -> None:
        jsii.set(self, "mode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> builtins.str:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: builtins.str) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyRule")
    def policy_rule(self) -> builtins.str:
        return jsii.get(self, "policyRule")

    @policy_rule.setter # type: ignore
    def policy_rule(self, value: builtins.str) -> None:
        jsii.set(self, "policyRule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyType")
    def policy_type(self) -> builtins.str:
        return jsii.get(self, "policyType")

    @policy_type.setter # type: ignore
    def policy_type(self, value: builtins.str) -> None:
        jsii.set(self, "policyType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PolicyDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PolicyDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PolicyDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "mode": "mode",
        "name": "name",
        "policy_type": "policyType",
        "description": "description",
        "management_group_id": "managementGroupId",
        "management_group_name": "managementGroupName",
        "metadata": "metadata",
        "parameters": "parameters",
        "policy_rule": "policyRule",
        "timeouts": "timeouts",
    },
)
class PolicyDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: builtins.str,
        mode: builtins.str,
        name: builtins.str,
        policy_type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        management_group_id: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[builtins.str] = None,
        policy_rule: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicyDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param mode: -
        :param name: -
        :param policy_type: -
        :param description: -
        :param management_group_id: -
        :param management_group_name: -
        :param metadata: -
        :param parameters: -
        :param policy_rule: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PolicyDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "display_name": display_name,
            "mode": mode,
            "name": name,
            "policy_type": policy_type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if management_group_id is not None:
            self._values["management_group_id"] = management_group_id
        if management_group_name is not None:
            self._values["management_group_name"] = management_group_name
        if metadata is not None:
            self._values["metadata"] = metadata
        if parameters is not None:
            self._values["parameters"] = parameters
        if policy_rule is not None:
            self._values["policy_rule"] = policy_rule
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def mode(self) -> builtins.str:
        result = self._values.get("mode")
        assert result is not None, "Required property 'mode' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def policy_type(self) -> builtins.str:
        result = self._values.get("policy_type")
        assert result is not None, "Required property 'policy_type' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def management_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("management_group_id")
        return result

    @builtins.property
    def management_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("management_group_name")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[builtins.str]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def policy_rule(self) -> typing.Optional[builtins.str]:
        result = self._values.get("policy_rule")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PolicyDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicyDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PolicyDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PolicyDefinitionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicyDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PolicyRemediation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PolicyRemediation",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        policy_assignment_id: builtins.str,
        scope: builtins.str,
        location_filters: typing.Optional[typing.List[builtins.str]] = None,
        policy_definition_reference_id: typing.Optional[builtins.str] = None,
        resource_discovery_mode: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicyRemediationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param name: -
        :param policy_assignment_id: -
        :param scope: -
        :param location_filters: -
        :param policy_definition_reference_id: -
        :param resource_discovery_mode: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PolicyRemediationConfig(
            name=name,
            policy_assignment_id=policy_assignment_id,
            scope=scope,
            location_filters=location_filters,
            policy_definition_reference_id=policy_definition_reference_id,
            resource_discovery_mode=resource_discovery_mode,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PolicyRemediation, self, [scope_, id, config])

    @jsii.member(jsii_name="resetLocationFilters")
    def reset_location_filters(self) -> None:
        return jsii.invoke(self, "resetLocationFilters", [])

    @jsii.member(jsii_name="resetPolicyDefinitionReferenceId")
    def reset_policy_definition_reference_id(self) -> None:
        return jsii.invoke(self, "resetPolicyDefinitionReferenceId", [])

    @jsii.member(jsii_name="resetResourceDiscoveryMode")
    def reset_resource_discovery_mode(self) -> None:
        return jsii.invoke(self, "resetResourceDiscoveryMode", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyAssignmentIdInput")
    def policy_assignment_id_input(self) -> builtins.str:
        return jsii.get(self, "policyAssignmentIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationFiltersInput")
    def location_filters_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "locationFiltersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionReferenceIdInput")
    def policy_definition_reference_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "policyDefinitionReferenceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceDiscoveryModeInput")
    def resource_discovery_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceDiscoveryModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PolicyRemediationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationFilters")
    def location_filters(self) -> typing.List[builtins.str]:
        return jsii.get(self, "locationFilters")

    @location_filters.setter # type: ignore
    def location_filters(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "locationFilters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyAssignmentId")
    def policy_assignment_id(self) -> builtins.str:
        return jsii.get(self, "policyAssignmentId")

    @policy_assignment_id.setter # type: ignore
    def policy_assignment_id(self, value: builtins.str) -> None:
        jsii.set(self, "policyAssignmentId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionReferenceId")
    def policy_definition_reference_id(self) -> builtins.str:
        return jsii.get(self, "policyDefinitionReferenceId")

    @policy_definition_reference_id.setter # type: ignore
    def policy_definition_reference_id(self, value: builtins.str) -> None:
        jsii.set(self, "policyDefinitionReferenceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceDiscoveryMode")
    def resource_discovery_mode(self) -> builtins.str:
        return jsii.get(self, "resourceDiscoveryMode")

    @resource_discovery_mode.setter # type: ignore
    def resource_discovery_mode(self, value: builtins.str) -> None:
        jsii.set(self, "resourceDiscoveryMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PolicyRemediationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PolicyRemediationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PolicyRemediationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "policy_assignment_id": "policyAssignmentId",
        "scope": "scope",
        "location_filters": "locationFilters",
        "policy_definition_reference_id": "policyDefinitionReferenceId",
        "resource_discovery_mode": "resourceDiscoveryMode",
        "timeouts": "timeouts",
    },
)
class PolicyRemediationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        policy_assignment_id: builtins.str,
        scope: builtins.str,
        location_filters: typing.Optional[typing.List[builtins.str]] = None,
        policy_definition_reference_id: typing.Optional[builtins.str] = None,
        resource_discovery_mode: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicyRemediationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param policy_assignment_id: -
        :param scope: -
        :param location_filters: -
        :param policy_definition_reference_id: -
        :param resource_discovery_mode: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PolicyRemediationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "policy_assignment_id": policy_assignment_id,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if location_filters is not None:
            self._values["location_filters"] = location_filters
        if policy_definition_reference_id is not None:
            self._values["policy_definition_reference_id"] = policy_definition_reference_id
        if resource_discovery_mode is not None:
            self._values["resource_discovery_mode"] = resource_discovery_mode
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def policy_assignment_id(self) -> builtins.str:
        result = self._values.get("policy_assignment_id")
        assert result is not None, "Required property 'policy_assignment_id' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def location_filters(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("location_filters")
        return result

    @builtins.property
    def policy_definition_reference_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("policy_definition_reference_id")
        return result

    @builtins.property
    def resource_discovery_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_discovery_mode")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PolicyRemediationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicyRemediationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PolicyRemediationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PolicyRemediationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicyRemediationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PolicySetDefinition(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PolicySetDefinition",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: builtins.str,
        name: builtins.str,
        policy_type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        management_group_id: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[builtins.str] = None,
        policy_definition_group: typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionGroup"]] = None,
        policy_definition_reference: typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionReference"]] = None,
        policy_definitions: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicySetDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param name: -
        :param policy_type: -
        :param description: -
        :param management_group_id: -
        :param management_group_name: -
        :param metadata: -
        :param parameters: -
        :param policy_definition_group: policy_definition_group block.
        :param policy_definition_reference: policy_definition_reference block.
        :param policy_definitions: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PolicySetDefinitionConfig(
            display_name=display_name,
            name=name,
            policy_type=policy_type,
            description=description,
            management_group_id=management_group_id,
            management_group_name=management_group_name,
            metadata=metadata,
            parameters=parameters,
            policy_definition_group=policy_definition_group,
            policy_definition_reference=policy_definition_reference,
            policy_definitions=policy_definitions,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PolicySetDefinition, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetManagementGroupId")
    def reset_management_group_id(self) -> None:
        return jsii.invoke(self, "resetManagementGroupId", [])

    @jsii.member(jsii_name="resetManagementGroupName")
    def reset_management_group_name(self) -> None:
        return jsii.invoke(self, "resetManagementGroupName", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetPolicyDefinitionGroup")
    def reset_policy_definition_group(self) -> None:
        return jsii.invoke(self, "resetPolicyDefinitionGroup", [])

    @jsii.member(jsii_name="resetPolicyDefinitionReference")
    def reset_policy_definition_reference(self) -> None:
        return jsii.invoke(self, "resetPolicyDefinitionReference", [])

    @jsii.member(jsii_name="resetPolicyDefinitions")
    def reset_policy_definitions(self) -> None:
        return jsii.invoke(self, "resetPolicyDefinitions", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyTypeInput")
    def policy_type_input(self) -> builtins.str:
        return jsii.get(self, "policyTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupIdInput")
    def management_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupNameInput")
    def management_group_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managementGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionGroupInput")
    def policy_definition_group_input(
        self,
    ) -> typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionGroup"]]:
        return jsii.get(self, "policyDefinitionGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionReferenceInput")
    def policy_definition_reference_input(
        self,
    ) -> typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionReference"]]:
        return jsii.get(self, "policyDefinitionReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionsInput")
    def policy_definitions_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "policyDefinitionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PolicySetDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupId")
    def management_group_id(self) -> builtins.str:
        return jsii.get(self, "managementGroupId")

    @management_group_id.setter # type: ignore
    def management_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "managementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementGroupName")
    def management_group_name(self) -> builtins.str:
        return jsii.get(self, "managementGroupName")

    @management_group_name.setter # type: ignore
    def management_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "managementGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> builtins.str:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: builtins.str) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> builtins.str:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: builtins.str) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionGroup")
    def policy_definition_group(
        self,
    ) -> typing.List["PolicySetDefinitionPolicyDefinitionGroup"]:
        return jsii.get(self, "policyDefinitionGroup")

    @policy_definition_group.setter # type: ignore
    def policy_definition_group(
        self,
        value: typing.List["PolicySetDefinitionPolicyDefinitionGroup"],
    ) -> None:
        jsii.set(self, "policyDefinitionGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitionReference")
    def policy_definition_reference(
        self,
    ) -> typing.List["PolicySetDefinitionPolicyDefinitionReference"]:
        return jsii.get(self, "policyDefinitionReference")

    @policy_definition_reference.setter # type: ignore
    def policy_definition_reference(
        self,
        value: typing.List["PolicySetDefinitionPolicyDefinitionReference"],
    ) -> None:
        jsii.set(self, "policyDefinitionReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyDefinitions")
    def policy_definitions(self) -> builtins.str:
        return jsii.get(self, "policyDefinitions")

    @policy_definitions.setter # type: ignore
    def policy_definitions(self, value: builtins.str) -> None:
        jsii.set(self, "policyDefinitions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policyType")
    def policy_type(self) -> builtins.str:
        return jsii.get(self, "policyType")

    @policy_type.setter # type: ignore
    def policy_type(self, value: builtins.str) -> None:
        jsii.set(self, "policyType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PolicySetDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PolicySetDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PolicySetDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "name": "name",
        "policy_type": "policyType",
        "description": "description",
        "management_group_id": "managementGroupId",
        "management_group_name": "managementGroupName",
        "metadata": "metadata",
        "parameters": "parameters",
        "policy_definition_group": "policyDefinitionGroup",
        "policy_definition_reference": "policyDefinitionReference",
        "policy_definitions": "policyDefinitions",
        "timeouts": "timeouts",
    },
)
class PolicySetDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: builtins.str,
        name: builtins.str,
        policy_type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        management_group_id: typing.Optional[builtins.str] = None,
        management_group_name: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[builtins.str] = None,
        parameters: typing.Optional[builtins.str] = None,
        policy_definition_group: typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionGroup"]] = None,
        policy_definition_reference: typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionReference"]] = None,
        policy_definitions: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["PolicySetDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param name: -
        :param policy_type: -
        :param description: -
        :param management_group_id: -
        :param management_group_name: -
        :param metadata: -
        :param parameters: -
        :param policy_definition_group: policy_definition_group block.
        :param policy_definition_reference: policy_definition_reference block.
        :param policy_definitions: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PolicySetDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "display_name": display_name,
            "name": name,
            "policy_type": policy_type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if management_group_id is not None:
            self._values["management_group_id"] = management_group_id
        if management_group_name is not None:
            self._values["management_group_name"] = management_group_name
        if metadata is not None:
            self._values["metadata"] = metadata
        if parameters is not None:
            self._values["parameters"] = parameters
        if policy_definition_group is not None:
            self._values["policy_definition_group"] = policy_definition_group
        if policy_definition_reference is not None:
            self._values["policy_definition_reference"] = policy_definition_reference
        if policy_definitions is not None:
            self._values["policy_definitions"] = policy_definitions
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def policy_type(self) -> builtins.str:
        result = self._values.get("policy_type")
        assert result is not None, "Required property 'policy_type' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def management_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("management_group_id")
        return result

    @builtins.property
    def management_group_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("management_group_name")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[builtins.str]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def policy_definition_group(
        self,
    ) -> typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionGroup"]]:
        """policy_definition_group block."""
        result = self._values.get("policy_definition_group")
        return result

    @builtins.property
    def policy_definition_reference(
        self,
    ) -> typing.Optional[typing.List["PolicySetDefinitionPolicyDefinitionReference"]]:
        """policy_definition_reference block."""
        result = self._values.get("policy_definition_reference")
        return result

    @builtins.property
    def policy_definitions(self) -> typing.Optional[builtins.str]:
        result = self._values.get("policy_definitions")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PolicySetDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicySetDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PolicySetDefinitionPolicyDefinitionGroup",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "additional_metadata_resource_id": "additionalMetadataResourceId",
        "category": "category",
        "description": "description",
        "display_name": "displayName",
    },
)
class PolicySetDefinitionPolicyDefinitionGroup:
    def __init__(
        self,
        *,
        name: builtins.str,
        additional_metadata_resource_id: typing.Optional[builtins.str] = None,
        category: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        display_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param additional_metadata_resource_id: -
        :param category: -
        :param description: -
        :param display_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if additional_metadata_resource_id is not None:
            self._values["additional_metadata_resource_id"] = additional_metadata_resource_id
        if category is not None:
            self._values["category"] = category
        if description is not None:
            self._values["description"] = description
        if display_name is not None:
            self._values["display_name"] = display_name

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def additional_metadata_resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("additional_metadata_resource_id")
        return result

    @builtins.property
    def category(self) -> typing.Optional[builtins.str]:
        result = self._values.get("category")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def display_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("display_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicySetDefinitionPolicyDefinitionGroup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PolicySetDefinitionPolicyDefinitionReference",
    jsii_struct_bases=[],
    name_mapping={
        "policy_definition_id": "policyDefinitionId",
        "parameters": "parameters",
        "parameter_values": "parameterValues",
        "policy_group_names": "policyGroupNames",
        "reference_id": "referenceId",
    },
)
class PolicySetDefinitionPolicyDefinitionReference:
    def __init__(
        self,
        *,
        policy_definition_id: builtins.str,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        parameter_values: typing.Optional[builtins.str] = None,
        policy_group_names: typing.Optional[typing.List[builtins.str]] = None,
        reference_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param policy_definition_id: -
        :param parameters: -
        :param parameter_values: -
        :param policy_group_names: -
        :param reference_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "policy_definition_id": policy_definition_id,
        }
        if parameters is not None:
            self._values["parameters"] = parameters
        if parameter_values is not None:
            self._values["parameter_values"] = parameter_values
        if policy_group_names is not None:
            self._values["policy_group_names"] = policy_group_names
        if reference_id is not None:
            self._values["reference_id"] = reference_id

    @builtins.property
    def policy_definition_id(self) -> builtins.str:
        result = self._values.get("policy_definition_id")
        assert result is not None, "Required property 'policy_definition_id' is missing"
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def parameter_values(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameter_values")
        return result

    @builtins.property
    def policy_group_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("policy_group_names")
        return result

    @builtins.property
    def reference_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("reference_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicySetDefinitionPolicyDefinitionReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PolicySetDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PolicySetDefinitionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PolicySetDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PostgresqlActiveDirectoryAdministrator(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PostgresqlActiveDirectoryAdministrator",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        login: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["PostgresqlActiveDirectoryAdministratorTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param login: -
        :param object_id: -
        :param resource_group_name: -
        :param server_name: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PostgresqlActiveDirectoryAdministratorConfig(
            login=login,
            object_id=object_id,
            resource_group_name=resource_group_name,
            server_name=server_name,
            tenant_id=tenant_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PostgresqlActiveDirectoryAdministrator, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loginInput")
    def login_input(self) -> builtins.str:
        return jsii.get(self, "loginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectIdInput")
    def object_id_input(self) -> builtins.str:
        return jsii.get(self, "objectIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["PostgresqlActiveDirectoryAdministratorTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="login")
    def login(self) -> builtins.str:
        return jsii.get(self, "login")

    @login.setter # type: ignore
    def login(self, value: builtins.str) -> None:
        jsii.set(self, "login", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @object_id.setter # type: ignore
    def object_id(self, value: builtins.str) -> None:
        jsii.set(self, "objectId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PostgresqlActiveDirectoryAdministratorTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PostgresqlActiveDirectoryAdministratorTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PostgresqlActiveDirectoryAdministratorConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "login": "login",
        "object_id": "objectId",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "tenant_id": "tenantId",
        "timeouts": "timeouts",
    },
)
class PostgresqlActiveDirectoryAdministratorConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        login: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["PostgresqlActiveDirectoryAdministratorTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param login: -
        :param object_id: -
        :param resource_group_name: -
        :param server_name: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PostgresqlActiveDirectoryAdministratorTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "login": login,
            "object_id": object_id,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def login(self) -> builtins.str:
        result = self._values.get("login")
        assert result is not None, "Required property 'login' is missing"
        return result

    @builtins.property
    def object_id(self) -> builtins.str:
        result = self._values.get("object_id")
        assert result is not None, "Required property 'object_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["PostgresqlActiveDirectoryAdministratorTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlActiveDirectoryAdministratorConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlActiveDirectoryAdministratorTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PostgresqlActiveDirectoryAdministratorTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlActiveDirectoryAdministratorTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PostgresqlConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PostgresqlConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["PostgresqlConfigurationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param value: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PostgresqlConfigurationConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            value=value,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PostgresqlConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PostgresqlConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PostgresqlConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PostgresqlConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.PostgresqlConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "value": "value",
        "timeouts": "timeouts",
    },
)
class PostgresqlConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        value: builtins.str,
        timeouts: typing.Optional["PostgresqlConfigurationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param value: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PostgresqlConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PostgresqlConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PostgresqlConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PostgresqlDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PostgresqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        charset: builtins.str,
        collation: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["PostgresqlDatabaseTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param charset: -
        :param collation: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PostgresqlDatabaseConfig(
            charset=charset,
            collation=collation,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PostgresqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="charsetInput")
    def charset_input(self) -> builtins.str:
        return jsii.get(self, "charsetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collationInput")
    def collation_input(self) -> builtins.str:
        return jsii.get(self, "collationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PostgresqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="charset")
    def charset(self) -> builtins.str:
        return jsii.get(self, "charset")

    @charset.setter # type: ignore
    def charset(self, value: builtins.str) -> None:
        jsii.set(self, "charset", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @collation.setter # type: ignore
    def collation(self, value: builtins.str) -> None:
        jsii.set(self, "collation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PostgresqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PostgresqlDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PostgresqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "charset": "charset",
        "collation": "collation",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "timeouts": "timeouts",
    },
)
class PostgresqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        charset: builtins.str,
        collation: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        timeouts: typing.Optional["PostgresqlDatabaseTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param charset: -
        :param collation: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PostgresqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "charset": charset,
            "collation": collation,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def charset(self) -> builtins.str:
        result = self._values.get("charset")
        assert result is not None, "Required property 'charset' is missing"
        return result

    @builtins.property
    def collation(self) -> builtins.str:
        result = self._values.get("collation")
        assert result is not None, "Required property 'collation' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PostgresqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PostgresqlDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PostgresqlFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PostgresqlFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["PostgresqlFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PostgresqlFirewallRuleConfig(
            end_ip_address=end_ip_address,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            start_ip_address=start_ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PostgresqlFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddressInput")
    def end_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "endIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddressInput")
    def start_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "startIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PostgresqlFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddress")
    def end_ip_address(self) -> builtins.str:
        return jsii.get(self, "endIpAddress")

    @end_ip_address.setter # type: ignore
    def end_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "endIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddress")
    def start_ip_address(self) -> builtins.str:
        return jsii.get(self, "startIpAddress")

    @start_ip_address.setter # type: ignore
    def start_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "startIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PostgresqlFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PostgresqlFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PostgresqlFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "end_ip_address": "endIpAddress",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "start_ip_address": "startIpAddress",
        "timeouts": "timeouts",
    },
)
class PostgresqlFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["PostgresqlFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PostgresqlFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "end_ip_address": end_ip_address,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "start_ip_address": start_ip_address,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def end_ip_address(self) -> builtins.str:
        result = self._values.get("end_ip_address")
        assert result is not None, "Required property 'end_ip_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def start_ip_address(self) -> builtins.str:
        result = self._values.get("start_ip_address")
        assert result is not None, "Required property 'start_ip_address' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PostgresqlFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PostgresqlFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PostgresqlServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PostgresqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        version: builtins.str,
        administrator_login: typing.Optional[builtins.str] = None,
        administrator_login_password: typing.Optional[builtins.str] = None,
        auto_grow_enabled: typing.Optional[builtins.bool] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_server_id: typing.Optional[builtins.str] = None,
        geo_redundant_backup_enabled: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["PostgresqlServerIdentity"]] = None,
        infrastructure_encryption_enabled: typing.Optional[builtins.bool] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        ssl_enforcement: typing.Optional[builtins.str] = None,
        ssl_enforcement_enabled: typing.Optional[builtins.bool] = None,
        ssl_minimal_tls_version_enforced: typing.Optional[builtins.str] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
        storage_profile: typing.Optional[typing.List["PostgresqlServerStorageProfile"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["PostgresqlServerThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["PostgresqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param version: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param auto_grow_enabled: -
        :param backup_retention_days: -
        :param create_mode: -
        :param creation_source_server_id: -
        :param geo_redundant_backup_enabled: -
        :param identity: identity block.
        :param infrastructure_encryption_enabled: -
        :param public_network_access_enabled: -
        :param restore_point_in_time: -
        :param ssl_enforcement: -
        :param ssl_enforcement_enabled: -
        :param ssl_minimal_tls_version_enforced: -
        :param storage_mb: -
        :param storage_profile: storage_profile block.
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PostgresqlServerConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            version=version,
            administrator_login=administrator_login,
            administrator_login_password=administrator_login_password,
            auto_grow_enabled=auto_grow_enabled,
            backup_retention_days=backup_retention_days,
            create_mode=create_mode,
            creation_source_server_id=creation_source_server_id,
            geo_redundant_backup_enabled=geo_redundant_backup_enabled,
            identity=identity,
            infrastructure_encryption_enabled=infrastructure_encryption_enabled,
            public_network_access_enabled=public_network_access_enabled,
            restore_point_in_time=restore_point_in_time,
            ssl_enforcement=ssl_enforcement,
            ssl_enforcement_enabled=ssl_enforcement_enabled,
            ssl_minimal_tls_version_enforced=ssl_minimal_tls_version_enforced,
            storage_mb=storage_mb,
            storage_profile=storage_profile,
            tags=tags,
            threat_detection_policy=threat_detection_policy,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PostgresqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdministratorLogin")
    def reset_administrator_login(self) -> None:
        return jsii.invoke(self, "resetAdministratorLogin", [])

    @jsii.member(jsii_name="resetAdministratorLoginPassword")
    def reset_administrator_login_password(self) -> None:
        return jsii.invoke(self, "resetAdministratorLoginPassword", [])

    @jsii.member(jsii_name="resetAutoGrowEnabled")
    def reset_auto_grow_enabled(self) -> None:
        return jsii.invoke(self, "resetAutoGrowEnabled", [])

    @jsii.member(jsii_name="resetBackupRetentionDays")
    def reset_backup_retention_days(self) -> None:
        return jsii.invoke(self, "resetBackupRetentionDays", [])

    @jsii.member(jsii_name="resetCreateMode")
    def reset_create_mode(self) -> None:
        return jsii.invoke(self, "resetCreateMode", [])

    @jsii.member(jsii_name="resetCreationSourceServerId")
    def reset_creation_source_server_id(self) -> None:
        return jsii.invoke(self, "resetCreationSourceServerId", [])

    @jsii.member(jsii_name="resetGeoRedundantBackupEnabled")
    def reset_geo_redundant_backup_enabled(self) -> None:
        return jsii.invoke(self, "resetGeoRedundantBackupEnabled", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetInfrastructureEncryptionEnabled")
    def reset_infrastructure_encryption_enabled(self) -> None:
        return jsii.invoke(self, "resetInfrastructureEncryptionEnabled", [])

    @jsii.member(jsii_name="resetPublicNetworkAccessEnabled")
    def reset_public_network_access_enabled(self) -> None:
        return jsii.invoke(self, "resetPublicNetworkAccessEnabled", [])

    @jsii.member(jsii_name="resetRestorePointInTime")
    def reset_restore_point_in_time(self) -> None:
        return jsii.invoke(self, "resetRestorePointInTime", [])

    @jsii.member(jsii_name="resetSslEnforcement")
    def reset_ssl_enforcement(self) -> None:
        return jsii.invoke(self, "resetSslEnforcement", [])

    @jsii.member(jsii_name="resetSslEnforcementEnabled")
    def reset_ssl_enforcement_enabled(self) -> None:
        return jsii.invoke(self, "resetSslEnforcementEnabled", [])

    @jsii.member(jsii_name="resetSslMinimalTlsVersionEnforced")
    def reset_ssl_minimal_tls_version_enforced(self) -> None:
        return jsii.invoke(self, "resetSslMinimalTlsVersionEnforced", [])

    @jsii.member(jsii_name="resetStorageMb")
    def reset_storage_mb(self) -> None:
        return jsii.invoke(self, "resetStorageMb", [])

    @jsii.member(jsii_name="resetStorageProfile")
    def reset_storage_profile(self) -> None:
        return jsii.invoke(self, "resetStorageProfile", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetThreatDetectionPolicy")
    def reset_threat_detection_policy(self) -> None:
        return jsii.invoke(self, "resetThreatDetectionPolicy", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> builtins.str:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginInput")
    def administrator_login_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "administratorLoginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPasswordInput")
    def administrator_login_password_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "administratorLoginPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrowEnabledInput")
    def auto_grow_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoGrowEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDaysInput")
    def backup_retention_days_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "backupRetentionDaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createModeInput")
    def create_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceServerIdInput")
    def creation_source_server_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "creationSourceServerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackupEnabledInput")
    def geo_redundant_backup_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "geoRedundantBackupEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["PostgresqlServerIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="infrastructureEncryptionEnabledInput")
    def infrastructure_encryption_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "infrastructureEncryptionEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabledInput")
    def public_network_access_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "publicNetworkAccessEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTimeInput")
    def restore_point_in_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "restorePointInTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementEnabledInput")
    def ssl_enforcement_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sslEnforcementEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementInput")
    def ssl_enforcement_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sslEnforcementInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslMinimalTlsVersionEnforcedInput")
    def ssl_minimal_tls_version_enforced_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sslMinimalTlsVersionEnforcedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMbInput")
    def storage_mb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "storageMbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileInput")
    def storage_profile_input(
        self,
    ) -> typing.Optional[typing.List["PostgresqlServerStorageProfile"]]:
        return jsii.get(self, "storageProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicyInput")
    def threat_detection_policy_input(
        self,
    ) -> typing.Optional[typing.List["PostgresqlServerThreatDetectionPolicy"]]:
        return jsii.get(self, "threatDetectionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PostgresqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @administrator_login.setter # type: ignore
    def administrator_login(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLogin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPassword")
    def administrator_login_password(self) -> builtins.str:
        return jsii.get(self, "administratorLoginPassword")

    @administrator_login_password.setter # type: ignore
    def administrator_login_password(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLoginPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoGrowEnabled")
    def auto_grow_enabled(self) -> builtins.bool:
        return jsii.get(self, "autoGrowEnabled")

    @auto_grow_enabled.setter # type: ignore
    def auto_grow_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "autoGrowEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="backupRetentionDays")
    def backup_retention_days(self) -> jsii.Number:
        return jsii.get(self, "backupRetentionDays")

    @backup_retention_days.setter # type: ignore
    def backup_retention_days(self, value: jsii.Number) -> None:
        jsii.set(self, "backupRetentionDays", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createMode")
    def create_mode(self) -> builtins.str:
        return jsii.get(self, "createMode")

    @create_mode.setter # type: ignore
    def create_mode(self, value: builtins.str) -> None:
        jsii.set(self, "createMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationSourceServerId")
    def creation_source_server_id(self) -> builtins.str:
        return jsii.get(self, "creationSourceServerId")

    @creation_source_server_id.setter # type: ignore
    def creation_source_server_id(self, value: builtins.str) -> None:
        jsii.set(self, "creationSourceServerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoRedundantBackupEnabled")
    def geo_redundant_backup_enabled(self) -> builtins.bool:
        return jsii.get(self, "geoRedundantBackupEnabled")

    @geo_redundant_backup_enabled.setter # type: ignore
    def geo_redundant_backup_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "geoRedundantBackupEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["PostgresqlServerIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["PostgresqlServerIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="infrastructureEncryptionEnabled")
    def infrastructure_encryption_enabled(self) -> builtins.bool:
        return jsii.get(self, "infrastructureEncryptionEnabled")

    @infrastructure_encryption_enabled.setter # type: ignore
    def infrastructure_encryption_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "infrastructureEncryptionEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @public_network_access_enabled.setter # type: ignore
    def public_network_access_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "publicNetworkAccessEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTime")
    def restore_point_in_time(self) -> builtins.str:
        return jsii.get(self, "restorePointInTime")

    @restore_point_in_time.setter # type: ignore
    def restore_point_in_time(self, value: builtins.str) -> None:
        jsii.set(self, "restorePointInTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcement")
    def ssl_enforcement(self) -> builtins.str:
        return jsii.get(self, "sslEnforcement")

    @ssl_enforcement.setter # type: ignore
    def ssl_enforcement(self, value: builtins.str) -> None:
        jsii.set(self, "sslEnforcement", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslEnforcementEnabled")
    def ssl_enforcement_enabled(self) -> builtins.bool:
        return jsii.get(self, "sslEnforcementEnabled")

    @ssl_enforcement_enabled.setter # type: ignore
    def ssl_enforcement_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "sslEnforcementEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslMinimalTlsVersionEnforced")
    def ssl_minimal_tls_version_enforced(self) -> builtins.str:
        return jsii.get(self, "sslMinimalTlsVersionEnforced")

    @ssl_minimal_tls_version_enforced.setter # type: ignore
    def ssl_minimal_tls_version_enforced(self, value: builtins.str) -> None:
        jsii.set(self, "sslMinimalTlsVersionEnforced", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageMb")
    def storage_mb(self) -> jsii.Number:
        return jsii.get(self, "storageMb")

    @storage_mb.setter # type: ignore
    def storage_mb(self, value: jsii.Number) -> None:
        jsii.set(self, "storageMb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfile")
    def storage_profile(self) -> typing.List["PostgresqlServerStorageProfile"]:
        return jsii.get(self, "storageProfile")

    @storage_profile.setter # type: ignore
    def storage_profile(
        self,
        value: typing.List["PostgresqlServerStorageProfile"],
    ) -> None:
        jsii.set(self, "storageProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicy")
    def threat_detection_policy(
        self,
    ) -> typing.List["PostgresqlServerThreatDetectionPolicy"]:
        return jsii.get(self, "threatDetectionPolicy")

    @threat_detection_policy.setter # type: ignore
    def threat_detection_policy(
        self,
        value: typing.List["PostgresqlServerThreatDetectionPolicy"],
    ) -> None:
        jsii.set(self, "threatDetectionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PostgresqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PostgresqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.PostgresqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "version": "version",
        "administrator_login": "administratorLogin",
        "administrator_login_password": "administratorLoginPassword",
        "auto_grow_enabled": "autoGrowEnabled",
        "backup_retention_days": "backupRetentionDays",
        "create_mode": "createMode",
        "creation_source_server_id": "creationSourceServerId",
        "geo_redundant_backup_enabled": "geoRedundantBackupEnabled",
        "identity": "identity",
        "infrastructure_encryption_enabled": "infrastructureEncryptionEnabled",
        "public_network_access_enabled": "publicNetworkAccessEnabled",
        "restore_point_in_time": "restorePointInTime",
        "ssl_enforcement": "sslEnforcement",
        "ssl_enforcement_enabled": "sslEnforcementEnabled",
        "ssl_minimal_tls_version_enforced": "sslMinimalTlsVersionEnforced",
        "storage_mb": "storageMb",
        "storage_profile": "storageProfile",
        "tags": "tags",
        "threat_detection_policy": "threatDetectionPolicy",
        "timeouts": "timeouts",
    },
)
class PostgresqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        version: builtins.str,
        administrator_login: typing.Optional[builtins.str] = None,
        administrator_login_password: typing.Optional[builtins.str] = None,
        auto_grow_enabled: typing.Optional[builtins.bool] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        create_mode: typing.Optional[builtins.str] = None,
        creation_source_server_id: typing.Optional[builtins.str] = None,
        geo_redundant_backup_enabled: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["PostgresqlServerIdentity"]] = None,
        infrastructure_encryption_enabled: typing.Optional[builtins.bool] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        ssl_enforcement: typing.Optional[builtins.str] = None,
        ssl_enforcement_enabled: typing.Optional[builtins.bool] = None,
        ssl_minimal_tls_version_enforced: typing.Optional[builtins.str] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
        storage_profile: typing.Optional[typing.List["PostgresqlServerStorageProfile"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["PostgresqlServerThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["PostgresqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param version: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param auto_grow_enabled: -
        :param backup_retention_days: -
        :param create_mode: -
        :param creation_source_server_id: -
        :param geo_redundant_backup_enabled: -
        :param identity: identity block.
        :param infrastructure_encryption_enabled: -
        :param public_network_access_enabled: -
        :param restore_point_in_time: -
        :param ssl_enforcement: -
        :param ssl_enforcement_enabled: -
        :param ssl_minimal_tls_version_enforced: -
        :param storage_mb: -
        :param storage_profile: storage_profile block.
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PostgresqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
            "version": version,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if administrator_login is not None:
            self._values["administrator_login"] = administrator_login
        if administrator_login_password is not None:
            self._values["administrator_login_password"] = administrator_login_password
        if auto_grow_enabled is not None:
            self._values["auto_grow_enabled"] = auto_grow_enabled
        if backup_retention_days is not None:
            self._values["backup_retention_days"] = backup_retention_days
        if create_mode is not None:
            self._values["create_mode"] = create_mode
        if creation_source_server_id is not None:
            self._values["creation_source_server_id"] = creation_source_server_id
        if geo_redundant_backup_enabled is not None:
            self._values["geo_redundant_backup_enabled"] = geo_redundant_backup_enabled
        if identity is not None:
            self._values["identity"] = identity
        if infrastructure_encryption_enabled is not None:
            self._values["infrastructure_encryption_enabled"] = infrastructure_encryption_enabled
        if public_network_access_enabled is not None:
            self._values["public_network_access_enabled"] = public_network_access_enabled
        if restore_point_in_time is not None:
            self._values["restore_point_in_time"] = restore_point_in_time
        if ssl_enforcement is not None:
            self._values["ssl_enforcement"] = ssl_enforcement
        if ssl_enforcement_enabled is not None:
            self._values["ssl_enforcement_enabled"] = ssl_enforcement_enabled
        if ssl_minimal_tls_version_enforced is not None:
            self._values["ssl_minimal_tls_version_enforced"] = ssl_minimal_tls_version_enforced
        if storage_mb is not None:
            self._values["storage_mb"] = storage_mb
        if storage_profile is not None:
            self._values["storage_profile"] = storage_profile
        if tags is not None:
            self._values["tags"] = tags
        if threat_detection_policy is not None:
            self._values["threat_detection_policy"] = threat_detection_policy
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def administrator_login(self) -> typing.Optional[builtins.str]:
        result = self._values.get("administrator_login")
        return result

    @builtins.property
    def administrator_login_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("administrator_login_password")
        return result

    @builtins.property
    def auto_grow_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_grow_enabled")
        return result

    @builtins.property
    def backup_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("backup_retention_days")
        return result

    @builtins.property
    def create_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_mode")
        return result

    @builtins.property
    def creation_source_server_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("creation_source_server_id")
        return result

    @builtins.property
    def geo_redundant_backup_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("geo_redundant_backup_enabled")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["PostgresqlServerIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def infrastructure_encryption_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("infrastructure_encryption_enabled")
        return result

    @builtins.property
    def public_network_access_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("public_network_access_enabled")
        return result

    @builtins.property
    def restore_point_in_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("restore_point_in_time")
        return result

    @builtins.property
    def ssl_enforcement(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssl_enforcement")
        return result

    @builtins.property
    def ssl_enforcement_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ssl_enforcement_enabled")
        return result

    @builtins.property
    def ssl_minimal_tls_version_enforced(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ssl_minimal_tls_version_enforced")
        return result

    @builtins.property
    def storage_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("storage_mb")
        return result

    @builtins.property
    def storage_profile(
        self,
    ) -> typing.Optional[typing.List["PostgresqlServerStorageProfile"]]:
        """storage_profile block."""
        result = self._values.get("storage_profile")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def threat_detection_policy(
        self,
    ) -> typing.Optional[typing.List["PostgresqlServerThreatDetectionPolicy"]]:
        """threat_detection_policy block."""
        result = self._values.get("threat_detection_policy")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PostgresqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlServerIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class PostgresqlServerIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlServerIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PostgresqlServerKey(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PostgresqlServerKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_key_id: builtins.str,
        server_id: builtins.str,
        timeouts: typing.Optional["PostgresqlServerKeyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_key_id: -
        :param server_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PostgresqlServerKeyConfig(
            key_vault_key_id=key_vault_key_id,
            server_id=server_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PostgresqlServerKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyIdInput")
    def key_vault_key_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverIdInput")
    def server_id_input(self) -> builtins.str:
        return jsii.get(self, "serverIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PostgresqlServerKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @key_vault_key_id.setter # type: ignore
    def key_vault_key_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultKeyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverId")
    def server_id(self) -> builtins.str:
        return jsii.get(self, "serverId")

    @server_id.setter # type: ignore
    def server_id(self, value: builtins.str) -> None:
        jsii.set(self, "serverId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PostgresqlServerKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PostgresqlServerKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PostgresqlServerKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_key_id": "keyVaultKeyId",
        "server_id": "serverId",
        "timeouts": "timeouts",
    },
)
class PostgresqlServerKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_key_id: builtins.str,
        server_id: builtins.str,
        timeouts: typing.Optional["PostgresqlServerKeyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_key_id: -
        :param server_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PostgresqlServerKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_key_id": key_vault_key_id,
            "server_id": server_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_key_id(self) -> builtins.str:
        result = self._values.get("key_vault_key_id")
        assert result is not None, "Required property 'key_vault_key_id' is missing"
        return result

    @builtins.property
    def server_id(self) -> builtins.str:
        result = self._values.get("server_id")
        assert result is not None, "Required property 'server_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PostgresqlServerKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlServerKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlServerKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PostgresqlServerKeyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlServerKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlServerStorageProfile",
    jsii_struct_bases=[],
    name_mapping={
        "auto_grow": "autoGrow",
        "backup_retention_days": "backupRetentionDays",
        "geo_redundant_backup": "geoRedundantBackup",
        "storage_mb": "storageMb",
    },
)
class PostgresqlServerStorageProfile:
    def __init__(
        self,
        *,
        auto_grow: typing.Optional[builtins.str] = None,
        backup_retention_days: typing.Optional[jsii.Number] = None,
        geo_redundant_backup: typing.Optional[builtins.str] = None,
        storage_mb: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param auto_grow: -
        :param backup_retention_days: -
        :param geo_redundant_backup: -
        :param storage_mb: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if auto_grow is not None:
            self._values["auto_grow"] = auto_grow
        if backup_retention_days is not None:
            self._values["backup_retention_days"] = backup_retention_days
        if geo_redundant_backup is not None:
            self._values["geo_redundant_backup"] = geo_redundant_backup
        if storage_mb is not None:
            self._values["storage_mb"] = storage_mb

    @builtins.property
    def auto_grow(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_grow")
        return result

    @builtins.property
    def backup_retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("backup_retention_days")
        return result

    @builtins.property
    def geo_redundant_backup(self) -> typing.Optional[builtins.str]:
        result = self._values.get("geo_redundant_backup")
        return result

    @builtins.property
    def storage_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("storage_mb")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlServerStorageProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlServerThreatDetectionPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "disabled_alerts": "disabledAlerts",
        "email_account_admins": "emailAccountAdmins",
        "email_addresses": "emailAddresses",
        "enabled": "enabled",
        "retention_days": "retentionDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_endpoint": "storageEndpoint",
    },
)
class PostgresqlServerThreatDetectionPolicy:
    def __init__(
        self,
        *,
        disabled_alerts: typing.Optional[typing.List[builtins.str]] = None,
        email_account_admins: typing.Optional[builtins.bool] = None,
        email_addresses: typing.Optional[typing.List[builtins.str]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        retention_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param disabled_alerts: -
        :param email_account_admins: -
        :param email_addresses: -
        :param enabled: -
        :param retention_days: -
        :param storage_account_access_key: -
        :param storage_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if disabled_alerts is not None:
            self._values["disabled_alerts"] = disabled_alerts
        if email_account_admins is not None:
            self._values["email_account_admins"] = email_account_admins
        if email_addresses is not None:
            self._values["email_addresses"] = email_addresses
        if enabled is not None:
            self._values["enabled"] = enabled
        if retention_days is not None:
            self._values["retention_days"] = retention_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint

    @builtins.property
    def disabled_alerts(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("disabled_alerts")
        return result

    @builtins.property
    def email_account_admins(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("email_account_admins")
        return result

    @builtins.property
    def email_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("email_addresses")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlServerThreatDetectionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PostgresqlServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PostgresqlVirtualNetworkRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PostgresqlVirtualNetworkRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        ignore_missing_vnet_service_endpoint: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["PostgresqlVirtualNetworkRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param ignore_missing_vnet_service_endpoint: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PostgresqlVirtualNetworkRuleConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            subnet_id=subnet_id,
            ignore_missing_vnet_service_endpoint=ignore_missing_vnet_service_endpoint,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PostgresqlVirtualNetworkRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetIgnoreMissingVnetServiceEndpoint")
    def reset_ignore_missing_vnet_service_endpoint(self) -> None:
        return jsii.invoke(self, "resetIgnoreMissingVnetServiceEndpoint", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ignoreMissingVnetServiceEndpointInput")
    def ignore_missing_vnet_service_endpoint_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "ignoreMissingVnetServiceEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PostgresqlVirtualNetworkRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ignoreMissingVnetServiceEndpoint")
    def ignore_missing_vnet_service_endpoint(self) -> builtins.bool:
        return jsii.get(self, "ignoreMissingVnetServiceEndpoint")

    @ignore_missing_vnet_service_endpoint.setter # type: ignore
    def ignore_missing_vnet_service_endpoint(self, value: builtins.bool) -> None:
        jsii.set(self, "ignoreMissingVnetServiceEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PostgresqlVirtualNetworkRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PostgresqlVirtualNetworkRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PostgresqlVirtualNetworkRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "subnet_id": "subnetId",
        "ignore_missing_vnet_service_endpoint": "ignoreMissingVnetServiceEndpoint",
        "timeouts": "timeouts",
    },
)
class PostgresqlVirtualNetworkRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        ignore_missing_vnet_service_endpoint: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["PostgresqlVirtualNetworkRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param ignore_missing_vnet_service_endpoint: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PostgresqlVirtualNetworkRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if ignore_missing_vnet_service_endpoint is not None:
            self._values["ignore_missing_vnet_service_endpoint"] = ignore_missing_vnet_service_endpoint
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def ignore_missing_vnet_service_endpoint(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ignore_missing_vnet_service_endpoint")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PostgresqlVirtualNetworkRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlVirtualNetworkRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PostgresqlVirtualNetworkRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PostgresqlVirtualNetworkRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PostgresqlVirtualNetworkRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PowerbiEmbedded(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PowerbiEmbedded",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        administrators: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PowerbiEmbeddedTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param administrators: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PowerbiEmbeddedConfig(
            administrators=administrators,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PowerbiEmbedded, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorsInput")
    def administrators_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "administratorsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PowerbiEmbeddedTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administrators")
    def administrators(self) -> typing.List[builtins.str]:
        return jsii.get(self, "administrators")

    @administrators.setter # type: ignore
    def administrators(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "administrators", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PowerbiEmbeddedTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PowerbiEmbeddedTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PowerbiEmbeddedConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "administrators": "administrators",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PowerbiEmbeddedConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        administrators: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PowerbiEmbeddedTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param administrators: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PowerbiEmbeddedTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "administrators": administrators,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def administrators(self) -> typing.List[builtins.str]:
        result = self._values.get("administrators")
        assert result is not None, "Required property 'administrators' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PowerbiEmbeddedTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PowerbiEmbeddedConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PowerbiEmbeddedTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PowerbiEmbeddedTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PowerbiEmbeddedTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsARecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsARecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsARecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsARecordConfig(
            name=name,
            records=records,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsARecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordsInput")
    def records_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "recordsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsARecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="records")
    def records(self) -> typing.List[builtins.str]:
        return jsii.get(self, "records")

    @records.setter # type: ignore
    def records(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "records", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsARecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsARecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsARecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "records": "records",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsARecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsARecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsARecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "records": records,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def records(self) -> typing.List[builtins.str]:
        result = self._values.get("records")
        assert result is not None, "Required property 'records' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsARecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsARecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsARecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsARecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsARecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsAaaaRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsAaaaRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsAaaaRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsAaaaRecordConfig(
            name=name,
            records=records,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsAaaaRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordsInput")
    def records_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "recordsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsAaaaRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="records")
    def records(self) -> typing.List[builtins.str]:
        return jsii.get(self, "records")

    @records.setter # type: ignore
    def records(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "records", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsAaaaRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsAaaaRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsAaaaRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "records": "records",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsAaaaRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsAaaaRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsAaaaRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "records": records,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def records(self) -> typing.List[builtins.str]:
        result = self._values.get("records")
        assert result is not None, "Required property 'records' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsAaaaRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsAaaaRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsAaaaRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsAaaaRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsAaaaRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsCnameRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsCnameRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        record: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsCnameRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param record: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsCnameRecordConfig(
            name=name,
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsCnameRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> builtins.str:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsCnameRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> builtins.str:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: builtins.str) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsCnameRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsCnameRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsCnameRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsCnameRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        record: builtins.str,
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsCnameRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param record: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsCnameRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def record(self) -> builtins.str:
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsCnameRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsCnameRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsCnameRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsCnameRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsCnameRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsMxRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsMxRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        record: typing.List["PrivateDnsMxRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsMxRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsMxRecordConfig(
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            name=name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsMxRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.List["PrivateDnsMxRecordRecord"]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsMxRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> typing.List["PrivateDnsMxRecordRecord"]:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: typing.List["PrivateDnsMxRecordRecord"]) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsMxRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsMxRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsMxRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "name": "name",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsMxRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        record: typing.List["PrivateDnsMxRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsMxRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsMxRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if name is not None:
            self._values["name"] = name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def record(self) -> typing.List["PrivateDnsMxRecordRecord"]:
        """record block."""
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsMxRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsMxRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsMxRecordRecord",
    jsii_struct_bases=[],
    name_mapping={"exchange": "exchange", "preference": "preference"},
)
class PrivateDnsMxRecordRecord:
    def __init__(self, *, exchange: builtins.str, preference: jsii.Number) -> None:
        """
        :param exchange: -
        :param preference: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "exchange": exchange,
            "preference": preference,
        }

    @builtins.property
    def exchange(self) -> builtins.str:
        result = self._values.get("exchange")
        assert result is not None, "Required property 'exchange' is missing"
        return result

    @builtins.property
    def preference(self) -> jsii.Number:
        result = self._values.get("preference")
        assert result is not None, "Required property 'preference' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsMxRecordRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsMxRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsMxRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsMxRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsPtrRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsPtrRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsPtrRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsPtrRecordConfig(
            name=name,
            records=records,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsPtrRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordsInput")
    def records_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "recordsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsPtrRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="records")
    def records(self) -> typing.List[builtins.str]:
        return jsii.get(self, "records")

    @records.setter # type: ignore
    def records(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "records", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsPtrRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsPtrRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsPtrRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "records": "records",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsPtrRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        records: typing.List[builtins.str],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsPtrRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param records: -
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsPtrRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "records": records,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def records(self) -> typing.List[builtins.str]:
        result = self._values.get("records")
        assert result is not None, "Required property 'records' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsPtrRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsPtrRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsPtrRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsPtrRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsPtrRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsSrvRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsSrvRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        record: typing.List["PrivateDnsSrvRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsSrvRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsSrvRecordConfig(
            name=name,
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsSrvRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.List["PrivateDnsSrvRecordRecord"]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsSrvRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> typing.List["PrivateDnsSrvRecordRecord"]:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: typing.List["PrivateDnsSrvRecordRecord"]) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsSrvRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsSrvRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsSrvRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsSrvRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        record: typing.List["PrivateDnsSrvRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsSrvRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsSrvRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def record(self) -> typing.List["PrivateDnsSrvRecordRecord"]:
        """record block."""
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsSrvRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsSrvRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsSrvRecordRecord",
    jsii_struct_bases=[],
    name_mapping={
        "port": "port",
        "priority": "priority",
        "target": "target",
        "weight": "weight",
    },
)
class PrivateDnsSrvRecordRecord:
    def __init__(
        self,
        *,
        port: jsii.Number,
        priority: jsii.Number,
        target: builtins.str,
        weight: jsii.Number,
    ) -> None:
        """
        :param port: -
        :param priority: -
        :param target: -
        :param weight: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "port": port,
            "priority": priority,
            "target": target,
            "weight": weight,
        }

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def target(self) -> builtins.str:
        result = self._values.get("target")
        assert result is not None, "Required property 'target' is missing"
        return result

    @builtins.property
    def weight(self) -> jsii.Number:
        result = self._values.get("weight")
        assert result is not None, "Required property 'weight' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsSrvRecordRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsSrvRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsSrvRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsSrvRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsTxtRecord(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsTxtRecord",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        record: typing.List["PrivateDnsTxtRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsTxtRecordTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsTxtRecordConfig(
            name=name,
            record=record,
            resource_group_name=resource_group_name,
            ttl=ttl,
            zone_name=zone_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsTxtRecord, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordInput")
    def record_input(self) -> typing.List["PrivateDnsTxtRecordRecord"]:
        return jsii.get(self, "recordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttlInput")
    def ttl_input(self) -> jsii.Number:
        return jsii.get(self, "ttlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneNameInput")
    def zone_name_input(self) -> builtins.str:
        return jsii.get(self, "zoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsTxtRecordTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="record")
    def record(self) -> typing.List["PrivateDnsTxtRecordRecord"]:
        return jsii.get(self, "record")

    @record.setter # type: ignore
    def record(self, value: typing.List["PrivateDnsTxtRecordRecord"]) -> None:
        jsii.set(self, "record", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsTxtRecordTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsTxtRecordTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter # type: ignore
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneName")
    def zone_name(self) -> builtins.str:
        return jsii.get(self, "zoneName")

    @zone_name.setter # type: ignore
    def zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "zoneName", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsTxtRecordConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "record": "record",
        "resource_group_name": "resourceGroupName",
        "ttl": "ttl",
        "zone_name": "zoneName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsTxtRecordConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        record: typing.List["PrivateDnsTxtRecordRecord"],
        resource_group_name: builtins.str,
        ttl: jsii.Number,
        zone_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsTxtRecordTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param record: record block.
        :param resource_group_name: -
        :param ttl: -
        :param zone_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsTxtRecordTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "record": record,
            "resource_group_name": resource_group_name,
            "ttl": ttl,
            "zone_name": zone_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def record(self) -> typing.List["PrivateDnsTxtRecordRecord"]:
        """record block."""
        result = self._values.get("record")
        assert result is not None, "Required property 'record' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    @builtins.property
    def zone_name(self) -> builtins.str:
        result = self._values.get("zone_name")
        assert result is not None, "Required property 'zone_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsTxtRecordTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsTxtRecordConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsTxtRecordRecord",
    jsii_struct_bases=[],
    name_mapping={"value": "value"},
)
class PrivateDnsTxtRecordRecord:
    def __init__(self, *, value: builtins.str) -> None:
        """
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "value": value,
        }

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsTxtRecordRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsTxtRecordTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsTxtRecordTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsTxtRecordTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsZone(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsZone",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        soa_record: typing.Optional[typing.List["PrivateDnsZoneSoaRecord"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsZoneTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param soa_record: soa_record block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsZoneConfig(
            name=name,
            resource_group_name=resource_group_name,
            soa_record=soa_record,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsZone, self, [scope, id, config])

    @jsii.member(jsii_name="resetSoaRecord")
    def reset_soa_record(self) -> None:
        return jsii.invoke(self, "resetSoaRecord", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfRecordSets")
    def max_number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfVirtualNetworkLinks")
    def max_number_of_virtual_network_links(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfVirtualNetworkLinks")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxNumberOfVirtualNetworkLinksWithRegistration")
    def max_number_of_virtual_network_links_with_registration(self) -> jsii.Number:
        return jsii.get(self, "maxNumberOfVirtualNetworkLinksWithRegistration")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="numberOfRecordSets")
    def number_of_record_sets(self) -> jsii.Number:
        return jsii.get(self, "numberOfRecordSets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="soaRecordInput")
    def soa_record_input(
        self,
    ) -> typing.Optional[typing.List["PrivateDnsZoneSoaRecord"]]:
        return jsii.get(self, "soaRecordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateDnsZoneTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="soaRecord")
    def soa_record(self) -> typing.List["PrivateDnsZoneSoaRecord"]:
        return jsii.get(self, "soaRecord")

    @soa_record.setter # type: ignore
    def soa_record(self, value: typing.List["PrivateDnsZoneSoaRecord"]) -> None:
        jsii.set(self, "soaRecord", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsZoneTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsZoneTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsZoneConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "soa_record": "soaRecord",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsZoneConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        soa_record: typing.Optional[typing.List["PrivateDnsZoneSoaRecord"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsZoneTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param soa_record: soa_record block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsZoneTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if soa_record is not None:
            self._values["soa_record"] = soa_record
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def soa_record(self) -> typing.Optional[typing.List["PrivateDnsZoneSoaRecord"]]:
        """soa_record block."""
        result = self._values.get("soa_record")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsZoneTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsZoneConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsZoneSoaRecord",
    jsii_struct_bases=[],
    name_mapping={
        "email": "email",
        "expire_time": "expireTime",
        "minimum_ttl": "minimumTtl",
        "refresh_time": "refreshTime",
        "retry_time": "retryTime",
        "tags": "tags",
        "ttl": "ttl",
    },
)
class PrivateDnsZoneSoaRecord:
    def __init__(
        self,
        *,
        email: builtins.str,
        expire_time: typing.Optional[jsii.Number] = None,
        minimum_ttl: typing.Optional[jsii.Number] = None,
        refresh_time: typing.Optional[jsii.Number] = None,
        retry_time: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        ttl: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param email: -
        :param expire_time: -
        :param minimum_ttl: -
        :param refresh_time: -
        :param retry_time: -
        :param tags: -
        :param ttl: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "email": email,
        }
        if expire_time is not None:
            self._values["expire_time"] = expire_time
        if minimum_ttl is not None:
            self._values["minimum_ttl"] = minimum_ttl
        if refresh_time is not None:
            self._values["refresh_time"] = refresh_time
        if retry_time is not None:
            self._values["retry_time"] = retry_time
        if tags is not None:
            self._values["tags"] = tags
        if ttl is not None:
            self._values["ttl"] = ttl

    @builtins.property
    def email(self) -> builtins.str:
        result = self._values.get("email")
        assert result is not None, "Required property 'email' is missing"
        return result

    @builtins.property
    def expire_time(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("expire_time")
        return result

    @builtins.property
    def minimum_ttl(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("minimum_ttl")
        return result

    @builtins.property
    def refresh_time(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("refresh_time")
        return result

    @builtins.property
    def retry_time(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retry_time")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def ttl(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("ttl")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsZoneSoaRecord(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsZoneTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsZoneTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsZoneTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateDnsZoneVirtualNetworkLink(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateDnsZoneVirtualNetworkLink",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        private_dns_zone_name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_id: builtins.str,
        registration_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsZoneVirtualNetworkLinkTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param private_dns_zone_name: -
        :param resource_group_name: -
        :param virtual_network_id: -
        :param registration_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateDnsZoneVirtualNetworkLinkConfig(
            name=name,
            private_dns_zone_name=private_dns_zone_name,
            resource_group_name=resource_group_name,
            virtual_network_id=virtual_network_id,
            registration_enabled=registration_enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateDnsZoneVirtualNetworkLink, self, [scope, id, config])

    @jsii.member(jsii_name="resetRegistrationEnabled")
    def reset_registration_enabled(self) -> None:
        return jsii.invoke(self, "resetRegistrationEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateDnsZoneNameInput")
    def private_dns_zone_name_input(self) -> builtins.str:
        return jsii.get(self, "privateDnsZoneNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkIdInput")
    def virtual_network_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationEnabledInput")
    def registration_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "registrationEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["PrivateDnsZoneVirtualNetworkLinkTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateDnsZoneName")
    def private_dns_zone_name(self) -> builtins.str:
        return jsii.get(self, "privateDnsZoneName")

    @private_dns_zone_name.setter # type: ignore
    def private_dns_zone_name(self, value: builtins.str) -> None:
        jsii.set(self, "privateDnsZoneName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationEnabled")
    def registration_enabled(self) -> builtins.bool:
        return jsii.get(self, "registrationEnabled")

    @registration_enabled.setter # type: ignore
    def registration_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "registrationEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateDnsZoneVirtualNetworkLinkTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateDnsZoneVirtualNetworkLinkTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkId")
    def virtual_network_id(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkId")

    @virtual_network_id.setter # type: ignore
    def virtual_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualNetworkId", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsZoneVirtualNetworkLinkConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "private_dns_zone_name": "privateDnsZoneName",
        "resource_group_name": "resourceGroupName",
        "virtual_network_id": "virtualNetworkId",
        "registration_enabled": "registrationEnabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateDnsZoneVirtualNetworkLinkConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        private_dns_zone_name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_id: builtins.str,
        registration_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateDnsZoneVirtualNetworkLinkTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param private_dns_zone_name: -
        :param resource_group_name: -
        :param virtual_network_id: -
        :param registration_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateDnsZoneVirtualNetworkLinkTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "private_dns_zone_name": private_dns_zone_name,
            "resource_group_name": resource_group_name,
            "virtual_network_id": virtual_network_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if registration_enabled is not None:
            self._values["registration_enabled"] = registration_enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def private_dns_zone_name(self) -> builtins.str:
        result = self._values.get("private_dns_zone_name")
        assert result is not None, "Required property 'private_dns_zone_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def virtual_network_id(self) -> builtins.str:
        result = self._values.get("virtual_network_id")
        assert result is not None, "Required property 'virtual_network_id' is missing"
        return result

    @builtins.property
    def registration_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("registration_enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateDnsZoneVirtualNetworkLinkTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsZoneVirtualNetworkLinkConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateDnsZoneVirtualNetworkLinkTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateDnsZoneVirtualNetworkLinkTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateDnsZoneVirtualNetworkLinkTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateEndpoint(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateEndpoint",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        private_service_connection: typing.List["PrivateEndpointPrivateServiceConnection"],
        resource_group_name: builtins.str,
        subnet_id: builtins.str,
        private_dns_zone_group: typing.Optional[typing.List["PrivateEndpointPrivateDnsZoneGroup"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateEndpointTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param private_service_connection: private_service_connection block.
        :param resource_group_name: -
        :param subnet_id: -
        :param private_dns_zone_group: private_dns_zone_group block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateEndpointConfig(
            location=location,
            name=name,
            private_service_connection=private_service_connection,
            resource_group_name=resource_group_name,
            subnet_id=subnet_id,
            private_dns_zone_group=private_dns_zone_group,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateEndpoint, self, [scope, id, config])

    @jsii.member(jsii_name="customDnsConfigs")
    def custom_dns_configs(
        self,
        index: builtins.str,
    ) -> "PrivateEndpointCustomDnsConfigs":
        """
        :param index: -
        """
        return jsii.invoke(self, "customDnsConfigs", [index])

    @jsii.member(jsii_name="privateDnsZoneConfigs")
    def private_dns_zone_configs(
        self,
        index: builtins.str,
    ) -> "PrivateEndpointPrivateDnsZoneConfigs":
        """
        :param index: -
        """
        return jsii.invoke(self, "privateDnsZoneConfigs", [index])

    @jsii.member(jsii_name="resetPrivateDnsZoneGroup")
    def reset_private_dns_zone_group(self) -> None:
        return jsii.invoke(self, "resetPrivateDnsZoneGroup", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateServiceConnectionInput")
    def private_service_connection_input(
        self,
    ) -> typing.List["PrivateEndpointPrivateServiceConnection"]:
        return jsii.get(self, "privateServiceConnectionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateDnsZoneGroupInput")
    def private_dns_zone_group_input(
        self,
    ) -> typing.Optional[typing.List["PrivateEndpointPrivateDnsZoneGroup"]]:
        return jsii.get(self, "privateDnsZoneGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateEndpointTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateDnsZoneGroup")
    def private_dns_zone_group(
        self,
    ) -> typing.List["PrivateEndpointPrivateDnsZoneGroup"]:
        return jsii.get(self, "privateDnsZoneGroup")

    @private_dns_zone_group.setter # type: ignore
    def private_dns_zone_group(
        self,
        value: typing.List["PrivateEndpointPrivateDnsZoneGroup"],
    ) -> None:
        jsii.set(self, "privateDnsZoneGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateServiceConnection")
    def private_service_connection(
        self,
    ) -> typing.List["PrivateEndpointPrivateServiceConnection"]:
        return jsii.get(self, "privateServiceConnection")

    @private_service_connection.setter # type: ignore
    def private_service_connection(
        self,
        value: typing.List["PrivateEndpointPrivateServiceConnection"],
    ) -> None:
        jsii.set(self, "privateServiceConnection", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateEndpointTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateEndpointTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateEndpointConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "private_service_connection": "privateServiceConnection",
        "resource_group_name": "resourceGroupName",
        "subnet_id": "subnetId",
        "private_dns_zone_group": "privateDnsZoneGroup",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class PrivateEndpointConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        private_service_connection: typing.List["PrivateEndpointPrivateServiceConnection"],
        resource_group_name: builtins.str,
        subnet_id: builtins.str,
        private_dns_zone_group: typing.Optional[typing.List["PrivateEndpointPrivateDnsZoneGroup"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateEndpointTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param private_service_connection: private_service_connection block.
        :param resource_group_name: -
        :param subnet_id: -
        :param private_dns_zone_group: private_dns_zone_group block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateEndpointTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "private_service_connection": private_service_connection,
            "resource_group_name": resource_group_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if private_dns_zone_group is not None:
            self._values["private_dns_zone_group"] = private_dns_zone_group
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def private_service_connection(
        self,
    ) -> typing.List["PrivateEndpointPrivateServiceConnection"]:
        """private_service_connection block."""
        result = self._values.get("private_service_connection")
        assert result is not None, "Required property 'private_service_connection' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def private_dns_zone_group(
        self,
    ) -> typing.Optional[typing.List["PrivateEndpointPrivateDnsZoneGroup"]]:
        """private_dns_zone_group block."""
        result = self._values.get("private_dns_zone_group")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateEndpointTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateEndpointConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateEndpointCustomDnsConfigs(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateEndpointCustomDnsConfigs",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(PrivateEndpointCustomDnsConfigs, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddresses")
    def ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ipAddresses")


class PrivateEndpointPrivateDnsZoneConfigs(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateEndpointPrivateDnsZoneConfigs",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(PrivateEndpointPrivateDnsZoneConfigs, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateDnsZoneId")
    def private_dns_zone_id(self) -> builtins.str:
        return jsii.get(self, "privateDnsZoneId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recordSets")
    def record_sets(self) -> typing.Any:
        return jsii.get(self, "recordSets")


class PrivateEndpointPrivateDnsZoneConfigsRecordSets(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateEndpointPrivateDnsZoneConfigsRecordSets",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(PrivateEndpointPrivateDnsZoneConfigsRecordSets, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddresses")
    def ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ipAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.PrivateEndpointPrivateDnsZoneGroup",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "private_dns_zone_ids": "privateDnsZoneIds"},
)
class PrivateEndpointPrivateDnsZoneGroup:
    def __init__(
        self,
        *,
        name: builtins.str,
        private_dns_zone_ids: typing.List[builtins.str],
    ) -> None:
        """
        :param name: -
        :param private_dns_zone_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "private_dns_zone_ids": private_dns_zone_ids,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def private_dns_zone_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("private_dns_zone_ids")
        assert result is not None, "Required property 'private_dns_zone_ids' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateEndpointPrivateDnsZoneGroup(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateEndpointPrivateServiceConnection",
    jsii_struct_bases=[],
    name_mapping={
        "is_manual_connection": "isManualConnection",
        "name": "name",
        "private_connection_resource_id": "privateConnectionResourceId",
        "request_message": "requestMessage",
        "subresource_names": "subresourceNames",
    },
)
class PrivateEndpointPrivateServiceConnection:
    def __init__(
        self,
        *,
        is_manual_connection: builtins.bool,
        name: builtins.str,
        private_connection_resource_id: builtins.str,
        request_message: typing.Optional[builtins.str] = None,
        subresource_names: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param is_manual_connection: -
        :param name: -
        :param private_connection_resource_id: -
        :param request_message: -
        :param subresource_names: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_manual_connection": is_manual_connection,
            "name": name,
            "private_connection_resource_id": private_connection_resource_id,
        }
        if request_message is not None:
            self._values["request_message"] = request_message
        if subresource_names is not None:
            self._values["subresource_names"] = subresource_names

    @builtins.property
    def is_manual_connection(self) -> builtins.bool:
        result = self._values.get("is_manual_connection")
        assert result is not None, "Required property 'is_manual_connection' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def private_connection_resource_id(self) -> builtins.str:
        result = self._values.get("private_connection_resource_id")
        assert result is not None, "Required property 'private_connection_resource_id' is missing"
        return result

    @builtins.property
    def request_message(self) -> typing.Optional[builtins.str]:
        result = self._values.get("request_message")
        return result

    @builtins.property
    def subresource_names(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("subresource_names")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateEndpointPrivateServiceConnection(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateEndpointTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateEndpointTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateEndpointTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PrivateLinkService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PrivateLinkService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        load_balancer_frontend_ip_configuration_ids: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        nat_ip_configuration: typing.List["PrivateLinkServiceNatIpConfiguration"],
        resource_group_name: builtins.str,
        auto_approval_subscription_ids: typing.Optional[typing.List[builtins.str]] = None,
        enable_proxy_protocol: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateLinkServiceTimeouts"] = None,
        visibility_subscription_ids: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param load_balancer_frontend_ip_configuration_ids: -
        :param location: -
        :param name: -
        :param nat_ip_configuration: nat_ip_configuration block.
        :param resource_group_name: -
        :param auto_approval_subscription_ids: -
        :param enable_proxy_protocol: -
        :param tags: -
        :param timeouts: timeouts block.
        :param visibility_subscription_ids: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PrivateLinkServiceConfig(
            load_balancer_frontend_ip_configuration_ids=load_balancer_frontend_ip_configuration_ids,
            location=location,
            name=name,
            nat_ip_configuration=nat_ip_configuration,
            resource_group_name=resource_group_name,
            auto_approval_subscription_ids=auto_approval_subscription_ids,
            enable_proxy_protocol=enable_proxy_protocol,
            tags=tags,
            timeouts=timeouts,
            visibility_subscription_ids=visibility_subscription_ids,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PrivateLinkService, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoApprovalSubscriptionIds")
    def reset_auto_approval_subscription_ids(self) -> None:
        return jsii.invoke(self, "resetAutoApprovalSubscriptionIds", [])

    @jsii.member(jsii_name="resetEnableProxyProtocol")
    def reset_enable_proxy_protocol(self) -> None:
        return jsii.invoke(self, "resetEnableProxyProtocol", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVisibilitySubscriptionIds")
    def reset_visibility_subscription_ids(self) -> None:
        return jsii.invoke(self, "resetVisibilitySubscriptionIds", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alias")
    def alias(self) -> builtins.str:
        return jsii.get(self, "alias")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerFrontendIpConfigurationIdsInput")
    def load_balancer_frontend_ip_configuration_ids_input(
        self,
    ) -> typing.List[builtins.str]:
        return jsii.get(self, "loadBalancerFrontendIpConfigurationIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natIpConfigurationInput")
    def nat_ip_configuration_input(
        self,
    ) -> typing.List["PrivateLinkServiceNatIpConfiguration"]:
        return jsii.get(self, "natIpConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoApprovalSubscriptionIdsInput")
    def auto_approval_subscription_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "autoApprovalSubscriptionIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableProxyProtocolInput")
    def enable_proxy_protocol_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableProxyProtocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PrivateLinkServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="visibilitySubscriptionIdsInput")
    def visibility_subscription_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "visibilitySubscriptionIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoApprovalSubscriptionIds")
    def auto_approval_subscription_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "autoApprovalSubscriptionIds")

    @auto_approval_subscription_ids.setter # type: ignore
    def auto_approval_subscription_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "autoApprovalSubscriptionIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableProxyProtocol")
    def enable_proxy_protocol(self) -> builtins.bool:
        return jsii.get(self, "enableProxyProtocol")

    @enable_proxy_protocol.setter # type: ignore
    def enable_proxy_protocol(self, value: builtins.bool) -> None:
        jsii.set(self, "enableProxyProtocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerFrontendIpConfigurationIds")
    def load_balancer_frontend_ip_configuration_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "loadBalancerFrontendIpConfigurationIds")

    @load_balancer_frontend_ip_configuration_ids.setter # type: ignore
    def load_balancer_frontend_ip_configuration_ids(
        self,
        value: typing.List[builtins.str],
    ) -> None:
        jsii.set(self, "loadBalancerFrontendIpConfigurationIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natIpConfiguration")
    def nat_ip_configuration(
        self,
    ) -> typing.List["PrivateLinkServiceNatIpConfiguration"]:
        return jsii.get(self, "natIpConfiguration")

    @nat_ip_configuration.setter # type: ignore
    def nat_ip_configuration(
        self,
        value: typing.List["PrivateLinkServiceNatIpConfiguration"],
    ) -> None:
        jsii.set(self, "natIpConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PrivateLinkServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PrivateLinkServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="visibilitySubscriptionIds")
    def visibility_subscription_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "visibilitySubscriptionIds")

    @visibility_subscription_ids.setter # type: ignore
    def visibility_subscription_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "visibilitySubscriptionIds", value)


@jsii.data_type(
    jsii_type="azurerm.PrivateLinkServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "load_balancer_frontend_ip_configuration_ids": "loadBalancerFrontendIpConfigurationIds",
        "location": "location",
        "name": "name",
        "nat_ip_configuration": "natIpConfiguration",
        "resource_group_name": "resourceGroupName",
        "auto_approval_subscription_ids": "autoApprovalSubscriptionIds",
        "enable_proxy_protocol": "enableProxyProtocol",
        "tags": "tags",
        "timeouts": "timeouts",
        "visibility_subscription_ids": "visibilitySubscriptionIds",
    },
)
class PrivateLinkServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        load_balancer_frontend_ip_configuration_ids: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        nat_ip_configuration: typing.List["PrivateLinkServiceNatIpConfiguration"],
        resource_group_name: builtins.str,
        auto_approval_subscription_ids: typing.Optional[typing.List[builtins.str]] = None,
        enable_proxy_protocol: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PrivateLinkServiceTimeouts"] = None,
        visibility_subscription_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param load_balancer_frontend_ip_configuration_ids: -
        :param location: -
        :param name: -
        :param nat_ip_configuration: nat_ip_configuration block.
        :param resource_group_name: -
        :param auto_approval_subscription_ids: -
        :param enable_proxy_protocol: -
        :param tags: -
        :param timeouts: timeouts block.
        :param visibility_subscription_ids: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PrivateLinkServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "load_balancer_frontend_ip_configuration_ids": load_balancer_frontend_ip_configuration_ids,
            "location": location,
            "name": name,
            "nat_ip_configuration": nat_ip_configuration,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_approval_subscription_ids is not None:
            self._values["auto_approval_subscription_ids"] = auto_approval_subscription_ids
        if enable_proxy_protocol is not None:
            self._values["enable_proxy_protocol"] = enable_proxy_protocol
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if visibility_subscription_ids is not None:
            self._values["visibility_subscription_ids"] = visibility_subscription_ids

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def load_balancer_frontend_ip_configuration_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("load_balancer_frontend_ip_configuration_ids")
        assert result is not None, "Required property 'load_balancer_frontend_ip_configuration_ids' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def nat_ip_configuration(
        self,
    ) -> typing.List["PrivateLinkServiceNatIpConfiguration"]:
        """nat_ip_configuration block."""
        result = self._values.get("nat_ip_configuration")
        assert result is not None, "Required property 'nat_ip_configuration' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def auto_approval_subscription_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("auto_approval_subscription_ids")
        return result

    @builtins.property
    def enable_proxy_protocol(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_proxy_protocol")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PrivateLinkServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def visibility_subscription_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("visibility_subscription_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateLinkServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateLinkServiceNatIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "primary": "primary",
        "subnet_id": "subnetId",
        "private_ip_address": "privateIpAddress",
        "private_ip_address_version": "privateIpAddressVersion",
    },
)
class PrivateLinkServiceNatIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        primary: builtins.bool,
        subnet_id: builtins.str,
        private_ip_address: typing.Optional[builtins.str] = None,
        private_ip_address_version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param primary: -
        :param subnet_id: -
        :param private_ip_address: -
        :param private_ip_address_version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "primary": primary,
            "subnet_id": subnet_id,
        }
        if private_ip_address is not None:
            self._values["private_ip_address"] = private_ip_address
        if private_ip_address_version is not None:
            self._values["private_ip_address_version"] = private_ip_address_version

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def primary(self) -> builtins.bool:
        result = self._values.get("primary")
        assert result is not None, "Required property 'primary' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def private_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address")
        return result

    @builtins.property
    def private_ip_address_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address_version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateLinkServiceNatIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PrivateLinkServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PrivateLinkServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PrivateLinkServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ProximityPlacementGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ProximityPlacementGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ProximityPlacementGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProximityPlacementGroupConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ProximityPlacementGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ProximityPlacementGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ProximityPlacementGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ProximityPlacementGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ProximityPlacementGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ProximityPlacementGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ProximityPlacementGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ProximityPlacementGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ProximityPlacementGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ProximityPlacementGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ProximityPlacementGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ProximityPlacementGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ProximityPlacementGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PublicIp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PublicIp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        allocation_method: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        domain_name_label: typing.Optional[builtins.str] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        ip_version: typing.Optional[builtins.str] = None,
        public_ip_prefix_id: typing.Optional[builtins.str] = None,
        reverse_fqdn: typing.Optional[builtins.str] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PublicIpTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param allocation_method: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param domain_name_label: -
        :param idle_timeout_in_minutes: -
        :param ip_version: -
        :param public_ip_prefix_id: -
        :param reverse_fqdn: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PublicIpConfig(
            allocation_method=allocation_method,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            domain_name_label=domain_name_label,
            idle_timeout_in_minutes=idle_timeout_in_minutes,
            ip_version=ip_version,
            public_ip_prefix_id=public_ip_prefix_id,
            reverse_fqdn=reverse_fqdn,
            sku=sku,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PublicIp, self, [scope, id, config])

    @jsii.member(jsii_name="resetDomainNameLabel")
    def reset_domain_name_label(self) -> None:
        return jsii.invoke(self, "resetDomainNameLabel", [])

    @jsii.member(jsii_name="resetIdleTimeoutInMinutes")
    def reset_idle_timeout_in_minutes(self) -> None:
        return jsii.invoke(self, "resetIdleTimeoutInMinutes", [])

    @jsii.member(jsii_name="resetIpVersion")
    def reset_ip_version(self) -> None:
        return jsii.invoke(self, "resetIpVersion", [])

    @jsii.member(jsii_name="resetPublicIpPrefixId")
    def reset_public_ip_prefix_id(self) -> None:
        return jsii.invoke(self, "resetPublicIpPrefixId", [])

    @jsii.member(jsii_name="resetReverseFqdn")
    def reset_reverse_fqdn(self) -> None:
        return jsii.invoke(self, "resetReverseFqdn", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocationMethodInput")
    def allocation_method_input(self) -> builtins.str:
        return jsii.get(self, "allocationMethodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainNameLabelInput")
    def domain_name_label_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "domainNameLabelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutesInput")
    def idle_timeout_in_minutes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "idleTimeoutInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipVersionInput")
    def ip_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "ipVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpPrefixIdInput")
    def public_ip_prefix_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "publicIpPrefixIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reverseFqdnInput")
    def reverse_fqdn_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "reverseFqdnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PublicIpTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allocationMethod")
    def allocation_method(self) -> builtins.str:
        return jsii.get(self, "allocationMethod")

    @allocation_method.setter # type: ignore
    def allocation_method(self, value: builtins.str) -> None:
        jsii.set(self, "allocationMethod", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="domainNameLabel")
    def domain_name_label(self) -> builtins.str:
        return jsii.get(self, "domainNameLabel")

    @domain_name_label.setter # type: ignore
    def domain_name_label(self, value: builtins.str) -> None:
        jsii.set(self, "domainNameLabel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="idleTimeoutInMinutes")
    def idle_timeout_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "idleTimeoutInMinutes")

    @idle_timeout_in_minutes.setter # type: ignore
    def idle_timeout_in_minutes(self, value: jsii.Number) -> None:
        jsii.set(self, "idleTimeoutInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipVersion")
    def ip_version(self) -> builtins.str:
        return jsii.get(self, "ipVersion")

    @ip_version.setter # type: ignore
    def ip_version(self, value: builtins.str) -> None:
        jsii.set(self, "ipVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpPrefixId")
    def public_ip_prefix_id(self) -> builtins.str:
        return jsii.get(self, "publicIpPrefixId")

    @public_ip_prefix_id.setter # type: ignore
    def public_ip_prefix_id(self, value: builtins.str) -> None:
        jsii.set(self, "publicIpPrefixId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reverseFqdn")
    def reverse_fqdn(self) -> builtins.str:
        return jsii.get(self, "reverseFqdn")

    @reverse_fqdn.setter # type: ignore
    def reverse_fqdn(self, value: builtins.str) -> None:
        jsii.set(self, "reverseFqdn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PublicIpTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PublicIpTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.PublicIpConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "allocation_method": "allocationMethod",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "domain_name_label": "domainNameLabel",
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "ip_version": "ipVersion",
        "public_ip_prefix_id": "publicIpPrefixId",
        "reverse_fqdn": "reverseFqdn",
        "sku": "sku",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class PublicIpConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        allocation_method: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        domain_name_label: typing.Optional[builtins.str] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        ip_version: typing.Optional[builtins.str] = None,
        public_ip_prefix_id: typing.Optional[builtins.str] = None,
        reverse_fqdn: typing.Optional[builtins.str] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PublicIpTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param allocation_method: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param domain_name_label: -
        :param idle_timeout_in_minutes: -
        :param ip_version: -
        :param public_ip_prefix_id: -
        :param reverse_fqdn: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PublicIpTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "allocation_method": allocation_method,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if domain_name_label is not None:
            self._values["domain_name_label"] = domain_name_label
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if ip_version is not None:
            self._values["ip_version"] = ip_version
        if public_ip_prefix_id is not None:
            self._values["public_ip_prefix_id"] = public_ip_prefix_id
        if reverse_fqdn is not None:
            self._values["reverse_fqdn"] = reverse_fqdn
        if sku is not None:
            self._values["sku"] = sku
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def allocation_method(self) -> builtins.str:
        result = self._values.get("allocation_method")
        assert result is not None, "Required property 'allocation_method' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def domain_name_label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("domain_name_label")
        return result

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def ip_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_version")
        return result

    @builtins.property
    def public_ip_prefix_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_prefix_id")
        return result

    @builtins.property
    def reverse_fqdn(self) -> typing.Optional[builtins.str]:
        result = self._values.get("reverse_fqdn")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PublicIpTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PublicIpConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class PublicIpPrefix(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.PublicIpPrefix",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        prefix_length: typing.Optional[jsii.Number] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PublicIpPrefixTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param prefix_length: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PublicIpPrefixConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            prefix_length=prefix_length,
            sku=sku,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(PublicIpPrefix, self, [scope, id, config])

    @jsii.member(jsii_name="resetPrefixLength")
    def reset_prefix_length(self) -> None:
        return jsii.invoke(self, "resetPrefixLength", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipPrefix")
    def ip_prefix(self) -> builtins.str:
        return jsii.get(self, "ipPrefix")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="prefixLengthInput")
    def prefix_length_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "prefixLengthInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["PublicIpPrefixTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="prefixLength")
    def prefix_length(self) -> jsii.Number:
        return jsii.get(self, "prefixLength")

    @prefix_length.setter # type: ignore
    def prefix_length(self, value: jsii.Number) -> None:
        jsii.set(self, "prefixLength", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "PublicIpPrefixTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "PublicIpPrefixTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.PublicIpPrefixConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "prefix_length": "prefixLength",
        "sku": "sku",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class PublicIpPrefixConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        prefix_length: typing.Optional[jsii.Number] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["PublicIpPrefixTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param prefix_length: -
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = PublicIpPrefixTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if prefix_length is not None:
            self._values["prefix_length"] = prefix_length
        if sku is not None:
            self._values["sku"] = sku
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def prefix_length(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("prefix_length")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["PublicIpPrefixTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PublicIpPrefixConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PublicIpPrefixTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PublicIpPrefixTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PublicIpPrefixTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.PublicIpTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class PublicIpTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "PublicIpTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RecoveryServicesVault(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RecoveryServicesVault",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        identity: typing.Optional[typing.List["RecoveryServicesVaultIdentity"]] = None,
        soft_delete_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RecoveryServicesVaultTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param identity: identity block.
        :param soft_delete_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RecoveryServicesVaultConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            identity=identity,
            soft_delete_enabled=soft_delete_enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RecoveryServicesVault, self, [scope, id, config])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetSoftDeleteEnabled")
    def reset_soft_delete_enabled(self) -> None:
        return jsii.invoke(self, "resetSoftDeleteEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["RecoveryServicesVaultIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeleteEnabledInput")
    def soft_delete_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "softDeleteEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RecoveryServicesVaultTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["RecoveryServicesVaultIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["RecoveryServicesVaultIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="softDeleteEnabled")
    def soft_delete_enabled(self) -> builtins.bool:
        return jsii.get(self, "softDeleteEnabled")

    @soft_delete_enabled.setter # type: ignore
    def soft_delete_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "softDeleteEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RecoveryServicesVaultTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RecoveryServicesVaultTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RecoveryServicesVaultConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "identity": "identity",
        "soft_delete_enabled": "softDeleteEnabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class RecoveryServicesVaultConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        identity: typing.Optional[typing.List["RecoveryServicesVaultIdentity"]] = None,
        soft_delete_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RecoveryServicesVaultTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param identity: identity block.
        :param soft_delete_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RecoveryServicesVaultTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if identity is not None:
            self._values["identity"] = identity
        if soft_delete_enabled is not None:
            self._values["soft_delete_enabled"] = soft_delete_enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["RecoveryServicesVaultIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def soft_delete_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("soft_delete_enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RecoveryServicesVaultTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RecoveryServicesVaultConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RecoveryServicesVaultIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class RecoveryServicesVaultIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RecoveryServicesVaultIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RecoveryServicesVaultTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RecoveryServicesVaultTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RecoveryServicesVaultTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RedisCache(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RedisCache",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        capacity: jsii.Number,
        family: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        enable_non_ssl_port: typing.Optional[builtins.bool] = None,
        minimum_tls_version: typing.Optional[builtins.str] = None,
        patch_schedule: typing.Optional[typing.List["RedisCachePatchSchedule"]] = None,
        private_static_ip_address: typing.Optional[builtins.str] = None,
        redis_configuration: typing.Optional[typing.List["RedisCacheRedisConfiguration"]] = None,
        shard_count: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RedisCacheTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param capacity: -
        :param family: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param enable_non_ssl_port: -
        :param minimum_tls_version: -
        :param patch_schedule: patch_schedule block.
        :param private_static_ip_address: -
        :param redis_configuration: redis_configuration block.
        :param shard_count: -
        :param subnet_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RedisCacheConfig(
            capacity=capacity,
            family=family,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            enable_non_ssl_port=enable_non_ssl_port,
            minimum_tls_version=minimum_tls_version,
            patch_schedule=patch_schedule,
            private_static_ip_address=private_static_ip_address,
            redis_configuration=redis_configuration,
            shard_count=shard_count,
            subnet_id=subnet_id,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RedisCache, self, [scope, id, config])

    @jsii.member(jsii_name="resetEnableNonSslPort")
    def reset_enable_non_ssl_port(self) -> None:
        return jsii.invoke(self, "resetEnableNonSslPort", [])

    @jsii.member(jsii_name="resetMinimumTlsVersion")
    def reset_minimum_tls_version(self) -> None:
        return jsii.invoke(self, "resetMinimumTlsVersion", [])

    @jsii.member(jsii_name="resetPatchSchedule")
    def reset_patch_schedule(self) -> None:
        return jsii.invoke(self, "resetPatchSchedule", [])

    @jsii.member(jsii_name="resetPrivateStaticIpAddress")
    def reset_private_static_ip_address(self) -> None:
        return jsii.invoke(self, "resetPrivateStaticIpAddress", [])

    @jsii.member(jsii_name="resetRedisConfiguration")
    def reset_redis_configuration(self) -> None:
        return jsii.invoke(self, "resetRedisConfiguration", [])

    @jsii.member(jsii_name="resetShardCount")
    def reset_shard_count(self) -> None:
        return jsii.invoke(self, "resetShardCount", [])

    @jsii.member(jsii_name="resetSubnetId")
    def reset_subnet_id(self) -> None:
        return jsii.invoke(self, "resetSubnetId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacityInput")
    def capacity_input(self) -> jsii.Number:
        return jsii.get(self, "capacityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="familyInput")
    def family_input(self) -> builtins.str:
        return jsii.get(self, "familyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sslPort")
    def ssl_port(self) -> jsii.Number:
        return jsii.get(self, "sslPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableNonSslPortInput")
    def enable_non_ssl_port_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableNonSslPortInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minimumTlsVersionInput")
    def minimum_tls_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "minimumTlsVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="patchScheduleInput")
    def patch_schedule_input(
        self,
    ) -> typing.Optional[typing.List["RedisCachePatchSchedule"]]:
        return jsii.get(self, "patchScheduleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateStaticIpAddressInput")
    def private_static_ip_address_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "privateStaticIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redisConfigurationInput")
    def redis_configuration_input(
        self,
    ) -> typing.Optional[typing.List["RedisCacheRedisConfiguration"]]:
        return jsii.get(self, "redisConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shardCountInput")
    def shard_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "shardCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RedisCacheTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacity")
    def capacity(self) -> jsii.Number:
        return jsii.get(self, "capacity")

    @capacity.setter # type: ignore
    def capacity(self, value: jsii.Number) -> None:
        jsii.set(self, "capacity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableNonSslPort")
    def enable_non_ssl_port(self) -> builtins.bool:
        return jsii.get(self, "enableNonSslPort")

    @enable_non_ssl_port.setter # type: ignore
    def enable_non_ssl_port(self, value: builtins.bool) -> None:
        jsii.set(self, "enableNonSslPort", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="family")
    def family(self) -> builtins.str:
        return jsii.get(self, "family")

    @family.setter # type: ignore
    def family(self, value: builtins.str) -> None:
        jsii.set(self, "family", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minimumTlsVersion")
    def minimum_tls_version(self) -> builtins.str:
        return jsii.get(self, "minimumTlsVersion")

    @minimum_tls_version.setter # type: ignore
    def minimum_tls_version(self, value: builtins.str) -> None:
        jsii.set(self, "minimumTlsVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="patchSchedule")
    def patch_schedule(self) -> typing.List["RedisCachePatchSchedule"]:
        return jsii.get(self, "patchSchedule")

    @patch_schedule.setter # type: ignore
    def patch_schedule(self, value: typing.List["RedisCachePatchSchedule"]) -> None:
        jsii.set(self, "patchSchedule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateStaticIpAddress")
    def private_static_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateStaticIpAddress")

    @private_static_ip_address.setter # type: ignore
    def private_static_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "privateStaticIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redisConfiguration")
    def redis_configuration(self) -> typing.List["RedisCacheRedisConfiguration"]:
        return jsii.get(self, "redisConfiguration")

    @redis_configuration.setter # type: ignore
    def redis_configuration(
        self,
        value: typing.List["RedisCacheRedisConfiguration"],
    ) -> None:
        jsii.set(self, "redisConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shardCount")
    def shard_count(self) -> jsii.Number:
        return jsii.get(self, "shardCount")

    @shard_count.setter # type: ignore
    def shard_count(self, value: jsii.Number) -> None:
        jsii.set(self, "shardCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RedisCacheTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RedisCacheTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.RedisCacheConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "capacity": "capacity",
        "family": "family",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "enable_non_ssl_port": "enableNonSslPort",
        "minimum_tls_version": "minimumTlsVersion",
        "patch_schedule": "patchSchedule",
        "private_static_ip_address": "privateStaticIpAddress",
        "redis_configuration": "redisConfiguration",
        "shard_count": "shardCount",
        "subnet_id": "subnetId",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class RedisCacheConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        capacity: jsii.Number,
        family: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        enable_non_ssl_port: typing.Optional[builtins.bool] = None,
        minimum_tls_version: typing.Optional[builtins.str] = None,
        patch_schedule: typing.Optional[typing.List["RedisCachePatchSchedule"]] = None,
        private_static_ip_address: typing.Optional[builtins.str] = None,
        redis_configuration: typing.Optional[typing.List["RedisCacheRedisConfiguration"]] = None,
        shard_count: typing.Optional[jsii.Number] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RedisCacheTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param capacity: -
        :param family: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param enable_non_ssl_port: -
        :param minimum_tls_version: -
        :param patch_schedule: patch_schedule block.
        :param private_static_ip_address: -
        :param redis_configuration: redis_configuration block.
        :param shard_count: -
        :param subnet_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RedisCacheTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "capacity": capacity,
            "family": family,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if enable_non_ssl_port is not None:
            self._values["enable_non_ssl_port"] = enable_non_ssl_port
        if minimum_tls_version is not None:
            self._values["minimum_tls_version"] = minimum_tls_version
        if patch_schedule is not None:
            self._values["patch_schedule"] = patch_schedule
        if private_static_ip_address is not None:
            self._values["private_static_ip_address"] = private_static_ip_address
        if redis_configuration is not None:
            self._values["redis_configuration"] = redis_configuration
        if shard_count is not None:
            self._values["shard_count"] = shard_count
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def capacity(self) -> jsii.Number:
        result = self._values.get("capacity")
        assert result is not None, "Required property 'capacity' is missing"
        return result

    @builtins.property
    def family(self) -> builtins.str:
        result = self._values.get("family")
        assert result is not None, "Required property 'family' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def enable_non_ssl_port(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_non_ssl_port")
        return result

    @builtins.property
    def minimum_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("minimum_tls_version")
        return result

    @builtins.property
    def patch_schedule(self) -> typing.Optional[typing.List["RedisCachePatchSchedule"]]:
        """patch_schedule block."""
        result = self._values.get("patch_schedule")
        return result

    @builtins.property
    def private_static_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_static_ip_address")
        return result

    @builtins.property
    def redis_configuration(
        self,
    ) -> typing.Optional[typing.List["RedisCacheRedisConfiguration"]]:
        """redis_configuration block."""
        result = self._values.get("redis_configuration")
        return result

    @builtins.property
    def shard_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("shard_count")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RedisCacheTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisCacheConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RedisCachePatchSchedule",
    jsii_struct_bases=[],
    name_mapping={"day_of_week": "dayOfWeek", "start_hour_utc": "startHourUtc"},
)
class RedisCachePatchSchedule:
    def __init__(
        self,
        *,
        day_of_week: builtins.str,
        start_hour_utc: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param day_of_week: -
        :param start_hour_utc: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "day_of_week": day_of_week,
        }
        if start_hour_utc is not None:
            self._values["start_hour_utc"] = start_hour_utc

    @builtins.property
    def day_of_week(self) -> builtins.str:
        result = self._values.get("day_of_week")
        assert result is not None, "Required property 'day_of_week' is missing"
        return result

    @builtins.property
    def start_hour_utc(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("start_hour_utc")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisCachePatchSchedule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RedisCacheRedisConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "aof_backup_enabled": "aofBackupEnabled",
        "aof_storage_connection_string0": "aofStorageConnectionString0",
        "aof_storage_connection_string1": "aofStorageConnectionString1",
        "enable_authentication": "enableAuthentication",
        "maxfragmentationmemory_reserved": "maxfragmentationmemoryReserved",
        "maxmemory_delta": "maxmemoryDelta",
        "maxmemory_policy": "maxmemoryPolicy",
        "maxmemory_reserved": "maxmemoryReserved",
        "notify_keyspace_events": "notifyKeyspaceEvents",
        "rdb_backup_enabled": "rdbBackupEnabled",
        "rdb_backup_frequency": "rdbBackupFrequency",
        "rdb_backup_max_snapshot_count": "rdbBackupMaxSnapshotCount",
        "rdb_storage_connection_string": "rdbStorageConnectionString",
    },
)
class RedisCacheRedisConfiguration:
    def __init__(
        self,
        *,
        aof_backup_enabled: typing.Optional[builtins.bool] = None,
        aof_storage_connection_string0: typing.Optional[builtins.str] = None,
        aof_storage_connection_string1: typing.Optional[builtins.str] = None,
        enable_authentication: typing.Optional[builtins.bool] = None,
        maxfragmentationmemory_reserved: typing.Optional[jsii.Number] = None,
        maxmemory_delta: typing.Optional[jsii.Number] = None,
        maxmemory_policy: typing.Optional[builtins.str] = None,
        maxmemory_reserved: typing.Optional[jsii.Number] = None,
        notify_keyspace_events: typing.Optional[builtins.str] = None,
        rdb_backup_enabled: typing.Optional[builtins.bool] = None,
        rdb_backup_frequency: typing.Optional[jsii.Number] = None,
        rdb_backup_max_snapshot_count: typing.Optional[jsii.Number] = None,
        rdb_storage_connection_string: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param aof_backup_enabled: -
        :param aof_storage_connection_string0: -
        :param aof_storage_connection_string1: -
        :param enable_authentication: -
        :param maxfragmentationmemory_reserved: -
        :param maxmemory_delta: -
        :param maxmemory_policy: -
        :param maxmemory_reserved: -
        :param notify_keyspace_events: -
        :param rdb_backup_enabled: -
        :param rdb_backup_frequency: -
        :param rdb_backup_max_snapshot_count: -
        :param rdb_storage_connection_string: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if aof_backup_enabled is not None:
            self._values["aof_backup_enabled"] = aof_backup_enabled
        if aof_storage_connection_string0 is not None:
            self._values["aof_storage_connection_string0"] = aof_storage_connection_string0
        if aof_storage_connection_string1 is not None:
            self._values["aof_storage_connection_string1"] = aof_storage_connection_string1
        if enable_authentication is not None:
            self._values["enable_authentication"] = enable_authentication
        if maxfragmentationmemory_reserved is not None:
            self._values["maxfragmentationmemory_reserved"] = maxfragmentationmemory_reserved
        if maxmemory_delta is not None:
            self._values["maxmemory_delta"] = maxmemory_delta
        if maxmemory_policy is not None:
            self._values["maxmemory_policy"] = maxmemory_policy
        if maxmemory_reserved is not None:
            self._values["maxmemory_reserved"] = maxmemory_reserved
        if notify_keyspace_events is not None:
            self._values["notify_keyspace_events"] = notify_keyspace_events
        if rdb_backup_enabled is not None:
            self._values["rdb_backup_enabled"] = rdb_backup_enabled
        if rdb_backup_frequency is not None:
            self._values["rdb_backup_frequency"] = rdb_backup_frequency
        if rdb_backup_max_snapshot_count is not None:
            self._values["rdb_backup_max_snapshot_count"] = rdb_backup_max_snapshot_count
        if rdb_storage_connection_string is not None:
            self._values["rdb_storage_connection_string"] = rdb_storage_connection_string

    @builtins.property
    def aof_backup_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("aof_backup_enabled")
        return result

    @builtins.property
    def aof_storage_connection_string0(self) -> typing.Optional[builtins.str]:
        result = self._values.get("aof_storage_connection_string0")
        return result

    @builtins.property
    def aof_storage_connection_string1(self) -> typing.Optional[builtins.str]:
        result = self._values.get("aof_storage_connection_string1")
        return result

    @builtins.property
    def enable_authentication(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_authentication")
        return result

    @builtins.property
    def maxfragmentationmemory_reserved(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maxfragmentationmemory_reserved")
        return result

    @builtins.property
    def maxmemory_delta(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maxmemory_delta")
        return result

    @builtins.property
    def maxmemory_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("maxmemory_policy")
        return result

    @builtins.property
    def maxmemory_reserved(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maxmemory_reserved")
        return result

    @builtins.property
    def notify_keyspace_events(self) -> typing.Optional[builtins.str]:
        result = self._values.get("notify_keyspace_events")
        return result

    @builtins.property
    def rdb_backup_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("rdb_backup_enabled")
        return result

    @builtins.property
    def rdb_backup_frequency(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("rdb_backup_frequency")
        return result

    @builtins.property
    def rdb_backup_max_snapshot_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("rdb_backup_max_snapshot_count")
        return result

    @builtins.property
    def rdb_storage_connection_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("rdb_storage_connection_string")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisCacheRedisConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RedisCacheTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RedisCacheTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisCacheTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RedisFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RedisFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        end_ip: builtins.str,
        name: builtins.str,
        redis_cache_name: builtins.str,
        resource_group_name: builtins.str,
        start_ip: builtins.str,
        timeouts: typing.Optional["RedisFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param end_ip: -
        :param name: -
        :param redis_cache_name: -
        :param resource_group_name: -
        :param start_ip: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RedisFirewallRuleConfig(
            end_ip=end_ip,
            name=name,
            redis_cache_name=redis_cache_name,
            resource_group_name=resource_group_name,
            start_ip=start_ip,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RedisFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpInput")
    def end_ip_input(self) -> builtins.str:
        return jsii.get(self, "endIpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redisCacheNameInput")
    def redis_cache_name_input(self) -> builtins.str:
        return jsii.get(self, "redisCacheNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpInput")
    def start_ip_input(self) -> builtins.str:
        return jsii.get(self, "startIpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RedisFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIp")
    def end_ip(self) -> builtins.str:
        return jsii.get(self, "endIp")

    @end_ip.setter # type: ignore
    def end_ip(self, value: builtins.str) -> None:
        jsii.set(self, "endIp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="redisCacheName")
    def redis_cache_name(self) -> builtins.str:
        return jsii.get(self, "redisCacheName")

    @redis_cache_name.setter # type: ignore
    def redis_cache_name(self, value: builtins.str) -> None:
        jsii.set(self, "redisCacheName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIp")
    def start_ip(self) -> builtins.str:
        return jsii.get(self, "startIp")

    @start_ip.setter # type: ignore
    def start_ip(self, value: builtins.str) -> None:
        jsii.set(self, "startIp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RedisFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RedisFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RedisFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "end_ip": "endIp",
        "name": "name",
        "redis_cache_name": "redisCacheName",
        "resource_group_name": "resourceGroupName",
        "start_ip": "startIp",
        "timeouts": "timeouts",
    },
)
class RedisFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        end_ip: builtins.str,
        name: builtins.str,
        redis_cache_name: builtins.str,
        resource_group_name: builtins.str,
        start_ip: builtins.str,
        timeouts: typing.Optional["RedisFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param end_ip: -
        :param name: -
        :param redis_cache_name: -
        :param resource_group_name: -
        :param start_ip: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RedisFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "end_ip": end_ip,
            "name": name,
            "redis_cache_name": redis_cache_name,
            "resource_group_name": resource_group_name,
            "start_ip": start_ip,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def end_ip(self) -> builtins.str:
        result = self._values.get("end_ip")
        assert result is not None, "Required property 'end_ip' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def redis_cache_name(self) -> builtins.str:
        result = self._values.get("redis_cache_name")
        assert result is not None, "Required property 'redis_cache_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def start_ip(self) -> builtins.str:
        result = self._values.get("start_ip")
        assert result is not None, "Required property 'start_ip' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RedisFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RedisFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RedisFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RedisLinkedServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RedisLinkedServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        linked_redis_cache_id: builtins.str,
        linked_redis_cache_location: builtins.str,
        resource_group_name: builtins.str,
        server_role: builtins.str,
        target_redis_cache_name: builtins.str,
        timeouts: typing.Optional["RedisLinkedServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param linked_redis_cache_id: -
        :param linked_redis_cache_location: -
        :param resource_group_name: -
        :param server_role: -
        :param target_redis_cache_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RedisLinkedServerConfig(
            linked_redis_cache_id=linked_redis_cache_id,
            linked_redis_cache_location=linked_redis_cache_location,
            resource_group_name=resource_group_name,
            server_role=server_role,
            target_redis_cache_name=target_redis_cache_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RedisLinkedServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedRedisCacheIdInput")
    def linked_redis_cache_id_input(self) -> builtins.str:
        return jsii.get(self, "linkedRedisCacheIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedRedisCacheLocationInput")
    def linked_redis_cache_location_input(self) -> builtins.str:
        return jsii.get(self, "linkedRedisCacheLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverRoleInput")
    def server_role_input(self) -> builtins.str:
        return jsii.get(self, "serverRoleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRedisCacheNameInput")
    def target_redis_cache_name_input(self) -> builtins.str:
        return jsii.get(self, "targetRedisCacheNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RedisLinkedServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedRedisCacheId")
    def linked_redis_cache_id(self) -> builtins.str:
        return jsii.get(self, "linkedRedisCacheId")

    @linked_redis_cache_id.setter # type: ignore
    def linked_redis_cache_id(self, value: builtins.str) -> None:
        jsii.set(self, "linkedRedisCacheId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkedRedisCacheLocation")
    def linked_redis_cache_location(self) -> builtins.str:
        return jsii.get(self, "linkedRedisCacheLocation")

    @linked_redis_cache_location.setter # type: ignore
    def linked_redis_cache_location(self, value: builtins.str) -> None:
        jsii.set(self, "linkedRedisCacheLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverRole")
    def server_role(self) -> builtins.str:
        return jsii.get(self, "serverRole")

    @server_role.setter # type: ignore
    def server_role(self, value: builtins.str) -> None:
        jsii.set(self, "serverRole", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRedisCacheName")
    def target_redis_cache_name(self) -> builtins.str:
        return jsii.get(self, "targetRedisCacheName")

    @target_redis_cache_name.setter # type: ignore
    def target_redis_cache_name(self, value: builtins.str) -> None:
        jsii.set(self, "targetRedisCacheName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RedisLinkedServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RedisLinkedServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RedisLinkedServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "linked_redis_cache_id": "linkedRedisCacheId",
        "linked_redis_cache_location": "linkedRedisCacheLocation",
        "resource_group_name": "resourceGroupName",
        "server_role": "serverRole",
        "target_redis_cache_name": "targetRedisCacheName",
        "timeouts": "timeouts",
    },
)
class RedisLinkedServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        linked_redis_cache_id: builtins.str,
        linked_redis_cache_location: builtins.str,
        resource_group_name: builtins.str,
        server_role: builtins.str,
        target_redis_cache_name: builtins.str,
        timeouts: typing.Optional["RedisLinkedServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param linked_redis_cache_id: -
        :param linked_redis_cache_location: -
        :param resource_group_name: -
        :param server_role: -
        :param target_redis_cache_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RedisLinkedServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "linked_redis_cache_id": linked_redis_cache_id,
            "linked_redis_cache_location": linked_redis_cache_location,
            "resource_group_name": resource_group_name,
            "server_role": server_role,
            "target_redis_cache_name": target_redis_cache_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def linked_redis_cache_id(self) -> builtins.str:
        result = self._values.get("linked_redis_cache_id")
        assert result is not None, "Required property 'linked_redis_cache_id' is missing"
        return result

    @builtins.property
    def linked_redis_cache_location(self) -> builtins.str:
        result = self._values.get("linked_redis_cache_location")
        assert result is not None, "Required property 'linked_redis_cache_location' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_role(self) -> builtins.str:
        result = self._values.get("server_role")
        assert result is not None, "Required property 'server_role' is missing"
        return result

    @builtins.property
    def target_redis_cache_name(self) -> builtins.str:
        result = self._values.get("target_redis_cache_name")
        assert result is not None, "Required property 'target_redis_cache_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RedisLinkedServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisLinkedServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RedisLinkedServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RedisLinkedServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RedisLinkedServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RelayHybridConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RelayHybridConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        relay_namespace_name: builtins.str,
        resource_group_name: builtins.str,
        requires_client_authorization: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["RelayHybridConnectionTimeouts"] = None,
        user_metadata: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param relay_namespace_name: -
        :param resource_group_name: -
        :param requires_client_authorization: -
        :param timeouts: timeouts block.
        :param user_metadata: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RelayHybridConnectionConfig(
            name=name,
            relay_namespace_name=relay_namespace_name,
            resource_group_name=resource_group_name,
            requires_client_authorization=requires_client_authorization,
            timeouts=timeouts,
            user_metadata=user_metadata,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RelayHybridConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetRequiresClientAuthorization")
    def reset_requires_client_authorization(self) -> None:
        return jsii.invoke(self, "resetRequiresClientAuthorization", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUserMetadata")
    def reset_user_metadata(self) -> None:
        return jsii.invoke(self, "resetUserMetadata", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relayNamespaceNameInput")
    def relay_namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "relayNamespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresClientAuthorizationInput")
    def requires_client_authorization_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "requiresClientAuthorizationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RelayHybridConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userMetadataInput")
    def user_metadata_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "userMetadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="relayNamespaceName")
    def relay_namespace_name(self) -> builtins.str:
        return jsii.get(self, "relayNamespaceName")

    @relay_namespace_name.setter # type: ignore
    def relay_namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "relayNamespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresClientAuthorization")
    def requires_client_authorization(self) -> builtins.bool:
        return jsii.get(self, "requiresClientAuthorization")

    @requires_client_authorization.setter # type: ignore
    def requires_client_authorization(self, value: builtins.bool) -> None:
        jsii.set(self, "requiresClientAuthorization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RelayHybridConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RelayHybridConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userMetadata")
    def user_metadata(self) -> builtins.str:
        return jsii.get(self, "userMetadata")

    @user_metadata.setter # type: ignore
    def user_metadata(self, value: builtins.str) -> None:
        jsii.set(self, "userMetadata", value)


@jsii.data_type(
    jsii_type="azurerm.RelayHybridConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "relay_namespace_name": "relayNamespaceName",
        "resource_group_name": "resourceGroupName",
        "requires_client_authorization": "requiresClientAuthorization",
        "timeouts": "timeouts",
        "user_metadata": "userMetadata",
    },
)
class RelayHybridConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        relay_namespace_name: builtins.str,
        resource_group_name: builtins.str,
        requires_client_authorization: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["RelayHybridConnectionTimeouts"] = None,
        user_metadata: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param relay_namespace_name: -
        :param resource_group_name: -
        :param requires_client_authorization: -
        :param timeouts: timeouts block.
        :param user_metadata: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RelayHybridConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "relay_namespace_name": relay_namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if requires_client_authorization is not None:
            self._values["requires_client_authorization"] = requires_client_authorization
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if user_metadata is not None:
            self._values["user_metadata"] = user_metadata

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def relay_namespace_name(self) -> builtins.str:
        result = self._values.get("relay_namespace_name")
        assert result is not None, "Required property 'relay_namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def requires_client_authorization(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("requires_client_authorization")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RelayHybridConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def user_metadata(self) -> typing.Optional[builtins.str]:
        result = self._values.get("user_metadata")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RelayHybridConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RelayHybridConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RelayHybridConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RelayHybridConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RelayNamespace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RelayNamespace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RelayNamespaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RelayNamespaceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RelayNamespace, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metricId")
    def metric_id(self) -> builtins.str:
        return jsii.get(self, "metricId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RelayNamespaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RelayNamespaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RelayNamespaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RelayNamespaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class RelayNamespaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RelayNamespaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RelayNamespaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku_name": sku_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RelayNamespaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RelayNamespaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RelayNamespaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RelayNamespaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RelayNamespaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ResourceGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ResourceGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ResourceGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ResourceGroupConfig(
            location=location,
            name=name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ResourceGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ResourceGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ResourceGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ResourceGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ResourceGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ResourceGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ResourceGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ResourceGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ResourceGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ResourceGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ResourceGroupTemplateDeployment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ResourceGroupTemplateDeployment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        deployment_mode: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        template_content: builtins.str,
        debug_level: typing.Optional[builtins.str] = None,
        parameters_content: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ResourceGroupTemplateDeploymentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param deployment_mode: -
        :param name: -
        :param resource_group_name: -
        :param template_content: -
        :param debug_level: -
        :param parameters_content: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ResourceGroupTemplateDeploymentConfig(
            deployment_mode=deployment_mode,
            name=name,
            resource_group_name=resource_group_name,
            template_content=template_content,
            debug_level=debug_level,
            parameters_content=parameters_content,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ResourceGroupTemplateDeployment, self, [scope, id, config])

    @jsii.member(jsii_name="resetDebugLevel")
    def reset_debug_level(self) -> None:
        return jsii.invoke(self, "resetDebugLevel", [])

    @jsii.member(jsii_name="resetParametersContent")
    def reset_parameters_content(self) -> None:
        return jsii.invoke(self, "resetParametersContent", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deploymentModeInput")
    def deployment_mode_input(self) -> builtins.str:
        return jsii.get(self, "deploymentModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputContent")
    def output_content(self) -> builtins.str:
        return jsii.get(self, "outputContent")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateContentInput")
    def template_content_input(self) -> builtins.str:
        return jsii.get(self, "templateContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="debugLevelInput")
    def debug_level_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "debugLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersContentInput")
    def parameters_content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parametersContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ResourceGroupTemplateDeploymentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="debugLevel")
    def debug_level(self) -> builtins.str:
        return jsii.get(self, "debugLevel")

    @debug_level.setter # type: ignore
    def debug_level(self, value: builtins.str) -> None:
        jsii.set(self, "debugLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deploymentMode")
    def deployment_mode(self) -> builtins.str:
        return jsii.get(self, "deploymentMode")

    @deployment_mode.setter # type: ignore
    def deployment_mode(self, value: builtins.str) -> None:
        jsii.set(self, "deploymentMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersContent")
    def parameters_content(self) -> builtins.str:
        return jsii.get(self, "parametersContent")

    @parameters_content.setter # type: ignore
    def parameters_content(self, value: builtins.str) -> None:
        jsii.set(self, "parametersContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateContent")
    def template_content(self) -> builtins.str:
        return jsii.get(self, "templateContent")

    @template_content.setter # type: ignore
    def template_content(self, value: builtins.str) -> None:
        jsii.set(self, "templateContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ResourceGroupTemplateDeploymentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ResourceGroupTemplateDeploymentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ResourceGroupTemplateDeploymentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "deployment_mode": "deploymentMode",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "template_content": "templateContent",
        "debug_level": "debugLevel",
        "parameters_content": "parametersContent",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ResourceGroupTemplateDeploymentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        deployment_mode: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        template_content: builtins.str,
        debug_level: typing.Optional[builtins.str] = None,
        parameters_content: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ResourceGroupTemplateDeploymentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param deployment_mode: -
        :param name: -
        :param resource_group_name: -
        :param template_content: -
        :param debug_level: -
        :param parameters_content: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ResourceGroupTemplateDeploymentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "deployment_mode": deployment_mode,
            "name": name,
            "resource_group_name": resource_group_name,
            "template_content": template_content,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if debug_level is not None:
            self._values["debug_level"] = debug_level
        if parameters_content is not None:
            self._values["parameters_content"] = parameters_content
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def deployment_mode(self) -> builtins.str:
        result = self._values.get("deployment_mode")
        assert result is not None, "Required property 'deployment_mode' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def template_content(self) -> builtins.str:
        result = self._values.get("template_content")
        assert result is not None, "Required property 'template_content' is missing"
        return result

    @builtins.property
    def debug_level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("debug_level")
        return result

    @builtins.property
    def parameters_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters_content")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ResourceGroupTemplateDeploymentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ResourceGroupTemplateDeploymentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ResourceGroupTemplateDeploymentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ResourceGroupTemplateDeploymentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ResourceGroupTemplateDeploymentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ResourceGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ResourceGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ResourceGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ResourceProviderRegistration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ResourceProviderRegistration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        timeouts: typing.Optional["ResourceProviderRegistrationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ResourceProviderRegistrationConfig(
            name=name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ResourceProviderRegistration, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ResourceProviderRegistrationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ResourceProviderRegistrationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ResourceProviderRegistrationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ResourceProviderRegistrationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "timeouts": "timeouts",
    },
)
class ResourceProviderRegistrationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        timeouts: typing.Optional["ResourceProviderRegistrationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ResourceProviderRegistrationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ResourceProviderRegistrationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ResourceProviderRegistrationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ResourceProviderRegistrationTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class ResourceProviderRegistrationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ResourceProviderRegistrationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RoleAssignment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RoleAssignment",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        principal_id: builtins.str,
        scope: builtins.str,
        name: typing.Optional[builtins.str] = None,
        role_definition_id: typing.Optional[builtins.str] = None,
        role_definition_name: typing.Optional[builtins.str] = None,
        skip_service_principal_aad_check: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["RoleAssignmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param principal_id: -
        :param scope: -
        :param name: -
        :param role_definition_id: -
        :param role_definition_name: -
        :param skip_service_principal_aad_check: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RoleAssignmentConfig(
            principal_id=principal_id,
            scope=scope,
            name=name,
            role_definition_id=role_definition_id,
            role_definition_name=role_definition_name,
            skip_service_principal_aad_check=skip_service_principal_aad_check,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RoleAssignment, self, [scope_, id, config])

    @jsii.member(jsii_name="resetName")
    def reset_name(self) -> None:
        return jsii.invoke(self, "resetName", [])

    @jsii.member(jsii_name="resetRoleDefinitionId")
    def reset_role_definition_id(self) -> None:
        return jsii.invoke(self, "resetRoleDefinitionId", [])

    @jsii.member(jsii_name="resetRoleDefinitionName")
    def reset_role_definition_name(self) -> None:
        return jsii.invoke(self, "resetRoleDefinitionName", [])

    @jsii.member(jsii_name="resetSkipServicePrincipalAadCheck")
    def reset_skip_service_principal_aad_check(self) -> None:
        return jsii.invoke(self, "resetSkipServicePrincipalAadCheck", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalIdInput")
    def principal_id_input(self) -> builtins.str:
        return jsii.get(self, "principalIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalType")
    def principal_type(self) -> builtins.str:
        return jsii.get(self, "principalType")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionIdInput")
    def role_definition_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "roleDefinitionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionNameInput")
    def role_definition_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "roleDefinitionNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skipServicePrincipalAadCheckInput")
    def skip_service_principal_aad_check_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "skipServicePrincipalAadCheckInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RoleAssignmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @principal_id.setter # type: ignore
    def principal_id(self, value: builtins.str) -> None:
        jsii.set(self, "principalId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionId")
    def role_definition_id(self) -> builtins.str:
        return jsii.get(self, "roleDefinitionId")

    @role_definition_id.setter # type: ignore
    def role_definition_id(self, value: builtins.str) -> None:
        jsii.set(self, "roleDefinitionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionName")
    def role_definition_name(self) -> builtins.str:
        return jsii.get(self, "roleDefinitionName")

    @role_definition_name.setter # type: ignore
    def role_definition_name(self, value: builtins.str) -> None:
        jsii.set(self, "roleDefinitionName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skipServicePrincipalAadCheck")
    def skip_service_principal_aad_check(self) -> builtins.bool:
        return jsii.get(self, "skipServicePrincipalAadCheck")

    @skip_service_principal_aad_check.setter # type: ignore
    def skip_service_principal_aad_check(self, value: builtins.bool) -> None:
        jsii.set(self, "skipServicePrincipalAadCheck", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RoleAssignmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RoleAssignmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RoleAssignmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "principal_id": "principalId",
        "scope": "scope",
        "name": "name",
        "role_definition_id": "roleDefinitionId",
        "role_definition_name": "roleDefinitionName",
        "skip_service_principal_aad_check": "skipServicePrincipalAadCheck",
        "timeouts": "timeouts",
    },
)
class RoleAssignmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        principal_id: builtins.str,
        scope: builtins.str,
        name: typing.Optional[builtins.str] = None,
        role_definition_id: typing.Optional[builtins.str] = None,
        role_definition_name: typing.Optional[builtins.str] = None,
        skip_service_principal_aad_check: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["RoleAssignmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param principal_id: -
        :param scope: -
        :param name: -
        :param role_definition_id: -
        :param role_definition_name: -
        :param skip_service_principal_aad_check: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RoleAssignmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "principal_id": principal_id,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if name is not None:
            self._values["name"] = name
        if role_definition_id is not None:
            self._values["role_definition_id"] = role_definition_id
        if role_definition_name is not None:
            self._values["role_definition_name"] = role_definition_name
        if skip_service_principal_aad_check is not None:
            self._values["skip_service_principal_aad_check"] = skip_service_principal_aad_check
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def principal_id(self) -> builtins.str:
        result = self._values.get("principal_id")
        assert result is not None, "Required property 'principal_id' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def role_definition_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("role_definition_id")
        return result

    @builtins.property
    def role_definition_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("role_definition_name")
        return result

    @builtins.property
    def skip_service_principal_aad_check(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("skip_service_principal_aad_check")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RoleAssignmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RoleAssignmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RoleAssignmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RoleAssignmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RoleAssignmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RoleDefinition(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RoleDefinition",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        permissions: typing.List["RoleDefinitionPermissions"],
        scope: builtins.str,
        assignable_scopes: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        role_definition_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["RoleDefinitionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param name: -
        :param permissions: permissions block.
        :param scope: -
        :param assignable_scopes: -
        :param description: -
        :param role_definition_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RoleDefinitionConfig(
            name=name,
            permissions=permissions,
            scope=scope,
            assignable_scopes=assignable_scopes,
            description=description,
            role_definition_id=role_definition_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RoleDefinition, self, [scope_, id, config])

    @jsii.member(jsii_name="resetAssignableScopes")
    def reset_assignable_scopes(self) -> None:
        return jsii.invoke(self, "resetAssignableScopes", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetRoleDefinitionId")
    def reset_role_definition_id(self) -> None:
        return jsii.invoke(self, "resetRoleDefinitionId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="permissionsInput")
    def permissions_input(self) -> typing.List["RoleDefinitionPermissions"]:
        return jsii.get(self, "permissionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionResourceId")
    def role_definition_resource_id(self) -> builtins.str:
        return jsii.get(self, "roleDefinitionResourceId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="assignableScopesInput")
    def assignable_scopes_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "assignableScopesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionIdInput")
    def role_definition_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "roleDefinitionIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RoleDefinitionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="assignableScopes")
    def assignable_scopes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "assignableScopes")

    @assignable_scopes.setter # type: ignore
    def assignable_scopes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "assignableScopes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="permissions")
    def permissions(self) -> typing.List["RoleDefinitionPermissions"]:
        return jsii.get(self, "permissions")

    @permissions.setter # type: ignore
    def permissions(self, value: typing.List["RoleDefinitionPermissions"]) -> None:
        jsii.set(self, "permissions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleDefinitionId")
    def role_definition_id(self) -> builtins.str:
        return jsii.get(self, "roleDefinitionId")

    @role_definition_id.setter # type: ignore
    def role_definition_id(self, value: builtins.str) -> None:
        jsii.set(self, "roleDefinitionId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RoleDefinitionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RoleDefinitionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RoleDefinitionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "permissions": "permissions",
        "scope": "scope",
        "assignable_scopes": "assignableScopes",
        "description": "description",
        "role_definition_id": "roleDefinitionId",
        "timeouts": "timeouts",
    },
)
class RoleDefinitionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        permissions: typing.List["RoleDefinitionPermissions"],
        scope: builtins.str,
        assignable_scopes: typing.Optional[typing.List[builtins.str]] = None,
        description: typing.Optional[builtins.str] = None,
        role_definition_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["RoleDefinitionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param permissions: permissions block.
        :param scope: -
        :param assignable_scopes: -
        :param description: -
        :param role_definition_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RoleDefinitionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "permissions": permissions,
            "scope": scope,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if assignable_scopes is not None:
            self._values["assignable_scopes"] = assignable_scopes
        if description is not None:
            self._values["description"] = description
        if role_definition_id is not None:
            self._values["role_definition_id"] = role_definition_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def permissions(self) -> typing.List["RoleDefinitionPermissions"]:
        """permissions block."""
        result = self._values.get("permissions")
        assert result is not None, "Required property 'permissions' is missing"
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def assignable_scopes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("assignable_scopes")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def role_definition_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("role_definition_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RoleDefinitionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RoleDefinitionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RoleDefinitionPermissions",
    jsii_struct_bases=[],
    name_mapping={
        "actions": "actions",
        "data_actions": "dataActions",
        "not_actions": "notActions",
        "not_data_actions": "notDataActions",
    },
)
class RoleDefinitionPermissions:
    def __init__(
        self,
        *,
        actions: typing.Optional[typing.List[builtins.str]] = None,
        data_actions: typing.Optional[typing.List[builtins.str]] = None,
        not_actions: typing.Optional[typing.List[builtins.str]] = None,
        not_data_actions: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param actions: -
        :param data_actions: -
        :param not_actions: -
        :param not_data_actions: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if actions is not None:
            self._values["actions"] = actions
        if data_actions is not None:
            self._values["data_actions"] = data_actions
        if not_actions is not None:
            self._values["not_actions"] = not_actions
        if not_data_actions is not None:
            self._values["not_data_actions"] = not_data_actions

    @builtins.property
    def actions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("actions")
        return result

    @builtins.property
    def data_actions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("data_actions")
        return result

    @builtins.property
    def not_actions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("not_actions")
        return result

    @builtins.property
    def not_data_actions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("not_data_actions")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RoleDefinitionPermissions(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RoleDefinitionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RoleDefinitionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RoleDefinitionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Route(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Route",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        address_prefix: builtins.str,
        name: builtins.str,
        next_hop_type: builtins.str,
        resource_group_name: builtins.str,
        route_table_name: builtins.str,
        next_hop_in_ip_address: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["RouteTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param address_prefix: -
        :param name: -
        :param next_hop_type: -
        :param resource_group_name: -
        :param route_table_name: -
        :param next_hop_in_ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RouteConfig(
            address_prefix=address_prefix,
            name=name,
            next_hop_type=next_hop_type,
            resource_group_name=resource_group_name,
            route_table_name=route_table_name,
            next_hop_in_ip_address=next_hop_in_ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Route, self, [scope, id, config])

    @jsii.member(jsii_name="resetNextHopInIpAddress")
    def reset_next_hop_in_ip_address(self) -> None:
        return jsii.invoke(self, "resetNextHopInIpAddress", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixInput")
    def address_prefix_input(self) -> builtins.str:
        return jsii.get(self, "addressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nextHopTypeInput")
    def next_hop_type_input(self) -> builtins.str:
        return jsii.get(self, "nextHopTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeTableNameInput")
    def route_table_name_input(self) -> builtins.str:
        return jsii.get(self, "routeTableNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nextHopInIpAddressInput")
    def next_hop_in_ip_address_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "nextHopInIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RouteTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefix")
    def address_prefix(self) -> builtins.str:
        return jsii.get(self, "addressPrefix")

    @address_prefix.setter # type: ignore
    def address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "addressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nextHopInIpAddress")
    def next_hop_in_ip_address(self) -> builtins.str:
        return jsii.get(self, "nextHopInIpAddress")

    @next_hop_in_ip_address.setter # type: ignore
    def next_hop_in_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "nextHopInIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nextHopType")
    def next_hop_type(self) -> builtins.str:
        return jsii.get(self, "nextHopType")

    @next_hop_type.setter # type: ignore
    def next_hop_type(self, value: builtins.str) -> None:
        jsii.set(self, "nextHopType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeTableName")
    def route_table_name(self) -> builtins.str:
        return jsii.get(self, "routeTableName")

    @route_table_name.setter # type: ignore
    def route_table_name(self, value: builtins.str) -> None:
        jsii.set(self, "routeTableName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RouteTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RouteTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RouteConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "address_prefix": "addressPrefix",
        "name": "name",
        "next_hop_type": "nextHopType",
        "resource_group_name": "resourceGroupName",
        "route_table_name": "routeTableName",
        "next_hop_in_ip_address": "nextHopInIpAddress",
        "timeouts": "timeouts",
    },
)
class RouteConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        address_prefix: builtins.str,
        name: builtins.str,
        next_hop_type: builtins.str,
        resource_group_name: builtins.str,
        route_table_name: builtins.str,
        next_hop_in_ip_address: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["RouteTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param address_prefix: -
        :param name: -
        :param next_hop_type: -
        :param resource_group_name: -
        :param route_table_name: -
        :param next_hop_in_ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RouteTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "address_prefix": address_prefix,
            "name": name,
            "next_hop_type": next_hop_type,
            "resource_group_name": resource_group_name,
            "route_table_name": route_table_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if next_hop_in_ip_address is not None:
            self._values["next_hop_in_ip_address"] = next_hop_in_ip_address
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def address_prefix(self) -> builtins.str:
        result = self._values.get("address_prefix")
        assert result is not None, "Required property 'address_prefix' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def next_hop_type(self) -> builtins.str:
        result = self._values.get("next_hop_type")
        assert result is not None, "Required property 'next_hop_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def route_table_name(self) -> builtins.str:
        result = self._values.get("route_table_name")
        assert result is not None, "Required property 'route_table_name' is missing"
        return result

    @builtins.property
    def next_hop_in_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("next_hop_in_ip_address")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RouteTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RouteFilter(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RouteFilter",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        rule: typing.Optional[typing.List["RouteFilterRule"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RouteFilterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param rule: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RouteFilterConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            rule=rule,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RouteFilter, self, [scope, id, config])

    @jsii.member(jsii_name="resetRule")
    def reset_rule(self) -> None:
        return jsii.invoke(self, "resetRule", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleInput")
    def rule_input(self) -> typing.Optional[typing.List["RouteFilterRule"]]:
        return jsii.get(self, "ruleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RouteFilterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rule")
    def rule(self) -> typing.List["RouteFilterRule"]:
        return jsii.get(self, "rule")

    @rule.setter # type: ignore
    def rule(self, value: typing.List["RouteFilterRule"]) -> None:
        jsii.set(self, "rule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RouteFilterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RouteFilterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RouteFilterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "rule": "rule",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class RouteFilterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        rule: typing.Optional[typing.List["RouteFilterRule"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RouteFilterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param rule: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RouteFilterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if rule is not None:
            self._values["rule"] = rule
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def rule(self) -> typing.Optional[typing.List["RouteFilterRule"]]:
        result = self._values.get("rule")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RouteFilterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteFilterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RouteFilterRule",
    jsii_struct_bases=[],
    name_mapping={
        "access": "access",
        "communities": "communities",
        "name": "name",
        "rule_type": "ruleType",
    },
)
class RouteFilterRule:
    def __init__(
        self,
        *,
        access: typing.Optional[builtins.str] = None,
        communities: typing.Optional[typing.List[builtins.str]] = None,
        name: typing.Optional[builtins.str] = None,
        rule_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param access: -
        :param communities: -
        :param name: -
        :param rule_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if access is not None:
            self._values["access"] = access
        if communities is not None:
            self._values["communities"] = communities
        if name is not None:
            self._values["name"] = name
        if rule_type is not None:
            self._values["rule_type"] = rule_type

    @builtins.property
    def access(self) -> typing.Optional[builtins.str]:
        result = self._values.get("access")
        return result

    @builtins.property
    def communities(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("communities")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def rule_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("rule_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteFilterRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RouteFilterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RouteFilterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteFilterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class RouteTable(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.RouteTable",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        disable_bgp_route_propagation: typing.Optional[builtins.bool] = None,
        route: typing.Optional[typing.List["RouteTableRoute"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RouteTableTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param disable_bgp_route_propagation: -
        :param route: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RouteTableConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            disable_bgp_route_propagation=disable_bgp_route_propagation,
            route=route,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(RouteTable, self, [scope, id, config])

    @jsii.member(jsii_name="resetDisableBgpRoutePropagation")
    def reset_disable_bgp_route_propagation(self) -> None:
        return jsii.invoke(self, "resetDisableBgpRoutePropagation", [])

    @jsii.member(jsii_name="resetRoute")
    def reset_route(self) -> None:
        return jsii.invoke(self, "resetRoute", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnets")
    def subnets(self) -> typing.List[builtins.str]:
        return jsii.get(self, "subnets")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableBgpRoutePropagationInput")
    def disable_bgp_route_propagation_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableBgpRoutePropagationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeInput")
    def route_input(self) -> typing.Optional[typing.List["RouteTableRoute"]]:
        return jsii.get(self, "routeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["RouteTableTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableBgpRoutePropagation")
    def disable_bgp_route_propagation(self) -> builtins.bool:
        return jsii.get(self, "disableBgpRoutePropagation")

    @disable_bgp_route_propagation.setter # type: ignore
    def disable_bgp_route_propagation(self, value: builtins.bool) -> None:
        jsii.set(self, "disableBgpRoutePropagation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="route")
    def route(self) -> typing.List["RouteTableRoute"]:
        return jsii.get(self, "route")

    @route.setter # type: ignore
    def route(self, value: typing.List["RouteTableRoute"]) -> None:
        jsii.set(self, "route", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "RouteTableTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "RouteTableTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.RouteTableConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "disable_bgp_route_propagation": "disableBgpRoutePropagation",
        "route": "route",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class RouteTableConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        disable_bgp_route_propagation: typing.Optional[builtins.bool] = None,
        route: typing.Optional[typing.List["RouteTableRoute"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["RouteTableTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param disable_bgp_route_propagation: -
        :param route: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = RouteTableTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if disable_bgp_route_propagation is not None:
            self._values["disable_bgp_route_propagation"] = disable_bgp_route_propagation
        if route is not None:
            self._values["route"] = route
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def disable_bgp_route_propagation(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disable_bgp_route_propagation")
        return result

    @builtins.property
    def route(self) -> typing.Optional[typing.List["RouteTableRoute"]]:
        result = self._values.get("route")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["RouteTableTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteTableConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RouteTableRoute",
    jsii_struct_bases=[],
    name_mapping={
        "address_prefix": "addressPrefix",
        "name": "name",
        "next_hop_in_ip_address": "nextHopInIpAddress",
        "next_hop_type": "nextHopType",
    },
)
class RouteTableRoute:
    def __init__(
        self,
        *,
        address_prefix: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        next_hop_in_ip_address: typing.Optional[builtins.str] = None,
        next_hop_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param address_prefix: -
        :param name: -
        :param next_hop_in_ip_address: -
        :param next_hop_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if address_prefix is not None:
            self._values["address_prefix"] = address_prefix
        if name is not None:
            self._values["name"] = name
        if next_hop_in_ip_address is not None:
            self._values["next_hop_in_ip_address"] = next_hop_in_ip_address
        if next_hop_type is not None:
            self._values["next_hop_type"] = next_hop_type

    @builtins.property
    def address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("address_prefix")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def next_hop_in_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("next_hop_in_ip_address")
        return result

    @builtins.property
    def next_hop_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("next_hop_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteTableRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RouteTableTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RouteTableTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteTableTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.RouteTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class RouteTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "RouteTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SearchService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SearchService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        allowed_ips: typing.Optional[typing.List[builtins.str]] = None,
        identity: typing.Optional[typing.List["SearchServiceIdentity"]] = None,
        partition_count: typing.Optional[jsii.Number] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        replica_count: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SearchServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param allowed_ips: -
        :param identity: identity block.
        :param partition_count: -
        :param public_network_access_enabled: -
        :param replica_count: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SearchServiceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            allowed_ips=allowed_ips,
            identity=identity,
            partition_count=partition_count,
            public_network_access_enabled=public_network_access_enabled,
            replica_count=replica_count,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SearchService, self, [scope, id, config])

    @jsii.member(jsii_name="queryKeys")
    def query_keys(self, index: builtins.str) -> "SearchServiceQueryKeys":
        """
        :param index: -
        """
        return jsii.invoke(self, "queryKeys", [index])

    @jsii.member(jsii_name="resetAllowedIps")
    def reset_allowed_ips(self) -> None:
        return jsii.invoke(self, "resetAllowedIps", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetPartitionCount")
    def reset_partition_count(self) -> None:
        return jsii.invoke(self, "resetPartitionCount", [])

    @jsii.member(jsii_name="resetPublicNetworkAccessEnabled")
    def reset_public_network_access_enabled(self) -> None:
        return jsii.invoke(self, "resetPublicNetworkAccessEnabled", [])

    @jsii.member(jsii_name="resetReplicaCount")
    def reset_replica_count(self) -> None:
        return jsii.invoke(self, "resetReplicaCount", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedIpsInput")
    def allowed_ips_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "allowedIpsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["SearchServiceIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionCountInput")
    def partition_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "partitionCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabledInput")
    def public_network_access_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "publicNetworkAccessEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="replicaCountInput")
    def replica_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "replicaCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SearchServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowedIps")
    def allowed_ips(self) -> typing.List[builtins.str]:
        return jsii.get(self, "allowedIps")

    @allowed_ips.setter # type: ignore
    def allowed_ips(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "allowedIps", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["SearchServiceIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["SearchServiceIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionCount")
    def partition_count(self) -> jsii.Number:
        return jsii.get(self, "partitionCount")

    @partition_count.setter # type: ignore
    def partition_count(self, value: jsii.Number) -> None:
        jsii.set(self, "partitionCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicNetworkAccessEnabled")
    def public_network_access_enabled(self) -> builtins.bool:
        return jsii.get(self, "publicNetworkAccessEnabled")

    @public_network_access_enabled.setter # type: ignore
    def public_network_access_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "publicNetworkAccessEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="replicaCount")
    def replica_count(self) -> jsii.Number:
        return jsii.get(self, "replicaCount")

    @replica_count.setter # type: ignore
    def replica_count(self, value: jsii.Number) -> None:
        jsii.set(self, "replicaCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SearchServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SearchServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SearchServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "allowed_ips": "allowedIps",
        "identity": "identity",
        "partition_count": "partitionCount",
        "public_network_access_enabled": "publicNetworkAccessEnabled",
        "replica_count": "replicaCount",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SearchServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        allowed_ips: typing.Optional[typing.List[builtins.str]] = None,
        identity: typing.Optional[typing.List["SearchServiceIdentity"]] = None,
        partition_count: typing.Optional[jsii.Number] = None,
        public_network_access_enabled: typing.Optional[builtins.bool] = None,
        replica_count: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SearchServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param allowed_ips: -
        :param identity: identity block.
        :param partition_count: -
        :param public_network_access_enabled: -
        :param replica_count: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SearchServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allowed_ips is not None:
            self._values["allowed_ips"] = allowed_ips
        if identity is not None:
            self._values["identity"] = identity
        if partition_count is not None:
            self._values["partition_count"] = partition_count
        if public_network_access_enabled is not None:
            self._values["public_network_access_enabled"] = public_network_access_enabled
        if replica_count is not None:
            self._values["replica_count"] = replica_count
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def allowed_ips(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("allowed_ips")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["SearchServiceIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def partition_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("partition_count")
        return result

    @builtins.property
    def public_network_access_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("public_network_access_enabled")
        return result

    @builtins.property
    def replica_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("replica_count")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SearchServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SearchServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SearchServiceIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class SearchServiceIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SearchServiceIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SearchServiceQueryKeys(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SearchServiceQueryKeys",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(SearchServiceQueryKeys, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="key")
    def key(self) -> builtins.str:
        return jsii.get(self, "key")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")


@jsii.data_type(
    jsii_type="azurerm.SearchServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SearchServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SearchServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SecurityCenterAutoProvisioning(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SecurityCenterAutoProvisioning",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        auto_provision: builtins.str,
        timeouts: typing.Optional["SecurityCenterAutoProvisioningTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param auto_provision: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecurityCenterAutoProvisioningConfig(
            auto_provision=auto_provision,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SecurityCenterAutoProvisioning, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoProvisionInput")
    def auto_provision_input(self) -> builtins.str:
        return jsii.get(self, "autoProvisionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SecurityCenterAutoProvisioningTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoProvision")
    def auto_provision(self) -> builtins.str:
        return jsii.get(self, "autoProvision")

    @auto_provision.setter # type: ignore
    def auto_provision(self, value: builtins.str) -> None:
        jsii.set(self, "autoProvision", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SecurityCenterAutoProvisioningTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SecurityCenterAutoProvisioningTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutoProvisioningConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "auto_provision": "autoProvision",
        "timeouts": "timeouts",
    },
)
class SecurityCenterAutoProvisioningConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        auto_provision: builtins.str,
        timeouts: typing.Optional["SecurityCenterAutoProvisioningTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param auto_provision: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SecurityCenterAutoProvisioningTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "auto_provision": auto_provision,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def auto_provision(self) -> builtins.str:
        result = self._values.get("auto_provision")
        assert result is not None, "Required property 'auto_provision' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SecurityCenterAutoProvisioningTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutoProvisioningConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutoProvisioningTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SecurityCenterAutoProvisioningTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutoProvisioningTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SecurityCenterAutomation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SecurityCenterAutomation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        action: typing.List["SecurityCenterAutomationAction"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scopes: typing.List[builtins.str],
        source: typing.List["SecurityCenterAutomationSource"],
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SecurityCenterAutomationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param action: action block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scopes: -
        :param source: source block.
        :param description: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecurityCenterAutomationConfig(
            action=action,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            scopes=scopes,
            source=source,
            description=description,
            enabled=enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SecurityCenterAutomation, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> typing.List["SecurityCenterAutomationAction"]:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopesInput")
    def scopes_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceInput")
    def source_input(self) -> typing.List["SecurityCenterAutomationSource"]:
        return jsii.get(self, "sourceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SecurityCenterAutomationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> typing.List["SecurityCenterAutomationAction"]:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: typing.List["SecurityCenterAutomationAction"]) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopes")
    def scopes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "scopes")

    @scopes.setter # type: ignore
    def scopes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "scopes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="source")
    def source(self) -> typing.List["SecurityCenterAutomationSource"]:
        return jsii.get(self, "source")

    @source.setter # type: ignore
    def source(self, value: typing.List["SecurityCenterAutomationSource"]) -> None:
        jsii.set(self, "source", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SecurityCenterAutomationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SecurityCenterAutomationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutomationAction",
    jsii_struct_bases=[],
    name_mapping={
        "resource_id": "resourceId",
        "type": "type",
        "connection_string": "connectionString",
        "trigger_url": "triggerUrl",
    },
)
class SecurityCenterAutomationAction:
    def __init__(
        self,
        *,
        resource_id: builtins.str,
        type: builtins.str,
        connection_string: typing.Optional[builtins.str] = None,
        trigger_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param resource_id: -
        :param type: -
        :param connection_string: -
        :param trigger_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "resource_id": resource_id,
            "type": type,
        }
        if connection_string is not None:
            self._values["connection_string"] = connection_string
        if trigger_url is not None:
            self._values["trigger_url"] = trigger_url

    @builtins.property
    def resource_id(self) -> builtins.str:
        result = self._values.get("resource_id")
        assert result is not None, "Required property 'resource_id' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def connection_string(self) -> typing.Optional[builtins.str]:
        result = self._values.get("connection_string")
        return result

    @builtins.property
    def trigger_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("trigger_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutomationAction(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutomationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "action": "action",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "scopes": "scopes",
        "source": "source",
        "description": "description",
        "enabled": "enabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SecurityCenterAutomationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        action: typing.List[SecurityCenterAutomationAction],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        scopes: typing.List[builtins.str],
        source: typing.List["SecurityCenterAutomationSource"],
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SecurityCenterAutomationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action: action block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param scopes: -
        :param source: source block.
        :param description: -
        :param enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SecurityCenterAutomationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "scopes": scopes,
            "source": source,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def action(self) -> typing.List[SecurityCenterAutomationAction]:
        """action block."""
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def scopes(self) -> typing.List[builtins.str]:
        result = self._values.get("scopes")
        assert result is not None, "Required property 'scopes' is missing"
        return result

    @builtins.property
    def source(self) -> typing.List["SecurityCenterAutomationSource"]:
        """source block."""
        result = self._values.get("source")
        assert result is not None, "Required property 'source' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SecurityCenterAutomationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutomationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutomationSource",
    jsii_struct_bases=[],
    name_mapping={"event_source": "eventSource", "rule_set": "ruleSet"},
)
class SecurityCenterAutomationSource:
    def __init__(
        self,
        *,
        event_source: builtins.str,
        rule_set: typing.Optional[typing.List["SecurityCenterAutomationSourceRuleSet"]] = None,
    ) -> None:
        """
        :param event_source: -
        :param rule_set: rule_set block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "event_source": event_source,
        }
        if rule_set is not None:
            self._values["rule_set"] = rule_set

    @builtins.property
    def event_source(self) -> builtins.str:
        result = self._values.get("event_source")
        assert result is not None, "Required property 'event_source' is missing"
        return result

    @builtins.property
    def rule_set(
        self,
    ) -> typing.Optional[typing.List["SecurityCenterAutomationSourceRuleSet"]]:
        """rule_set block."""
        result = self._values.get("rule_set")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutomationSource(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutomationSourceRuleSet",
    jsii_struct_bases=[],
    name_mapping={"rule": "rule"},
)
class SecurityCenterAutomationSourceRuleSet:
    def __init__(
        self,
        *,
        rule: typing.List["SecurityCenterAutomationSourceRuleSetRule"],
    ) -> None:
        """
        :param rule: rule block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "rule": rule,
        }

    @builtins.property
    def rule(self) -> typing.List["SecurityCenterAutomationSourceRuleSetRule"]:
        """rule block."""
        result = self._values.get("rule")
        assert result is not None, "Required property 'rule' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutomationSourceRuleSet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutomationSourceRuleSetRule",
    jsii_struct_bases=[],
    name_mapping={
        "expected_value": "expectedValue",
        "operator": "operator",
        "property_path": "propertyPath",
        "property_type": "propertyType",
    },
)
class SecurityCenterAutomationSourceRuleSetRule:
    def __init__(
        self,
        *,
        expected_value: builtins.str,
        operator: builtins.str,
        property_path: builtins.str,
        property_type: builtins.str,
    ) -> None:
        """
        :param expected_value: -
        :param operator: -
        :param property_path: -
        :param property_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "expected_value": expected_value,
            "operator": operator,
            "property_path": property_path,
            "property_type": property_type,
        }

    @builtins.property
    def expected_value(self) -> builtins.str:
        result = self._values.get("expected_value")
        assert result is not None, "Required property 'expected_value' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def property_path(self) -> builtins.str:
        result = self._values.get("property_path")
        assert result is not None, "Required property 'property_path' is missing"
        return result

    @builtins.property
    def property_type(self) -> builtins.str:
        result = self._values.get("property_type")
        assert result is not None, "Required property 'property_type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutomationSourceRuleSetRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterAutomationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SecurityCenterAutomationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterAutomationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SecurityCenterContact(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SecurityCenterContact",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        alert_notifications: builtins.bool,
        alerts_to_admins: builtins.bool,
        email: builtins.str,
        phone: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["SecurityCenterContactTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param alert_notifications: -
        :param alerts_to_admins: -
        :param email: -
        :param phone: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecurityCenterContactConfig(
            alert_notifications=alert_notifications,
            alerts_to_admins=alerts_to_admins,
            email=email,
            phone=phone,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SecurityCenterContact, self, [scope, id, config])

    @jsii.member(jsii_name="resetPhone")
    def reset_phone(self) -> None:
        return jsii.invoke(self, "resetPhone", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alertNotificationsInput")
    def alert_notifications_input(self) -> builtins.bool:
        return jsii.get(self, "alertNotificationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alertsToAdminsInput")
    def alerts_to_admins_input(self) -> builtins.bool:
        return jsii.get(self, "alertsToAdminsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="emailInput")
    def email_input(self) -> builtins.str:
        return jsii.get(self, "emailInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="phoneInput")
    def phone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "phoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SecurityCenterContactTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alertNotifications")
    def alert_notifications(self) -> builtins.bool:
        return jsii.get(self, "alertNotifications")

    @alert_notifications.setter # type: ignore
    def alert_notifications(self, value: builtins.bool) -> None:
        jsii.set(self, "alertNotifications", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="alertsToAdmins")
    def alerts_to_admins(self) -> builtins.bool:
        return jsii.get(self, "alertsToAdmins")

    @alerts_to_admins.setter # type: ignore
    def alerts_to_admins(self, value: builtins.bool) -> None:
        jsii.set(self, "alertsToAdmins", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="email")
    def email(self) -> builtins.str:
        return jsii.get(self, "email")

    @email.setter # type: ignore
    def email(self, value: builtins.str) -> None:
        jsii.set(self, "email", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="phone")
    def phone(self) -> builtins.str:
        return jsii.get(self, "phone")

    @phone.setter # type: ignore
    def phone(self, value: builtins.str) -> None:
        jsii.set(self, "phone", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SecurityCenterContactTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SecurityCenterContactTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterContactConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "alert_notifications": "alertNotifications",
        "alerts_to_admins": "alertsToAdmins",
        "email": "email",
        "phone": "phone",
        "timeouts": "timeouts",
    },
)
class SecurityCenterContactConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        alert_notifications: builtins.bool,
        alerts_to_admins: builtins.bool,
        email: builtins.str,
        phone: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["SecurityCenterContactTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param alert_notifications: -
        :param alerts_to_admins: -
        :param email: -
        :param phone: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SecurityCenterContactTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "alert_notifications": alert_notifications,
            "alerts_to_admins": alerts_to_admins,
            "email": email,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if phone is not None:
            self._values["phone"] = phone
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def alert_notifications(self) -> builtins.bool:
        result = self._values.get("alert_notifications")
        assert result is not None, "Required property 'alert_notifications' is missing"
        return result

    @builtins.property
    def alerts_to_admins(self) -> builtins.bool:
        result = self._values.get("alerts_to_admins")
        assert result is not None, "Required property 'alerts_to_admins' is missing"
        return result

    @builtins.property
    def email(self) -> builtins.str:
        result = self._values.get("email")
        assert result is not None, "Required property 'email' is missing"
        return result

    @builtins.property
    def phone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("phone")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SecurityCenterContactTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterContactConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterContactTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SecurityCenterContactTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterContactTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SecurityCenterSetting(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SecurityCenterSetting",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        enabled: builtins.bool,
        setting_name: builtins.str,
        timeouts: typing.Optional["SecurityCenterSettingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param enabled: -
        :param setting_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecurityCenterSettingConfig(
            enabled=enabled,
            setting_name=setting_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SecurityCenterSetting, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> builtins.bool:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="settingNameInput")
    def setting_name_input(self) -> builtins.str:
        return jsii.get(self, "settingNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SecurityCenterSettingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="settingName")
    def setting_name(self) -> builtins.str:
        return jsii.get(self, "settingName")

    @setting_name.setter # type: ignore
    def setting_name(self, value: builtins.str) -> None:
        jsii.set(self, "settingName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SecurityCenterSettingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SecurityCenterSettingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterSettingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "enabled": "enabled",
        "setting_name": "settingName",
        "timeouts": "timeouts",
    },
)
class SecurityCenterSettingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        enabled: builtins.bool,
        setting_name: builtins.str,
        timeouts: typing.Optional["SecurityCenterSettingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param enabled: -
        :param setting_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SecurityCenterSettingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "setting_name": setting_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def setting_name(self) -> builtins.str:
        result = self._values.get("setting_name")
        assert result is not None, "Required property 'setting_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SecurityCenterSettingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterSettingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterSettingTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SecurityCenterSettingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterSettingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SecurityCenterSubscriptionPricing(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SecurityCenterSubscriptionPricing",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        tier: builtins.str,
        resource_type: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["SecurityCenterSubscriptionPricingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param tier: -
        :param resource_type: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecurityCenterSubscriptionPricingConfig(
            tier=tier,
            resource_type=resource_type,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SecurityCenterSubscriptionPricing, self, [scope, id, config])

    @jsii.member(jsii_name="resetResourceType")
    def reset_resource_type(self) -> None:
        return jsii.invoke(self, "resetResourceType", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tierInput")
    def tier_input(self) -> builtins.str:
        return jsii.get(self, "tierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceTypeInput")
    def resource_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "resourceTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SecurityCenterSubscriptionPricingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceType")
    def resource_type(self) -> builtins.str:
        return jsii.get(self, "resourceType")

    @resource_type.setter # type: ignore
    def resource_type(self, value: builtins.str) -> None:
        jsii.set(self, "resourceType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tier")
    def tier(self) -> builtins.str:
        return jsii.get(self, "tier")

    @tier.setter # type: ignore
    def tier(self, value: builtins.str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SecurityCenterSubscriptionPricingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SecurityCenterSubscriptionPricingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterSubscriptionPricingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "tier": "tier",
        "resource_type": "resourceType",
        "timeouts": "timeouts",
    },
)
class SecurityCenterSubscriptionPricingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        tier: builtins.str,
        resource_type: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["SecurityCenterSubscriptionPricingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param tier: -
        :param resource_type: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SecurityCenterSubscriptionPricingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "tier": tier,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if resource_type is not None:
            self._values["resource_type"] = resource_type
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def tier(self) -> builtins.str:
        result = self._values.get("tier")
        assert result is not None, "Required property 'tier' is missing"
        return result

    @builtins.property
    def resource_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("resource_type")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SecurityCenterSubscriptionPricingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterSubscriptionPricingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterSubscriptionPricingTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SecurityCenterSubscriptionPricingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterSubscriptionPricingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SecurityCenterWorkspace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SecurityCenterWorkspace",
):
    def __init__(
        self,
        scope_: constructs.Construct,
        id: builtins.str,
        *,
        scope: builtins.str,
        workspace_id: builtins.str,
        timeouts: typing.Optional["SecurityCenterWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope_: -
        :param id: -
        :param scope: -
        :param workspace_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecurityCenterWorkspaceConfig(
            scope=scope,
            workspace_id=workspace_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SecurityCenterWorkspace, self, [scope_, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scopeInput")
    def scope_input(self) -> builtins.str:
        return jsii.get(self, "scopeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceIdInput")
    def workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "workspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SecurityCenterWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scope")
    def scope(self) -> builtins.str:
        return jsii.get(self, "scope")

    @scope.setter # type: ignore
    def scope(self, value: builtins.str) -> None:
        jsii.set(self, "scope", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SecurityCenterWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SecurityCenterWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")

    @workspace_id.setter # type: ignore
    def workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceId", value)


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "scope": "scope",
        "workspace_id": "workspaceId",
        "timeouts": "timeouts",
    },
)
class SecurityCenterWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        scope: builtins.str,
        workspace_id: builtins.str,
        timeouts: typing.Optional["SecurityCenterWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param scope: -
        :param workspace_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SecurityCenterWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "scope": scope,
            "workspace_id": workspace_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def scope(self) -> builtins.str:
        result = self._values.get("scope")
        assert result is not None, "Required property 'scope' is missing"
        return result

    @builtins.property
    def workspace_id(self) -> builtins.str:
        result = self._values.get("workspace_id")
        assert result is not None, "Required property 'workspace_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SecurityCenterWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SecurityCenterWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SecurityCenterWorkspaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SecurityCenterWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SentinelAlertRuleMsSecurityIncident(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SentinelAlertRuleMsSecurityIncident",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: builtins.str,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        product_filter: builtins.str,
        severity_filter: typing.List[builtins.str],
        description: typing.Optional[builtins.str] = None,
        display_name_filter: typing.Optional[typing.List[builtins.str]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        text_whitelist: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["SentinelAlertRuleMsSecurityIncidentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param log_analytics_workspace_id: -
        :param name: -
        :param product_filter: -
        :param severity_filter: -
        :param description: -
        :param display_name_filter: -
        :param enabled: -
        :param text_whitelist: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SentinelAlertRuleMsSecurityIncidentConfig(
            display_name=display_name,
            log_analytics_workspace_id=log_analytics_workspace_id,
            name=name,
            product_filter=product_filter,
            severity_filter=severity_filter,
            description=description,
            display_name_filter=display_name_filter,
            enabled=enabled,
            text_whitelist=text_whitelist,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SentinelAlertRuleMsSecurityIncident, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetDisplayNameFilter")
    def reset_display_name_filter(self) -> None:
        return jsii.invoke(self, "resetDisplayNameFilter", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetTextWhitelist")
    def reset_text_whitelist(self) -> None:
        return jsii.invoke(self, "resetTextWhitelist", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceIdInput")
    def log_analytics_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productFilterInput")
    def product_filter_input(self) -> builtins.str:
        return jsii.get(self, "productFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severityFilterInput")
    def severity_filter_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "severityFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameFilterInput")
    def display_name_filter_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "displayNameFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="textWhitelistInput")
    def text_whitelist_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "textWhitelistInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SentinelAlertRuleMsSecurityIncidentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameFilter")
    def display_name_filter(self) -> typing.List[builtins.str]:
        return jsii.get(self, "displayNameFilter")

    @display_name_filter.setter # type: ignore
    def display_name_filter(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "displayNameFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceId")
    def log_analytics_workspace_id(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceId")

    @log_analytics_workspace_id.setter # type: ignore
    def log_analytics_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "logAnalyticsWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="productFilter")
    def product_filter(self) -> builtins.str:
        return jsii.get(self, "productFilter")

    @product_filter.setter # type: ignore
    def product_filter(self, value: builtins.str) -> None:
        jsii.set(self, "productFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severityFilter")
    def severity_filter(self) -> typing.List[builtins.str]:
        return jsii.get(self, "severityFilter")

    @severity_filter.setter # type: ignore
    def severity_filter(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "severityFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="textWhitelist")
    def text_whitelist(self) -> typing.List[builtins.str]:
        return jsii.get(self, "textWhitelist")

    @text_whitelist.setter # type: ignore
    def text_whitelist(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "textWhitelist", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SentinelAlertRuleMsSecurityIncidentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SentinelAlertRuleMsSecurityIncidentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SentinelAlertRuleMsSecurityIncidentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "name": "name",
        "product_filter": "productFilter",
        "severity_filter": "severityFilter",
        "description": "description",
        "display_name_filter": "displayNameFilter",
        "enabled": "enabled",
        "text_whitelist": "textWhitelist",
        "timeouts": "timeouts",
    },
)
class SentinelAlertRuleMsSecurityIncidentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: builtins.str,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        product_filter: builtins.str,
        severity_filter: typing.List[builtins.str],
        description: typing.Optional[builtins.str] = None,
        display_name_filter: typing.Optional[typing.List[builtins.str]] = None,
        enabled: typing.Optional[builtins.bool] = None,
        text_whitelist: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["SentinelAlertRuleMsSecurityIncidentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param log_analytics_workspace_id: -
        :param name: -
        :param product_filter: -
        :param severity_filter: -
        :param description: -
        :param display_name_filter: -
        :param enabled: -
        :param text_whitelist: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SentinelAlertRuleMsSecurityIncidentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "display_name": display_name,
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "name": name,
            "product_filter": product_filter,
            "severity_filter": severity_filter,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if display_name_filter is not None:
            self._values["display_name_filter"] = display_name_filter
        if enabled is not None:
            self._values["enabled"] = enabled
        if text_whitelist is not None:
            self._values["text_whitelist"] = text_whitelist
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product_filter(self) -> builtins.str:
        result = self._values.get("product_filter")
        assert result is not None, "Required property 'product_filter' is missing"
        return result

    @builtins.property
    def severity_filter(self) -> typing.List[builtins.str]:
        result = self._values.get("severity_filter")
        assert result is not None, "Required property 'severity_filter' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def display_name_filter(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("display_name_filter")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def text_whitelist(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("text_whitelist")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["SentinelAlertRuleMsSecurityIncidentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SentinelAlertRuleMsSecurityIncidentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SentinelAlertRuleMsSecurityIncidentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SentinelAlertRuleMsSecurityIncidentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SentinelAlertRuleMsSecurityIncidentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SentinelAlertRuleScheduled(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SentinelAlertRuleScheduled",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        display_name: builtins.str,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        query: builtins.str,
        severity: builtins.str,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        query_frequency: typing.Optional[builtins.str] = None,
        query_period: typing.Optional[builtins.str] = None,
        suppression_duration: typing.Optional[builtins.str] = None,
        suppression_enabled: typing.Optional[builtins.bool] = None,
        tactics: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["SentinelAlertRuleScheduledTimeouts"] = None,
        trigger_operator: typing.Optional[builtins.str] = None,
        trigger_threshold: typing.Optional[jsii.Number] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: -
        :param log_analytics_workspace_id: -
        :param name: -
        :param query: -
        :param severity: -
        :param description: -
        :param enabled: -
        :param query_frequency: -
        :param query_period: -
        :param suppression_duration: -
        :param suppression_enabled: -
        :param tactics: -
        :param timeouts: timeouts block.
        :param trigger_operator: -
        :param trigger_threshold: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SentinelAlertRuleScheduledConfig(
            display_name=display_name,
            log_analytics_workspace_id=log_analytics_workspace_id,
            name=name,
            query=query,
            severity=severity,
            description=description,
            enabled=enabled,
            query_frequency=query_frequency,
            query_period=query_period,
            suppression_duration=suppression_duration,
            suppression_enabled=suppression_enabled,
            tactics=tactics,
            timeouts=timeouts,
            trigger_operator=trigger_operator,
            trigger_threshold=trigger_threshold,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SentinelAlertRuleScheduled, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEnabled")
    def reset_enabled(self) -> None:
        return jsii.invoke(self, "resetEnabled", [])

    @jsii.member(jsii_name="resetQueryFrequency")
    def reset_query_frequency(self) -> None:
        return jsii.invoke(self, "resetQueryFrequency", [])

    @jsii.member(jsii_name="resetQueryPeriod")
    def reset_query_period(self) -> None:
        return jsii.invoke(self, "resetQueryPeriod", [])

    @jsii.member(jsii_name="resetSuppressionDuration")
    def reset_suppression_duration(self) -> None:
        return jsii.invoke(self, "resetSuppressionDuration", [])

    @jsii.member(jsii_name="resetSuppressionEnabled")
    def reset_suppression_enabled(self) -> None:
        return jsii.invoke(self, "resetSuppressionEnabled", [])

    @jsii.member(jsii_name="resetTactics")
    def reset_tactics(self) -> None:
        return jsii.invoke(self, "resetTactics", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTriggerOperator")
    def reset_trigger_operator(self) -> None:
        return jsii.invoke(self, "resetTriggerOperator", [])

    @jsii.member(jsii_name="resetTriggerThreshold")
    def reset_trigger_threshold(self) -> None:
        return jsii.invoke(self, "resetTriggerThreshold", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayNameInput")
    def display_name_input(self) -> builtins.str:
        return jsii.get(self, "displayNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceIdInput")
    def log_analytics_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryInput")
    def query_input(self) -> builtins.str:
        return jsii.get(self, "queryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severityInput")
    def severity_input(self) -> builtins.str:
        return jsii.get(self, "severityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabledInput")
    def enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryFrequencyInput")
    def query_frequency_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "queryFrequencyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryPeriodInput")
    def query_period_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "queryPeriodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="suppressionDurationInput")
    def suppression_duration_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "suppressionDurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="suppressionEnabledInput")
    def suppression_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "suppressionEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tacticsInput")
    def tactics_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "tacticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SentinelAlertRuleScheduledTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="triggerOperatorInput")
    def trigger_operator_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "triggerOperatorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="triggerThresholdInput")
    def trigger_threshold_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "triggerThresholdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> builtins.str:
        return jsii.get(self, "displayName")

    @display_name.setter # type: ignore
    def display_name(self, value: builtins.str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> builtins.bool:
        return jsii.get(self, "enabled")

    @enabled.setter # type: ignore
    def enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="logAnalyticsWorkspaceId")
    def log_analytics_workspace_id(self) -> builtins.str:
        return jsii.get(self, "logAnalyticsWorkspaceId")

    @log_analytics_workspace_id.setter # type: ignore
    def log_analytics_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "logAnalyticsWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="query")
    def query(self) -> builtins.str:
        return jsii.get(self, "query")

    @query.setter # type: ignore
    def query(self, value: builtins.str) -> None:
        jsii.set(self, "query", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryFrequency")
    def query_frequency(self) -> builtins.str:
        return jsii.get(self, "queryFrequency")

    @query_frequency.setter # type: ignore
    def query_frequency(self, value: builtins.str) -> None:
        jsii.set(self, "queryFrequency", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queryPeriod")
    def query_period(self) -> builtins.str:
        return jsii.get(self, "queryPeriod")

    @query_period.setter # type: ignore
    def query_period(self, value: builtins.str) -> None:
        jsii.set(self, "queryPeriod", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="severity")
    def severity(self) -> builtins.str:
        return jsii.get(self, "severity")

    @severity.setter # type: ignore
    def severity(self, value: builtins.str) -> None:
        jsii.set(self, "severity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="suppressionDuration")
    def suppression_duration(self) -> builtins.str:
        return jsii.get(self, "suppressionDuration")

    @suppression_duration.setter # type: ignore
    def suppression_duration(self, value: builtins.str) -> None:
        jsii.set(self, "suppressionDuration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="suppressionEnabled")
    def suppression_enabled(self) -> builtins.bool:
        return jsii.get(self, "suppressionEnabled")

    @suppression_enabled.setter # type: ignore
    def suppression_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "suppressionEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tactics")
    def tactics(self) -> typing.List[builtins.str]:
        return jsii.get(self, "tactics")

    @tactics.setter # type: ignore
    def tactics(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "tactics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SentinelAlertRuleScheduledTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SentinelAlertRuleScheduledTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="triggerOperator")
    def trigger_operator(self) -> builtins.str:
        return jsii.get(self, "triggerOperator")

    @trigger_operator.setter # type: ignore
    def trigger_operator(self, value: builtins.str) -> None:
        jsii.set(self, "triggerOperator", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="triggerThreshold")
    def trigger_threshold(self) -> jsii.Number:
        return jsii.get(self, "triggerThreshold")

    @trigger_threshold.setter # type: ignore
    def trigger_threshold(self, value: jsii.Number) -> None:
        jsii.set(self, "triggerThreshold", value)


@jsii.data_type(
    jsii_type="azurerm.SentinelAlertRuleScheduledConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "display_name": "displayName",
        "log_analytics_workspace_id": "logAnalyticsWorkspaceId",
        "name": "name",
        "query": "query",
        "severity": "severity",
        "description": "description",
        "enabled": "enabled",
        "query_frequency": "queryFrequency",
        "query_period": "queryPeriod",
        "suppression_duration": "suppressionDuration",
        "suppression_enabled": "suppressionEnabled",
        "tactics": "tactics",
        "timeouts": "timeouts",
        "trigger_operator": "triggerOperator",
        "trigger_threshold": "triggerThreshold",
    },
)
class SentinelAlertRuleScheduledConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        display_name: builtins.str,
        log_analytics_workspace_id: builtins.str,
        name: builtins.str,
        query: builtins.str,
        severity: builtins.str,
        description: typing.Optional[builtins.str] = None,
        enabled: typing.Optional[builtins.bool] = None,
        query_frequency: typing.Optional[builtins.str] = None,
        query_period: typing.Optional[builtins.str] = None,
        suppression_duration: typing.Optional[builtins.str] = None,
        suppression_enabled: typing.Optional[builtins.bool] = None,
        tactics: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["SentinelAlertRuleScheduledTimeouts"] = None,
        trigger_operator: typing.Optional[builtins.str] = None,
        trigger_threshold: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: -
        :param log_analytics_workspace_id: -
        :param name: -
        :param query: -
        :param severity: -
        :param description: -
        :param enabled: -
        :param query_frequency: -
        :param query_period: -
        :param suppression_duration: -
        :param suppression_enabled: -
        :param tactics: -
        :param timeouts: timeouts block.
        :param trigger_operator: -
        :param trigger_threshold: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SentinelAlertRuleScheduledTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "display_name": display_name,
            "log_analytics_workspace_id": log_analytics_workspace_id,
            "name": name,
            "query": query,
            "severity": severity,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if enabled is not None:
            self._values["enabled"] = enabled
        if query_frequency is not None:
            self._values["query_frequency"] = query_frequency
        if query_period is not None:
            self._values["query_period"] = query_period
        if suppression_duration is not None:
            self._values["suppression_duration"] = suppression_duration
        if suppression_enabled is not None:
            self._values["suppression_enabled"] = suppression_enabled
        if tactics is not None:
            self._values["tactics"] = tactics
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if trigger_operator is not None:
            self._values["trigger_operator"] = trigger_operator
        if trigger_threshold is not None:
            self._values["trigger_threshold"] = trigger_threshold

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def display_name(self) -> builtins.str:
        result = self._values.get("display_name")
        assert result is not None, "Required property 'display_name' is missing"
        return result

    @builtins.property
    def log_analytics_workspace_id(self) -> builtins.str:
        result = self._values.get("log_analytics_workspace_id")
        assert result is not None, "Required property 'log_analytics_workspace_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def query(self) -> builtins.str:
        result = self._values.get("query")
        assert result is not None, "Required property 'query' is missing"
        return result

    @builtins.property
    def severity(self) -> builtins.str:
        result = self._values.get("severity")
        assert result is not None, "Required property 'severity' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def query_frequency(self) -> typing.Optional[builtins.str]:
        result = self._values.get("query_frequency")
        return result

    @builtins.property
    def query_period(self) -> typing.Optional[builtins.str]:
        result = self._values.get("query_period")
        return result

    @builtins.property
    def suppression_duration(self) -> typing.Optional[builtins.str]:
        result = self._values.get("suppression_duration")
        return result

    @builtins.property
    def suppression_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("suppression_enabled")
        return result

    @builtins.property
    def tactics(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("tactics")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SentinelAlertRuleScheduledTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def trigger_operator(self) -> typing.Optional[builtins.str]:
        result = self._values.get("trigger_operator")
        return result

    @builtins.property
    def trigger_threshold(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("trigger_threshold")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SentinelAlertRuleScheduledConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SentinelAlertRuleScheduledTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SentinelAlertRuleScheduledTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SentinelAlertRuleScheduledTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServiceFabricCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServiceFabricCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        management_endpoint: builtins.str,
        name: builtins.str,
        node_type: typing.List["ServiceFabricClusterNodeType"],
        reliability_level: builtins.str,
        resource_group_name: builtins.str,
        upgrade_mode: builtins.str,
        vm_image: builtins.str,
        add_on_features: typing.Optional[typing.List[builtins.str]] = None,
        azure_active_directory: typing.Optional[typing.List["ServiceFabricClusterAzureActiveDirectory"]] = None,
        certificate: typing.Optional[typing.List["ServiceFabricClusterCertificate"]] = None,
        certificate_common_names: typing.Optional[typing.List["ServiceFabricClusterCertificateCommonNames"]] = None,
        client_certificate_common_name: typing.Optional[typing.List["ServiceFabricClusterClientCertificateCommonName"]] = None,
        client_certificate_thumbprint: typing.Optional[typing.List["ServiceFabricClusterClientCertificateThumbprint"]] = None,
        cluster_code_version: typing.Optional[builtins.str] = None,
        diagnostics_config: typing.Optional[typing.List["ServiceFabricClusterDiagnosticsConfig"]] = None,
        fabric_settings: typing.Optional[typing.List["ServiceFabricClusterFabricSettings"]] = None,
        reverse_proxy_certificate: typing.Optional[typing.List["ServiceFabricClusterReverseProxyCertificate"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param management_endpoint: -
        :param name: -
        :param node_type: node_type block.
        :param reliability_level: -
        :param resource_group_name: -
        :param upgrade_mode: -
        :param vm_image: -
        :param add_on_features: -
        :param azure_active_directory: azure_active_directory block.
        :param certificate: certificate block.
        :param certificate_common_names: certificate_common_names block.
        :param client_certificate_common_name: client_certificate_common_name block.
        :param client_certificate_thumbprint: client_certificate_thumbprint block.
        :param cluster_code_version: -
        :param diagnostics_config: diagnostics_config block.
        :param fabric_settings: fabric_settings block.
        :param reverse_proxy_certificate: reverse_proxy_certificate block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceFabricClusterConfig(
            location=location,
            management_endpoint=management_endpoint,
            name=name,
            node_type=node_type,
            reliability_level=reliability_level,
            resource_group_name=resource_group_name,
            upgrade_mode=upgrade_mode,
            vm_image=vm_image,
            add_on_features=add_on_features,
            azure_active_directory=azure_active_directory,
            certificate=certificate,
            certificate_common_names=certificate_common_names,
            client_certificate_common_name=client_certificate_common_name,
            client_certificate_thumbprint=client_certificate_thumbprint,
            cluster_code_version=cluster_code_version,
            diagnostics_config=diagnostics_config,
            fabric_settings=fabric_settings,
            reverse_proxy_certificate=reverse_proxy_certificate,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServiceFabricCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetAddOnFeatures")
    def reset_add_on_features(self) -> None:
        return jsii.invoke(self, "resetAddOnFeatures", [])

    @jsii.member(jsii_name="resetAzureActiveDirectory")
    def reset_azure_active_directory(self) -> None:
        return jsii.invoke(self, "resetAzureActiveDirectory", [])

    @jsii.member(jsii_name="resetCertificate")
    def reset_certificate(self) -> None:
        return jsii.invoke(self, "resetCertificate", [])

    @jsii.member(jsii_name="resetCertificateCommonNames")
    def reset_certificate_common_names(self) -> None:
        return jsii.invoke(self, "resetCertificateCommonNames", [])

    @jsii.member(jsii_name="resetClientCertificateCommonName")
    def reset_client_certificate_common_name(self) -> None:
        return jsii.invoke(self, "resetClientCertificateCommonName", [])

    @jsii.member(jsii_name="resetClientCertificateThumbprint")
    def reset_client_certificate_thumbprint(self) -> None:
        return jsii.invoke(self, "resetClientCertificateThumbprint", [])

    @jsii.member(jsii_name="resetClusterCodeVersion")
    def reset_cluster_code_version(self) -> None:
        return jsii.invoke(self, "resetClusterCodeVersion", [])

    @jsii.member(jsii_name="resetDiagnosticsConfig")
    def reset_diagnostics_config(self) -> None:
        return jsii.invoke(self, "resetDiagnosticsConfig", [])

    @jsii.member(jsii_name="resetFabricSettings")
    def reset_fabric_settings(self) -> None:
        return jsii.invoke(self, "resetFabricSettings", [])

    @jsii.member(jsii_name="resetReverseProxyCertificate")
    def reset_reverse_proxy_certificate(self) -> None:
        return jsii.invoke(self, "resetReverseProxyCertificate", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterEndpoint")
    def cluster_endpoint(self) -> builtins.str:
        return jsii.get(self, "clusterEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementEndpointInput")
    def management_endpoint_input(self) -> builtins.str:
        return jsii.get(self, "managementEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeTypeInput")
    def node_type_input(self) -> typing.List["ServiceFabricClusterNodeType"]:
        return jsii.get(self, "nodeTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reliabilityLevelInput")
    def reliability_level_input(self) -> builtins.str:
        return jsii.get(self, "reliabilityLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradeModeInput")
    def upgrade_mode_input(self) -> builtins.str:
        return jsii.get(self, "upgradeModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmImageInput")
    def vm_image_input(self) -> builtins.str:
        return jsii.get(self, "vmImageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addOnFeaturesInput")
    def add_on_features_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "addOnFeaturesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureActiveDirectoryInput")
    def azure_active_directory_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterAzureActiveDirectory"]]:
        return jsii.get(self, "azureActiveDirectoryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateCommonNamesInput")
    def certificate_common_names_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterCertificateCommonNames"]]:
        return jsii.get(self, "certificateCommonNamesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateInput")
    def certificate_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterCertificate"]]:
        return jsii.get(self, "certificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificateCommonNameInput")
    def client_certificate_common_name_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterClientCertificateCommonName"]]:
        return jsii.get(self, "clientCertificateCommonNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificateThumbprintInput")
    def client_certificate_thumbprint_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterClientCertificateThumbprint"]]:
        return jsii.get(self, "clientCertificateThumbprintInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterCodeVersionInput")
    def cluster_code_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "clusterCodeVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diagnosticsConfigInput")
    def diagnostics_config_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterDiagnosticsConfig"]]:
        return jsii.get(self, "diagnosticsConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fabricSettingsInput")
    def fabric_settings_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterFabricSettings"]]:
        return jsii.get(self, "fabricSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reverseProxyCertificateInput")
    def reverse_proxy_certificate_input(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterReverseProxyCertificate"]]:
        return jsii.get(self, "reverseProxyCertificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServiceFabricClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addOnFeatures")
    def add_on_features(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addOnFeatures")

    @add_on_features.setter # type: ignore
    def add_on_features(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "addOnFeatures", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureActiveDirectory")
    def azure_active_directory(
        self,
    ) -> typing.List["ServiceFabricClusterAzureActiveDirectory"]:
        return jsii.get(self, "azureActiveDirectory")

    @azure_active_directory.setter # type: ignore
    def azure_active_directory(
        self,
        value: typing.List["ServiceFabricClusterAzureActiveDirectory"],
    ) -> None:
        jsii.set(self, "azureActiveDirectory", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> typing.List["ServiceFabricClusterCertificate"]:
        return jsii.get(self, "certificate")

    @certificate.setter # type: ignore
    def certificate(
        self,
        value: typing.List["ServiceFabricClusterCertificate"],
    ) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="certificateCommonNames")
    def certificate_common_names(
        self,
    ) -> typing.List["ServiceFabricClusterCertificateCommonNames"]:
        return jsii.get(self, "certificateCommonNames")

    @certificate_common_names.setter # type: ignore
    def certificate_common_names(
        self,
        value: typing.List["ServiceFabricClusterCertificateCommonNames"],
    ) -> None:
        jsii.set(self, "certificateCommonNames", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificateCommonName")
    def client_certificate_common_name(
        self,
    ) -> typing.List["ServiceFabricClusterClientCertificateCommonName"]:
        return jsii.get(self, "clientCertificateCommonName")

    @client_certificate_common_name.setter # type: ignore
    def client_certificate_common_name(
        self,
        value: typing.List["ServiceFabricClusterClientCertificateCommonName"],
    ) -> None:
        jsii.set(self, "clientCertificateCommonName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientCertificateThumbprint")
    def client_certificate_thumbprint(
        self,
    ) -> typing.List["ServiceFabricClusterClientCertificateThumbprint"]:
        return jsii.get(self, "clientCertificateThumbprint")

    @client_certificate_thumbprint.setter # type: ignore
    def client_certificate_thumbprint(
        self,
        value: typing.List["ServiceFabricClusterClientCertificateThumbprint"],
    ) -> None:
        jsii.set(self, "clientCertificateThumbprint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clusterCodeVersion")
    def cluster_code_version(self) -> builtins.str:
        return jsii.get(self, "clusterCodeVersion")

    @cluster_code_version.setter # type: ignore
    def cluster_code_version(self, value: builtins.str) -> None:
        jsii.set(self, "clusterCodeVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diagnosticsConfig")
    def diagnostics_config(
        self,
    ) -> typing.List["ServiceFabricClusterDiagnosticsConfig"]:
        return jsii.get(self, "diagnosticsConfig")

    @diagnostics_config.setter # type: ignore
    def diagnostics_config(
        self,
        value: typing.List["ServiceFabricClusterDiagnosticsConfig"],
    ) -> None:
        jsii.set(self, "diagnosticsConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fabricSettings")
    def fabric_settings(self) -> typing.List["ServiceFabricClusterFabricSettings"]:
        return jsii.get(self, "fabricSettings")

    @fabric_settings.setter # type: ignore
    def fabric_settings(
        self,
        value: typing.List["ServiceFabricClusterFabricSettings"],
    ) -> None:
        jsii.set(self, "fabricSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managementEndpoint")
    def management_endpoint(self) -> builtins.str:
        return jsii.get(self, "managementEndpoint")

    @management_endpoint.setter # type: ignore
    def management_endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "managementEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeType")
    def node_type(self) -> typing.List["ServiceFabricClusterNodeType"]:
        return jsii.get(self, "nodeType")

    @node_type.setter # type: ignore
    def node_type(self, value: typing.List["ServiceFabricClusterNodeType"]) -> None:
        jsii.set(self, "nodeType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reliabilityLevel")
    def reliability_level(self) -> builtins.str:
        return jsii.get(self, "reliabilityLevel")

    @reliability_level.setter # type: ignore
    def reliability_level(self, value: builtins.str) -> None:
        jsii.set(self, "reliabilityLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="reverseProxyCertificate")
    def reverse_proxy_certificate(
        self,
    ) -> typing.List["ServiceFabricClusterReverseProxyCertificate"]:
        return jsii.get(self, "reverseProxyCertificate")

    @reverse_proxy_certificate.setter # type: ignore
    def reverse_proxy_certificate(
        self,
        value: typing.List["ServiceFabricClusterReverseProxyCertificate"],
    ) -> None:
        jsii.set(self, "reverseProxyCertificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServiceFabricClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServiceFabricClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradeMode")
    def upgrade_mode(self) -> builtins.str:
        return jsii.get(self, "upgradeMode")

    @upgrade_mode.setter # type: ignore
    def upgrade_mode(self, value: builtins.str) -> None:
        jsii.set(self, "upgradeMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmImage")
    def vm_image(self) -> builtins.str:
        return jsii.get(self, "vmImage")

    @vm_image.setter # type: ignore
    def vm_image(self, value: builtins.str) -> None:
        jsii.set(self, "vmImage", value)


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterAzureActiveDirectory",
    jsii_struct_bases=[],
    name_mapping={
        "client_application_id": "clientApplicationId",
        "cluster_application_id": "clusterApplicationId",
        "tenant_id": "tenantId",
    },
)
class ServiceFabricClusterAzureActiveDirectory:
    def __init__(
        self,
        *,
        client_application_id: builtins.str,
        cluster_application_id: builtins.str,
        tenant_id: builtins.str,
    ) -> None:
        """
        :param client_application_id: -
        :param cluster_application_id: -
        :param tenant_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_application_id": client_application_id,
            "cluster_application_id": cluster_application_id,
            "tenant_id": tenant_id,
        }

    @builtins.property
    def client_application_id(self) -> builtins.str:
        result = self._values.get("client_application_id")
        assert result is not None, "Required property 'client_application_id' is missing"
        return result

    @builtins.property
    def cluster_application_id(self) -> builtins.str:
        result = self._values.get("cluster_application_id")
        assert result is not None, "Required property 'cluster_application_id' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterAzureActiveDirectory(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterCertificate",
    jsii_struct_bases=[],
    name_mapping={
        "thumbprint": "thumbprint",
        "x509_store_name": "x509StoreName",
        "thumbprint_secondary": "thumbprintSecondary",
    },
)
class ServiceFabricClusterCertificate:
    def __init__(
        self,
        *,
        thumbprint: builtins.str,
        x509_store_name: builtins.str,
        thumbprint_secondary: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param thumbprint: -
        :param x509_store_name: -
        :param thumbprint_secondary: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "thumbprint": thumbprint,
            "x509_store_name": x509_store_name,
        }
        if thumbprint_secondary is not None:
            self._values["thumbprint_secondary"] = thumbprint_secondary

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    @builtins.property
    def x509_store_name(self) -> builtins.str:
        result = self._values.get("x509_store_name")
        assert result is not None, "Required property 'x509_store_name' is missing"
        return result

    @builtins.property
    def thumbprint_secondary(self) -> typing.Optional[builtins.str]:
        result = self._values.get("thumbprint_secondary")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterCertificateCommonNames",
    jsii_struct_bases=[],
    name_mapping={"common_names": "commonNames", "x509_store_name": "x509StoreName"},
)
class ServiceFabricClusterCertificateCommonNames:
    def __init__(
        self,
        *,
        common_names: typing.List["ServiceFabricClusterCertificateCommonNamesCommonNames"],
        x509_store_name: builtins.str,
    ) -> None:
        """
        :param common_names: common_names block.
        :param x509_store_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "common_names": common_names,
            "x509_store_name": x509_store_name,
        }

    @builtins.property
    def common_names(
        self,
    ) -> typing.List["ServiceFabricClusterCertificateCommonNamesCommonNames"]:
        """common_names block."""
        result = self._values.get("common_names")
        assert result is not None, "Required property 'common_names' is missing"
        return result

    @builtins.property
    def x509_store_name(self) -> builtins.str:
        result = self._values.get("x509_store_name")
        assert result is not None, "Required property 'x509_store_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterCertificateCommonNames(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterCertificateCommonNamesCommonNames",
    jsii_struct_bases=[],
    name_mapping={
        "certificate_common_name": "certificateCommonName",
        "certificate_issuer_thumbprint": "certificateIssuerThumbprint",
    },
)
class ServiceFabricClusterCertificateCommonNamesCommonNames:
    def __init__(
        self,
        *,
        certificate_common_name: builtins.str,
        certificate_issuer_thumbprint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param certificate_common_name: -
        :param certificate_issuer_thumbprint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate_common_name": certificate_common_name,
        }
        if certificate_issuer_thumbprint is not None:
            self._values["certificate_issuer_thumbprint"] = certificate_issuer_thumbprint

    @builtins.property
    def certificate_common_name(self) -> builtins.str:
        result = self._values.get("certificate_common_name")
        assert result is not None, "Required property 'certificate_common_name' is missing"
        return result

    @builtins.property
    def certificate_issuer_thumbprint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_issuer_thumbprint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterCertificateCommonNamesCommonNames(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterClientCertificateCommonName",
    jsii_struct_bases=[],
    name_mapping={
        "common_name": "commonName",
        "is_admin": "isAdmin",
        "issuer_thumbprint": "issuerThumbprint",
    },
)
class ServiceFabricClusterClientCertificateCommonName:
    def __init__(
        self,
        *,
        common_name: builtins.str,
        is_admin: builtins.bool,
        issuer_thumbprint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param common_name: -
        :param is_admin: -
        :param issuer_thumbprint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "common_name": common_name,
            "is_admin": is_admin,
        }
        if issuer_thumbprint is not None:
            self._values["issuer_thumbprint"] = issuer_thumbprint

    @builtins.property
    def common_name(self) -> builtins.str:
        result = self._values.get("common_name")
        assert result is not None, "Required property 'common_name' is missing"
        return result

    @builtins.property
    def is_admin(self) -> builtins.bool:
        result = self._values.get("is_admin")
        assert result is not None, "Required property 'is_admin' is missing"
        return result

    @builtins.property
    def issuer_thumbprint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("issuer_thumbprint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterClientCertificateCommonName(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterClientCertificateThumbprint",
    jsii_struct_bases=[],
    name_mapping={"is_admin": "isAdmin", "thumbprint": "thumbprint"},
)
class ServiceFabricClusterClientCertificateThumbprint:
    def __init__(self, *, is_admin: builtins.bool, thumbprint: builtins.str) -> None:
        """
        :param is_admin: -
        :param thumbprint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "is_admin": is_admin,
            "thumbprint": thumbprint,
        }

    @builtins.property
    def is_admin(self) -> builtins.bool:
        result = self._values.get("is_admin")
        assert result is not None, "Required property 'is_admin' is missing"
        return result

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterClientCertificateThumbprint(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "management_endpoint": "managementEndpoint",
        "name": "name",
        "node_type": "nodeType",
        "reliability_level": "reliabilityLevel",
        "resource_group_name": "resourceGroupName",
        "upgrade_mode": "upgradeMode",
        "vm_image": "vmImage",
        "add_on_features": "addOnFeatures",
        "azure_active_directory": "azureActiveDirectory",
        "certificate": "certificate",
        "certificate_common_names": "certificateCommonNames",
        "client_certificate_common_name": "clientCertificateCommonName",
        "client_certificate_thumbprint": "clientCertificateThumbprint",
        "cluster_code_version": "clusterCodeVersion",
        "diagnostics_config": "diagnosticsConfig",
        "fabric_settings": "fabricSettings",
        "reverse_proxy_certificate": "reverseProxyCertificate",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ServiceFabricClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        management_endpoint: builtins.str,
        name: builtins.str,
        node_type: typing.List["ServiceFabricClusterNodeType"],
        reliability_level: builtins.str,
        resource_group_name: builtins.str,
        upgrade_mode: builtins.str,
        vm_image: builtins.str,
        add_on_features: typing.Optional[typing.List[builtins.str]] = None,
        azure_active_directory: typing.Optional[typing.List[ServiceFabricClusterAzureActiveDirectory]] = None,
        certificate: typing.Optional[typing.List[ServiceFabricClusterCertificate]] = None,
        certificate_common_names: typing.Optional[typing.List[ServiceFabricClusterCertificateCommonNames]] = None,
        client_certificate_common_name: typing.Optional[typing.List[ServiceFabricClusterClientCertificateCommonName]] = None,
        client_certificate_thumbprint: typing.Optional[typing.List[ServiceFabricClusterClientCertificateThumbprint]] = None,
        cluster_code_version: typing.Optional[builtins.str] = None,
        diagnostics_config: typing.Optional[typing.List["ServiceFabricClusterDiagnosticsConfig"]] = None,
        fabric_settings: typing.Optional[typing.List["ServiceFabricClusterFabricSettings"]] = None,
        reverse_proxy_certificate: typing.Optional[typing.List["ServiceFabricClusterReverseProxyCertificate"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param management_endpoint: -
        :param name: -
        :param node_type: node_type block.
        :param reliability_level: -
        :param resource_group_name: -
        :param upgrade_mode: -
        :param vm_image: -
        :param add_on_features: -
        :param azure_active_directory: azure_active_directory block.
        :param certificate: certificate block.
        :param certificate_common_names: certificate_common_names block.
        :param client_certificate_common_name: client_certificate_common_name block.
        :param client_certificate_thumbprint: client_certificate_thumbprint block.
        :param cluster_code_version: -
        :param diagnostics_config: diagnostics_config block.
        :param fabric_settings: fabric_settings block.
        :param reverse_proxy_certificate: reverse_proxy_certificate block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServiceFabricClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "management_endpoint": management_endpoint,
            "name": name,
            "node_type": node_type,
            "reliability_level": reliability_level,
            "resource_group_name": resource_group_name,
            "upgrade_mode": upgrade_mode,
            "vm_image": vm_image,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if add_on_features is not None:
            self._values["add_on_features"] = add_on_features
        if azure_active_directory is not None:
            self._values["azure_active_directory"] = azure_active_directory
        if certificate is not None:
            self._values["certificate"] = certificate
        if certificate_common_names is not None:
            self._values["certificate_common_names"] = certificate_common_names
        if client_certificate_common_name is not None:
            self._values["client_certificate_common_name"] = client_certificate_common_name
        if client_certificate_thumbprint is not None:
            self._values["client_certificate_thumbprint"] = client_certificate_thumbprint
        if cluster_code_version is not None:
            self._values["cluster_code_version"] = cluster_code_version
        if diagnostics_config is not None:
            self._values["diagnostics_config"] = diagnostics_config
        if fabric_settings is not None:
            self._values["fabric_settings"] = fabric_settings
        if reverse_proxy_certificate is not None:
            self._values["reverse_proxy_certificate"] = reverse_proxy_certificate
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def management_endpoint(self) -> builtins.str:
        result = self._values.get("management_endpoint")
        assert result is not None, "Required property 'management_endpoint' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def node_type(self) -> typing.List["ServiceFabricClusterNodeType"]:
        """node_type block."""
        result = self._values.get("node_type")
        assert result is not None, "Required property 'node_type' is missing"
        return result

    @builtins.property
    def reliability_level(self) -> builtins.str:
        result = self._values.get("reliability_level")
        assert result is not None, "Required property 'reliability_level' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def upgrade_mode(self) -> builtins.str:
        result = self._values.get("upgrade_mode")
        assert result is not None, "Required property 'upgrade_mode' is missing"
        return result

    @builtins.property
    def vm_image(self) -> builtins.str:
        result = self._values.get("vm_image")
        assert result is not None, "Required property 'vm_image' is missing"
        return result

    @builtins.property
    def add_on_features(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("add_on_features")
        return result

    @builtins.property
    def azure_active_directory(
        self,
    ) -> typing.Optional[typing.List[ServiceFabricClusterAzureActiveDirectory]]:
        """azure_active_directory block."""
        result = self._values.get("azure_active_directory")
        return result

    @builtins.property
    def certificate(
        self,
    ) -> typing.Optional[typing.List[ServiceFabricClusterCertificate]]:
        """certificate block."""
        result = self._values.get("certificate")
        return result

    @builtins.property
    def certificate_common_names(
        self,
    ) -> typing.Optional[typing.List[ServiceFabricClusterCertificateCommonNames]]:
        """certificate_common_names block."""
        result = self._values.get("certificate_common_names")
        return result

    @builtins.property
    def client_certificate_common_name(
        self,
    ) -> typing.Optional[typing.List[ServiceFabricClusterClientCertificateCommonName]]:
        """client_certificate_common_name block."""
        result = self._values.get("client_certificate_common_name")
        return result

    @builtins.property
    def client_certificate_thumbprint(
        self,
    ) -> typing.Optional[typing.List[ServiceFabricClusterClientCertificateThumbprint]]:
        """client_certificate_thumbprint block."""
        result = self._values.get("client_certificate_thumbprint")
        return result

    @builtins.property
    def cluster_code_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("cluster_code_version")
        return result

    @builtins.property
    def diagnostics_config(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterDiagnosticsConfig"]]:
        """diagnostics_config block."""
        result = self._values.get("diagnostics_config")
        return result

    @builtins.property
    def fabric_settings(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterFabricSettings"]]:
        """fabric_settings block."""
        result = self._values.get("fabric_settings")
        return result

    @builtins.property
    def reverse_proxy_certificate(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterReverseProxyCertificate"]]:
        """reverse_proxy_certificate block."""
        result = self._values.get("reverse_proxy_certificate")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServiceFabricClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterDiagnosticsConfig",
    jsii_struct_bases=[],
    name_mapping={
        "blob_endpoint": "blobEndpoint",
        "protected_account_key_name": "protectedAccountKeyName",
        "queue_endpoint": "queueEndpoint",
        "storage_account_name": "storageAccountName",
        "table_endpoint": "tableEndpoint",
    },
)
class ServiceFabricClusterDiagnosticsConfig:
    def __init__(
        self,
        *,
        blob_endpoint: builtins.str,
        protected_account_key_name: builtins.str,
        queue_endpoint: builtins.str,
        storage_account_name: builtins.str,
        table_endpoint: builtins.str,
    ) -> None:
        """
        :param blob_endpoint: -
        :param protected_account_key_name: -
        :param queue_endpoint: -
        :param storage_account_name: -
        :param table_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "blob_endpoint": blob_endpoint,
            "protected_account_key_name": protected_account_key_name,
            "queue_endpoint": queue_endpoint,
            "storage_account_name": storage_account_name,
            "table_endpoint": table_endpoint,
        }

    @builtins.property
    def blob_endpoint(self) -> builtins.str:
        result = self._values.get("blob_endpoint")
        assert result is not None, "Required property 'blob_endpoint' is missing"
        return result

    @builtins.property
    def protected_account_key_name(self) -> builtins.str:
        result = self._values.get("protected_account_key_name")
        assert result is not None, "Required property 'protected_account_key_name' is missing"
        return result

    @builtins.property
    def queue_endpoint(self) -> builtins.str:
        result = self._values.get("queue_endpoint")
        assert result is not None, "Required property 'queue_endpoint' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def table_endpoint(self) -> builtins.str:
        result = self._values.get("table_endpoint")
        assert result is not None, "Required property 'table_endpoint' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterDiagnosticsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterFabricSettings",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "parameters": "parameters"},
)
class ServiceFabricClusterFabricSettings:
    def __init__(
        self,
        *,
        name: builtins.str,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param parameters: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if parameters is not None:
            self._values["parameters"] = parameters

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterFabricSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterNodeType",
    jsii_struct_bases=[],
    name_mapping={
        "client_endpoint_port": "clientEndpointPort",
        "http_endpoint_port": "httpEndpointPort",
        "instance_count": "instanceCount",
        "is_primary": "isPrimary",
        "name": "name",
        "application_ports": "applicationPorts",
        "capacities": "capacities",
        "durability_level": "durabilityLevel",
        "ephemeral_ports": "ephemeralPorts",
        "placement_properties": "placementProperties",
        "reverse_proxy_endpoint_port": "reverseProxyEndpointPort",
    },
)
class ServiceFabricClusterNodeType:
    def __init__(
        self,
        *,
        client_endpoint_port: jsii.Number,
        http_endpoint_port: jsii.Number,
        instance_count: jsii.Number,
        is_primary: builtins.bool,
        name: builtins.str,
        application_ports: typing.Optional[typing.List["ServiceFabricClusterNodeTypeApplicationPorts"]] = None,
        capacities: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        durability_level: typing.Optional[builtins.str] = None,
        ephemeral_ports: typing.Optional[typing.List["ServiceFabricClusterNodeTypeEphemeralPorts"]] = None,
        placement_properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        reverse_proxy_endpoint_port: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param client_endpoint_port: -
        :param http_endpoint_port: -
        :param instance_count: -
        :param is_primary: -
        :param name: -
        :param application_ports: application_ports block.
        :param capacities: -
        :param durability_level: -
        :param ephemeral_ports: ephemeral_ports block.
        :param placement_properties: -
        :param reverse_proxy_endpoint_port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "client_endpoint_port": client_endpoint_port,
            "http_endpoint_port": http_endpoint_port,
            "instance_count": instance_count,
            "is_primary": is_primary,
            "name": name,
        }
        if application_ports is not None:
            self._values["application_ports"] = application_ports
        if capacities is not None:
            self._values["capacities"] = capacities
        if durability_level is not None:
            self._values["durability_level"] = durability_level
        if ephemeral_ports is not None:
            self._values["ephemeral_ports"] = ephemeral_ports
        if placement_properties is not None:
            self._values["placement_properties"] = placement_properties
        if reverse_proxy_endpoint_port is not None:
            self._values["reverse_proxy_endpoint_port"] = reverse_proxy_endpoint_port

    @builtins.property
    def client_endpoint_port(self) -> jsii.Number:
        result = self._values.get("client_endpoint_port")
        assert result is not None, "Required property 'client_endpoint_port' is missing"
        return result

    @builtins.property
    def http_endpoint_port(self) -> jsii.Number:
        result = self._values.get("http_endpoint_port")
        assert result is not None, "Required property 'http_endpoint_port' is missing"
        return result

    @builtins.property
    def instance_count(self) -> jsii.Number:
        result = self._values.get("instance_count")
        assert result is not None, "Required property 'instance_count' is missing"
        return result

    @builtins.property
    def is_primary(self) -> builtins.bool:
        result = self._values.get("is_primary")
        assert result is not None, "Required property 'is_primary' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def application_ports(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterNodeTypeApplicationPorts"]]:
        """application_ports block."""
        result = self._values.get("application_ports")
        return result

    @builtins.property
    def capacities(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("capacities")
        return result

    @builtins.property
    def durability_level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("durability_level")
        return result

    @builtins.property
    def ephemeral_ports(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricClusterNodeTypeEphemeralPorts"]]:
        """ephemeral_ports block."""
        result = self._values.get("ephemeral_ports")
        return result

    @builtins.property
    def placement_properties(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("placement_properties")
        return result

    @builtins.property
    def reverse_proxy_endpoint_port(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("reverse_proxy_endpoint_port")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterNodeType(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterNodeTypeApplicationPorts",
    jsii_struct_bases=[],
    name_mapping={"end_port": "endPort", "start_port": "startPort"},
)
class ServiceFabricClusterNodeTypeApplicationPorts:
    def __init__(self, *, end_port: jsii.Number, start_port: jsii.Number) -> None:
        """
        :param end_port: -
        :param start_port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "end_port": end_port,
            "start_port": start_port,
        }

    @builtins.property
    def end_port(self) -> jsii.Number:
        result = self._values.get("end_port")
        assert result is not None, "Required property 'end_port' is missing"
        return result

    @builtins.property
    def start_port(self) -> jsii.Number:
        result = self._values.get("start_port")
        assert result is not None, "Required property 'start_port' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterNodeTypeApplicationPorts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterNodeTypeEphemeralPorts",
    jsii_struct_bases=[],
    name_mapping={"end_port": "endPort", "start_port": "startPort"},
)
class ServiceFabricClusterNodeTypeEphemeralPorts:
    def __init__(self, *, end_port: jsii.Number, start_port: jsii.Number) -> None:
        """
        :param end_port: -
        :param start_port: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "end_port": end_port,
            "start_port": start_port,
        }

    @builtins.property
    def end_port(self) -> jsii.Number:
        result = self._values.get("end_port")
        assert result is not None, "Required property 'end_port' is missing"
        return result

    @builtins.property
    def start_port(self) -> jsii.Number:
        result = self._values.get("start_port")
        assert result is not None, "Required property 'start_port' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterNodeTypeEphemeralPorts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterReverseProxyCertificate",
    jsii_struct_bases=[],
    name_mapping={
        "thumbprint": "thumbprint",
        "x509_store_name": "x509StoreName",
        "thumbprint_secondary": "thumbprintSecondary",
    },
)
class ServiceFabricClusterReverseProxyCertificate:
    def __init__(
        self,
        *,
        thumbprint: builtins.str,
        x509_store_name: builtins.str,
        thumbprint_secondary: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param thumbprint: -
        :param x509_store_name: -
        :param thumbprint_secondary: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "thumbprint": thumbprint,
            "x509_store_name": x509_store_name,
        }
        if thumbprint_secondary is not None:
            self._values["thumbprint_secondary"] = thumbprint_secondary

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    @builtins.property
    def x509_store_name(self) -> builtins.str:
        result = self._values.get("x509_store_name")
        assert result is not None, "Required property 'x509_store_name' is missing"
        return result

    @builtins.property
    def thumbprint_secondary(self) -> typing.Optional[builtins.str]:
        result = self._values.get("thumbprint_secondary")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterReverseProxyCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServiceFabricClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServiceFabricMeshApplication(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServiceFabricMeshApplication",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service: typing.List["ServiceFabricMeshApplicationService"],
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshApplicationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service: service block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceFabricMeshApplicationConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            service=service,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServiceFabricMeshApplication, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceInput")
    def service_input(self) -> typing.List["ServiceFabricMeshApplicationService"]:
        return jsii.get(self, "serviceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServiceFabricMeshApplicationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="service")
    def service(self) -> typing.List["ServiceFabricMeshApplicationService"]:
        return jsii.get(self, "service")

    @service.setter # type: ignore
    def service(
        self,
        value: typing.List["ServiceFabricMeshApplicationService"],
    ) -> None:
        jsii.set(self, "service", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServiceFabricMeshApplicationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServiceFabricMeshApplicationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshApplicationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "service": "service",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ServiceFabricMeshApplicationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service: typing.List["ServiceFabricMeshApplicationService"],
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshApplicationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param service: service block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServiceFabricMeshApplicationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "service": service,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service(self) -> typing.List["ServiceFabricMeshApplicationService"]:
        """service block."""
        result = self._values.get("service")
        assert result is not None, "Required property 'service' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServiceFabricMeshApplicationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshApplicationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshApplicationService",
    jsii_struct_bases=[],
    name_mapping={"code_package": "codePackage", "name": "name", "os_type": "osType"},
)
class ServiceFabricMeshApplicationService:
    def __init__(
        self,
        *,
        code_package: typing.List["ServiceFabricMeshApplicationServiceCodePackage"],
        name: builtins.str,
        os_type: builtins.str,
    ) -> None:
        """
        :param code_package: code_package block.
        :param name: -
        :param os_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "code_package": code_package,
            "name": name,
            "os_type": os_type,
        }

    @builtins.property
    def code_package(
        self,
    ) -> typing.List["ServiceFabricMeshApplicationServiceCodePackage"]:
        """code_package block."""
        result = self._values.get("code_package")
        assert result is not None, "Required property 'code_package' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def os_type(self) -> builtins.str:
        result = self._values.get("os_type")
        assert result is not None, "Required property 'os_type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshApplicationService(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshApplicationServiceCodePackage",
    jsii_struct_bases=[],
    name_mapping={"image_name": "imageName", "name": "name", "resources": "resources"},
)
class ServiceFabricMeshApplicationServiceCodePackage:
    def __init__(
        self,
        *,
        image_name: builtins.str,
        name: builtins.str,
        resources: typing.List["ServiceFabricMeshApplicationServiceCodePackageResources"],
    ) -> None:
        """
        :param image_name: -
        :param name: -
        :param resources: resources block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "image_name": image_name,
            "name": name,
            "resources": resources,
        }

    @builtins.property
    def image_name(self) -> builtins.str:
        result = self._values.get("image_name")
        assert result is not None, "Required property 'image_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resources(
        self,
    ) -> typing.List["ServiceFabricMeshApplicationServiceCodePackageResources"]:
        """resources block."""
        result = self._values.get("resources")
        assert result is not None, "Required property 'resources' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshApplicationServiceCodePackage(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshApplicationServiceCodePackageResources",
    jsii_struct_bases=[],
    name_mapping={"requests": "requests", "limits": "limits"},
)
class ServiceFabricMeshApplicationServiceCodePackageResources:
    def __init__(
        self,
        *,
        requests: typing.List["ServiceFabricMeshApplicationServiceCodePackageResourcesRequests"],
        limits: typing.Optional[typing.List["ServiceFabricMeshApplicationServiceCodePackageResourcesLimits"]] = None,
    ) -> None:
        """
        :param requests: requests block.
        :param limits: limits block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "requests": requests,
        }
        if limits is not None:
            self._values["limits"] = limits

    @builtins.property
    def requests(
        self,
    ) -> typing.List["ServiceFabricMeshApplicationServiceCodePackageResourcesRequests"]:
        """requests block."""
        result = self._values.get("requests")
        assert result is not None, "Required property 'requests' is missing"
        return result

    @builtins.property
    def limits(
        self,
    ) -> typing.Optional[typing.List["ServiceFabricMeshApplicationServiceCodePackageResourcesLimits"]]:
        """limits block."""
        result = self._values.get("limits")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshApplicationServiceCodePackageResources(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshApplicationServiceCodePackageResourcesLimits",
    jsii_struct_bases=[],
    name_mapping={"cpu": "cpu", "memory": "memory"},
)
class ServiceFabricMeshApplicationServiceCodePackageResourcesLimits:
    def __init__(self, *, cpu: jsii.Number, memory: jsii.Number) -> None:
        """
        :param cpu: -
        :param memory: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "cpu": cpu,
            "memory": memory,
        }

    @builtins.property
    def cpu(self) -> jsii.Number:
        result = self._values.get("cpu")
        assert result is not None, "Required property 'cpu' is missing"
        return result

    @builtins.property
    def memory(self) -> jsii.Number:
        result = self._values.get("memory")
        assert result is not None, "Required property 'memory' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshApplicationServiceCodePackageResourcesLimits(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshApplicationServiceCodePackageResourcesRequests",
    jsii_struct_bases=[],
    name_mapping={"cpu": "cpu", "memory": "memory"},
)
class ServiceFabricMeshApplicationServiceCodePackageResourcesRequests:
    def __init__(self, *, cpu: jsii.Number, memory: jsii.Number) -> None:
        """
        :param cpu: -
        :param memory: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "cpu": cpu,
            "memory": memory,
        }

    @builtins.property
    def cpu(self) -> jsii.Number:
        result = self._values.get("cpu")
        assert result is not None, "Required property 'cpu' is missing"
        return result

    @builtins.property
    def memory(self) -> jsii.Number:
        result = self._values.get("memory")
        assert result is not None, "Required property 'memory' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshApplicationServiceCodePackageResourcesRequests(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshApplicationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServiceFabricMeshApplicationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshApplicationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServiceFabricMeshLocalNetwork(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServiceFabricMeshLocalNetwork",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        network_address_prefix: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshLocalNetworkTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param network_address_prefix: -
        :param resource_group_name: -
        :param description: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceFabricMeshLocalNetworkConfig(
            location=location,
            name=name,
            network_address_prefix=network_address_prefix,
            resource_group_name=resource_group_name,
            description=description,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServiceFabricMeshLocalNetwork, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkAddressPrefixInput")
    def network_address_prefix_input(self) -> builtins.str:
        return jsii.get(self, "networkAddressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ServiceFabricMeshLocalNetworkTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkAddressPrefix")
    def network_address_prefix(self) -> builtins.str:
        return jsii.get(self, "networkAddressPrefix")

    @network_address_prefix.setter # type: ignore
    def network_address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "networkAddressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServiceFabricMeshLocalNetworkTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServiceFabricMeshLocalNetworkTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshLocalNetworkConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "network_address_prefix": "networkAddressPrefix",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ServiceFabricMeshLocalNetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        network_address_prefix: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshLocalNetworkTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param network_address_prefix: -
        :param resource_group_name: -
        :param description: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServiceFabricMeshLocalNetworkTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "network_address_prefix": network_address_prefix,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_address_prefix(self) -> builtins.str:
        result = self._values.get("network_address_prefix")
        assert result is not None, "Required property 'network_address_prefix' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServiceFabricMeshLocalNetworkTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshLocalNetworkConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshLocalNetworkTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServiceFabricMeshLocalNetworkTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshLocalNetworkTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServiceFabricMeshSecret(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServiceFabricMeshSecret",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        content_type: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshSecretTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param content_type: -
        :param description: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceFabricMeshSecretConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            content_type=content_type,
            description=description,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServiceFabricMeshSecret, self, [scope, id, config])

    @jsii.member(jsii_name="resetContentType")
    def reset_content_type(self) -> None:
        return jsii.invoke(self, "resetContentType", [])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypeInput")
    def content_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServiceFabricMeshSecretTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")

    @content_type.setter # type: ignore
    def content_type(self, value: builtins.str) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServiceFabricMeshSecretTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServiceFabricMeshSecretTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshSecretConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "content_type": "contentType",
        "description": "description",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ServiceFabricMeshSecretConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        content_type: typing.Optional[builtins.str] = None,
        description: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshSecretTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param content_type: -
        :param description: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServiceFabricMeshSecretTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if content_type is not None:
            self._values["content_type"] = content_type
        if description is not None:
            self._values["description"] = description
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def content_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_type")
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServiceFabricMeshSecretTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshSecretConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshSecretTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServiceFabricMeshSecretTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshSecretTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServiceFabricMeshSecretValue(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServiceFabricMeshSecretValue",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        service_fabric_mesh_secret_id: builtins.str,
        value: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshSecretValueTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param service_fabric_mesh_secret_id: -
        :param value: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceFabricMeshSecretValueConfig(
            location=location,
            name=name,
            service_fabric_mesh_secret_id=service_fabric_mesh_secret_id,
            value=value,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServiceFabricMeshSecretValue, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceFabricMeshSecretIdInput")
    def service_fabric_mesh_secret_id_input(self) -> builtins.str:
        return jsii.get(self, "serviceFabricMeshSecretIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="valueInput")
    def value_input(self) -> builtins.str:
        return jsii.get(self, "valueInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServiceFabricMeshSecretValueTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceFabricMeshSecretId")
    def service_fabric_mesh_secret_id(self) -> builtins.str:
        return jsii.get(self, "serviceFabricMeshSecretId")

    @service_fabric_mesh_secret_id.setter # type: ignore
    def service_fabric_mesh_secret_id(self, value: builtins.str) -> None:
        jsii.set(self, "serviceFabricMeshSecretId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServiceFabricMeshSecretValueTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServiceFabricMeshSecretValueTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="value")
    def value(self) -> builtins.str:
        return jsii.get(self, "value")

    @value.setter # type: ignore
    def value(self, value: builtins.str) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshSecretValueConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "service_fabric_mesh_secret_id": "serviceFabricMeshSecretId",
        "value": "value",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class ServiceFabricMeshSecretValueConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        service_fabric_mesh_secret_id: builtins.str,
        value: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServiceFabricMeshSecretValueTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param service_fabric_mesh_secret_id: -
        :param value: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServiceFabricMeshSecretValueTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "service_fabric_mesh_secret_id": service_fabric_mesh_secret_id,
            "value": value,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def service_fabric_mesh_secret_id(self) -> builtins.str:
        result = self._values.get("service_fabric_mesh_secret_id")
        assert result is not None, "Required property 'service_fabric_mesh_secret_id' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServiceFabricMeshSecretValueTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshSecretValueConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServiceFabricMeshSecretValueTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServiceFabricMeshSecretValueTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServiceFabricMeshSecretValueTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServicebusNamespace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusNamespace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        capacity: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServicebusNamespaceTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param capacity: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_redundant: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusNamespaceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            capacity=capacity,
            tags=tags,
            timeouts=timeouts,
            zone_redundant=zone_redundant,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusNamespace, self, [scope, id, config])

    @jsii.member(jsii_name="resetCapacity")
    def reset_capacity(self) -> None:
        return jsii.invoke(self, "resetCapacity", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZoneRedundant")
    def reset_zone_redundant(self) -> None:
        return jsii.invoke(self, "resetZoneRedundant", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryConnectionString")
    def default_primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultPrimaryKey")
    def default_primary_key(self) -> builtins.str:
        return jsii.get(self, "defaultPrimaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryConnectionString")
    def default_secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryKey")
    def default_secondary_key(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacityInput")
    def capacity_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "capacityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServicebusNamespaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundantInput")
    def zone_redundant_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneRedundantInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="capacity")
    def capacity(self) -> jsii.Number:
        return jsii.get(self, "capacity")

    @capacity.setter # type: ignore
    def capacity(self, value: jsii.Number) -> None:
        jsii.set(self, "capacity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusNamespaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusNamespaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @zone_redundant.setter # type: ignore
    def zone_redundant(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneRedundant", value)


class ServicebusNamespaceAuthorizationRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusNamespaceAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusNamespaceAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusNamespaceAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            listen=listen,
            manage=manage,
            send=send,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusNamespaceAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetListen")
    def reset_listen(self) -> None:
        return jsii.invoke(self, "resetListen", [])

    @jsii.member(jsii_name="resetManage")
    def reset_manage(self) -> None:
        return jsii.invoke(self, "resetManage", [])

    @jsii.member(jsii_name="resetSend")
    def reset_send(self) -> None:
        return jsii.invoke(self, "resetSend", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listenInput")
    def listen_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "listenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manageInput")
    def manage_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "manageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendInput")
    def send_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sendInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ServicebusNamespaceAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @listen.setter # type: ignore
    def listen(self, value: builtins.bool) -> None:
        jsii.set(self, "listen", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @manage.setter # type: ignore
    def manage(self, value: builtins.bool) -> None:
        jsii.set(self, "manage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @send.setter # type: ignore
    def send(self, value: builtins.bool) -> None:
        jsii.set(self, "send", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusNamespaceAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusNamespaceAuthorizationRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ServicebusNamespaceAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "listen": "listen",
        "manage": "manage",
        "send": "send",
        "timeouts": "timeouts",
    },
)
class ServicebusNamespaceAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusNamespaceAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusNamespaceAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if listen is not None:
            self._values["listen"] = listen
        if manage is not None:
            self._values["manage"] = manage
        if send is not None:
            self._values["send"] = send
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def listen(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("listen")
        return result

    @builtins.property
    def manage(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manage")
        return result

    @builtins.property
    def send(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send")
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["ServicebusNamespaceAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusNamespaceAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusNamespaceAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusNamespaceAuthorizationRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusNamespaceAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusNamespaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "capacity": "capacity",
        "tags": "tags",
        "timeouts": "timeouts",
        "zone_redundant": "zoneRedundant",
    },
)
class ServicebusNamespaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        capacity: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["ServicebusNamespaceTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param capacity: -
        :param tags: -
        :param timeouts: timeouts block.
        :param zone_redundant: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusNamespaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if capacity is not None:
            self._values["capacity"] = capacity
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zone_redundant is not None:
            self._values["zone_redundant"] = zone_redundant

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def capacity(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("capacity")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusNamespaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zone_redundant(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_redundant")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusNamespaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServicebusNamespaceNetworkRuleSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusNamespaceNetworkRuleSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        default_action: typing.Optional[builtins.str] = None,
        ip_rules: typing.Optional[typing.List[builtins.str]] = None,
        network_rules: typing.Optional[typing.List["ServicebusNamespaceNetworkRuleSetNetworkRules"]] = None,
        timeouts: typing.Optional["ServicebusNamespaceNetworkRuleSetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param namespace_name: -
        :param resource_group_name: -
        :param default_action: -
        :param ip_rules: -
        :param network_rules: network_rules block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusNamespaceNetworkRuleSetConfig(
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            default_action=default_action,
            ip_rules=ip_rules,
            network_rules=network_rules,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusNamespaceNetworkRuleSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetDefaultAction")
    def reset_default_action(self) -> None:
        return jsii.invoke(self, "resetDefaultAction", [])

    @jsii.member(jsii_name="resetIpRules")
    def reset_ip_rules(self) -> None:
        return jsii.invoke(self, "resetIpRules", [])

    @jsii.member(jsii_name="resetNetworkRules")
    def reset_network_rules(self) -> None:
        return jsii.invoke(self, "resetNetworkRules", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultActionInput")
    def default_action_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultActionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRulesInput")
    def ip_rules_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "ipRulesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRulesInput")
    def network_rules_input(
        self,
    ) -> typing.Optional[typing.List["ServicebusNamespaceNetworkRuleSetNetworkRules"]]:
        return jsii.get(self, "networkRulesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ServicebusNamespaceNetworkRuleSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultAction")
    def default_action(self) -> builtins.str:
        return jsii.get(self, "defaultAction")

    @default_action.setter # type: ignore
    def default_action(self, value: builtins.str) -> None:
        jsii.set(self, "defaultAction", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRules")
    def ip_rules(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ipRules")

    @ip_rules.setter # type: ignore
    def ip_rules(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "ipRules", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRules")
    def network_rules(
        self,
    ) -> typing.List["ServicebusNamespaceNetworkRuleSetNetworkRules"]:
        return jsii.get(self, "networkRules")

    @network_rules.setter # type: ignore
    def network_rules(
        self,
        value: typing.List["ServicebusNamespaceNetworkRuleSetNetworkRules"],
    ) -> None:
        jsii.set(self, "networkRules", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusNamespaceNetworkRuleSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusNamespaceNetworkRuleSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ServicebusNamespaceNetworkRuleSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "default_action": "defaultAction",
        "ip_rules": "ipRules",
        "network_rules": "networkRules",
        "timeouts": "timeouts",
    },
)
class ServicebusNamespaceNetworkRuleSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        default_action: typing.Optional[builtins.str] = None,
        ip_rules: typing.Optional[typing.List[builtins.str]] = None,
        network_rules: typing.Optional[typing.List["ServicebusNamespaceNetworkRuleSetNetworkRules"]] = None,
        timeouts: typing.Optional["ServicebusNamespaceNetworkRuleSetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param namespace_name: -
        :param resource_group_name: -
        :param default_action: -
        :param ip_rules: -
        :param network_rules: network_rules block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusNamespaceNetworkRuleSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if default_action is not None:
            self._values["default_action"] = default_action
        if ip_rules is not None:
            self._values["ip_rules"] = ip_rules
        if network_rules is not None:
            self._values["network_rules"] = network_rules
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def default_action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_action")
        return result

    @builtins.property
    def ip_rules(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ip_rules")
        return result

    @builtins.property
    def network_rules(
        self,
    ) -> typing.Optional[typing.List["ServicebusNamespaceNetworkRuleSetNetworkRules"]]:
        """network_rules block."""
        result = self._values.get("network_rules")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusNamespaceNetworkRuleSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusNamespaceNetworkRuleSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusNamespaceNetworkRuleSetNetworkRules",
    jsii_struct_bases=[],
    name_mapping={
        "subnet_id": "subnetId",
        "ignore_missing_vnet_service_endpoint": "ignoreMissingVnetServiceEndpoint",
    },
)
class ServicebusNamespaceNetworkRuleSetNetworkRules:
    def __init__(
        self,
        *,
        subnet_id: builtins.str,
        ignore_missing_vnet_service_endpoint: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param subnet_id: -
        :param ignore_missing_vnet_service_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "subnet_id": subnet_id,
        }
        if ignore_missing_vnet_service_endpoint is not None:
            self._values["ignore_missing_vnet_service_endpoint"] = ignore_missing_vnet_service_endpoint

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def ignore_missing_vnet_service_endpoint(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ignore_missing_vnet_service_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusNamespaceNetworkRuleSetNetworkRules(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusNamespaceNetworkRuleSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusNamespaceNetworkRuleSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusNamespaceNetworkRuleSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusNamespaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusNamespaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusNamespaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServicebusQueue(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusQueue",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        auto_delete_on_idle: typing.Optional[builtins.str] = None,
        dead_lettering_on_message_expiration: typing.Optional[builtins.bool] = None,
        default_message_ttl: typing.Optional[builtins.str] = None,
        duplicate_detection_history_time_window: typing.Optional[builtins.str] = None,
        enable_batched_operations: typing.Optional[builtins.bool] = None,
        enable_express: typing.Optional[builtins.bool] = None,
        enable_partitioning: typing.Optional[builtins.bool] = None,
        forward_dead_lettered_messages_to: typing.Optional[builtins.str] = None,
        forward_to: typing.Optional[builtins.str] = None,
        lock_duration: typing.Optional[builtins.str] = None,
        max_delivery_count: typing.Optional[jsii.Number] = None,
        max_size_in_megabytes: typing.Optional[jsii.Number] = None,
        requires_duplicate_detection: typing.Optional[builtins.bool] = None,
        requires_session: typing.Optional[builtins.bool] = None,
        status: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ServicebusQueueTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param auto_delete_on_idle: -
        :param dead_lettering_on_message_expiration: -
        :param default_message_ttl: -
        :param duplicate_detection_history_time_window: -
        :param enable_batched_operations: -
        :param enable_express: -
        :param enable_partitioning: -
        :param forward_dead_lettered_messages_to: -
        :param forward_to: -
        :param lock_duration: -
        :param max_delivery_count: -
        :param max_size_in_megabytes: -
        :param requires_duplicate_detection: -
        :param requires_session: -
        :param status: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusQueueConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            auto_delete_on_idle=auto_delete_on_idle,
            dead_lettering_on_message_expiration=dead_lettering_on_message_expiration,
            default_message_ttl=default_message_ttl,
            duplicate_detection_history_time_window=duplicate_detection_history_time_window,
            enable_batched_operations=enable_batched_operations,
            enable_express=enable_express,
            enable_partitioning=enable_partitioning,
            forward_dead_lettered_messages_to=forward_dead_lettered_messages_to,
            forward_to=forward_to,
            lock_duration=lock_duration,
            max_delivery_count=max_delivery_count,
            max_size_in_megabytes=max_size_in_megabytes,
            requires_duplicate_detection=requires_duplicate_detection,
            requires_session=requires_session,
            status=status,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusQueue, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoDeleteOnIdle")
    def reset_auto_delete_on_idle(self) -> None:
        return jsii.invoke(self, "resetAutoDeleteOnIdle", [])

    @jsii.member(jsii_name="resetDeadLetteringOnMessageExpiration")
    def reset_dead_lettering_on_message_expiration(self) -> None:
        return jsii.invoke(self, "resetDeadLetteringOnMessageExpiration", [])

    @jsii.member(jsii_name="resetDefaultMessageTtl")
    def reset_default_message_ttl(self) -> None:
        return jsii.invoke(self, "resetDefaultMessageTtl", [])

    @jsii.member(jsii_name="resetDuplicateDetectionHistoryTimeWindow")
    def reset_duplicate_detection_history_time_window(self) -> None:
        return jsii.invoke(self, "resetDuplicateDetectionHistoryTimeWindow", [])

    @jsii.member(jsii_name="resetEnableBatchedOperations")
    def reset_enable_batched_operations(self) -> None:
        return jsii.invoke(self, "resetEnableBatchedOperations", [])

    @jsii.member(jsii_name="resetEnableExpress")
    def reset_enable_express(self) -> None:
        return jsii.invoke(self, "resetEnableExpress", [])

    @jsii.member(jsii_name="resetEnablePartitioning")
    def reset_enable_partitioning(self) -> None:
        return jsii.invoke(self, "resetEnablePartitioning", [])

    @jsii.member(jsii_name="resetForwardDeadLetteredMessagesTo")
    def reset_forward_dead_lettered_messages_to(self) -> None:
        return jsii.invoke(self, "resetForwardDeadLetteredMessagesTo", [])

    @jsii.member(jsii_name="resetForwardTo")
    def reset_forward_to(self) -> None:
        return jsii.invoke(self, "resetForwardTo", [])

    @jsii.member(jsii_name="resetLockDuration")
    def reset_lock_duration(self) -> None:
        return jsii.invoke(self, "resetLockDuration", [])

    @jsii.member(jsii_name="resetMaxDeliveryCount")
    def reset_max_delivery_count(self) -> None:
        return jsii.invoke(self, "resetMaxDeliveryCount", [])

    @jsii.member(jsii_name="resetMaxSizeInMegabytes")
    def reset_max_size_in_megabytes(self) -> None:
        return jsii.invoke(self, "resetMaxSizeInMegabytes", [])

    @jsii.member(jsii_name="resetRequiresDuplicateDetection")
    def reset_requires_duplicate_detection(self) -> None:
        return jsii.invoke(self, "resetRequiresDuplicateDetection", [])

    @jsii.member(jsii_name="resetRequiresSession")
    def reset_requires_session(self) -> None:
        return jsii.invoke(self, "resetRequiresSession", [])

    @jsii.member(jsii_name="resetStatus")
    def reset_status(self) -> None:
        return jsii.invoke(self, "resetStatus", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoDeleteOnIdleInput")
    def auto_delete_on_idle_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "autoDeleteOnIdleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnMessageExpirationInput")
    def dead_lettering_on_message_expiration_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "deadLetteringOnMessageExpirationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultMessageTtlInput")
    def default_message_ttl_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultMessageTtlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="duplicateDetectionHistoryTimeWindowInput")
    def duplicate_detection_history_time_window_input(
        self,
    ) -> typing.Optional[builtins.str]:
        return jsii.get(self, "duplicateDetectionHistoryTimeWindowInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBatchedOperationsInput")
    def enable_batched_operations_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableBatchedOperationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableExpressInput")
    def enable_express_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableExpressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePartitioningInput")
    def enable_partitioning_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enablePartitioningInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardDeadLetteredMessagesToInput")
    def forward_dead_lettered_messages_to_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "forwardDeadLetteredMessagesToInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardToInput")
    def forward_to_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "forwardToInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockDurationInput")
    def lock_duration_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "lockDurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxDeliveryCountInput")
    def max_delivery_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxDeliveryCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeInMegabytesInput")
    def max_size_in_megabytes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxSizeInMegabytesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresDuplicateDetectionInput")
    def requires_duplicate_detection_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "requiresDuplicateDetectionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresSessionInput")
    def requires_session_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "requiresSessionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="statusInput")
    def status_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "statusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServicebusQueueTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoDeleteOnIdle")
    def auto_delete_on_idle(self) -> builtins.str:
        return jsii.get(self, "autoDeleteOnIdle")

    @auto_delete_on_idle.setter # type: ignore
    def auto_delete_on_idle(self, value: builtins.str) -> None:
        jsii.set(self, "autoDeleteOnIdle", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnMessageExpiration")
    def dead_lettering_on_message_expiration(self) -> builtins.bool:
        return jsii.get(self, "deadLetteringOnMessageExpiration")

    @dead_lettering_on_message_expiration.setter # type: ignore
    def dead_lettering_on_message_expiration(self, value: builtins.bool) -> None:
        jsii.set(self, "deadLetteringOnMessageExpiration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultMessageTtl")
    def default_message_ttl(self) -> builtins.str:
        return jsii.get(self, "defaultMessageTtl")

    @default_message_ttl.setter # type: ignore
    def default_message_ttl(self, value: builtins.str) -> None:
        jsii.set(self, "defaultMessageTtl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="duplicateDetectionHistoryTimeWindow")
    def duplicate_detection_history_time_window(self) -> builtins.str:
        return jsii.get(self, "duplicateDetectionHistoryTimeWindow")

    @duplicate_detection_history_time_window.setter # type: ignore
    def duplicate_detection_history_time_window(self, value: builtins.str) -> None:
        jsii.set(self, "duplicateDetectionHistoryTimeWindow", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBatchedOperations")
    def enable_batched_operations(self) -> builtins.bool:
        return jsii.get(self, "enableBatchedOperations")

    @enable_batched_operations.setter # type: ignore
    def enable_batched_operations(self, value: builtins.bool) -> None:
        jsii.set(self, "enableBatchedOperations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableExpress")
    def enable_express(self) -> builtins.bool:
        return jsii.get(self, "enableExpress")

    @enable_express.setter # type: ignore
    def enable_express(self, value: builtins.bool) -> None:
        jsii.set(self, "enableExpress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePartitioning")
    def enable_partitioning(self) -> builtins.bool:
        return jsii.get(self, "enablePartitioning")

    @enable_partitioning.setter # type: ignore
    def enable_partitioning(self, value: builtins.bool) -> None:
        jsii.set(self, "enablePartitioning", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardDeadLetteredMessagesTo")
    def forward_dead_lettered_messages_to(self) -> builtins.str:
        return jsii.get(self, "forwardDeadLetteredMessagesTo")

    @forward_dead_lettered_messages_to.setter # type: ignore
    def forward_dead_lettered_messages_to(self, value: builtins.str) -> None:
        jsii.set(self, "forwardDeadLetteredMessagesTo", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardTo")
    def forward_to(self) -> builtins.str:
        return jsii.get(self, "forwardTo")

    @forward_to.setter # type: ignore
    def forward_to(self, value: builtins.str) -> None:
        jsii.set(self, "forwardTo", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockDuration")
    def lock_duration(self) -> builtins.str:
        return jsii.get(self, "lockDuration")

    @lock_duration.setter # type: ignore
    def lock_duration(self, value: builtins.str) -> None:
        jsii.set(self, "lockDuration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxDeliveryCount")
    def max_delivery_count(self) -> jsii.Number:
        return jsii.get(self, "maxDeliveryCount")

    @max_delivery_count.setter # type: ignore
    def max_delivery_count(self, value: jsii.Number) -> None:
        jsii.set(self, "maxDeliveryCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeInMegabytes")
    def max_size_in_megabytes(self) -> jsii.Number:
        return jsii.get(self, "maxSizeInMegabytes")

    @max_size_in_megabytes.setter # type: ignore
    def max_size_in_megabytes(self, value: jsii.Number) -> None:
        jsii.set(self, "maxSizeInMegabytes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresDuplicateDetection")
    def requires_duplicate_detection(self) -> builtins.bool:
        return jsii.get(self, "requiresDuplicateDetection")

    @requires_duplicate_detection.setter # type: ignore
    def requires_duplicate_detection(self, value: builtins.bool) -> None:
        jsii.set(self, "requiresDuplicateDetection", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresSession")
    def requires_session(self) -> builtins.bool:
        return jsii.get(self, "requiresSession")

    @requires_session.setter # type: ignore
    def requires_session(self, value: builtins.bool) -> None:
        jsii.set(self, "requiresSession", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")

    @status.setter # type: ignore
    def status(self, value: builtins.str) -> None:
        jsii.set(self, "status", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusQueueTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusQueueTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class ServicebusQueueAuthorizationRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusQueueAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        queue_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusQueueAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param queue_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusQueueAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            queue_name=queue_name,
            resource_group_name=resource_group_name,
            listen=listen,
            manage=manage,
            send=send,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusQueueAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetListen")
    def reset_listen(self) -> None:
        return jsii.invoke(self, "resetListen", [])

    @jsii.member(jsii_name="resetManage")
    def reset_manage(self) -> None:
        return jsii.invoke(self, "resetManage", [])

    @jsii.member(jsii_name="resetSend")
    def reset_send(self) -> None:
        return jsii.invoke(self, "resetSend", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queueNameInput")
    def queue_name_input(self) -> builtins.str:
        return jsii.get(self, "queueNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listenInput")
    def listen_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "listenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manageInput")
    def manage_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "manageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendInput")
    def send_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sendInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ServicebusQueueAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @listen.setter # type: ignore
    def listen(self, value: builtins.bool) -> None:
        jsii.set(self, "listen", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @manage.setter # type: ignore
    def manage(self, value: builtins.bool) -> None:
        jsii.set(self, "manage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queueName")
    def queue_name(self) -> builtins.str:
        return jsii.get(self, "queueName")

    @queue_name.setter # type: ignore
    def queue_name(self, value: builtins.str) -> None:
        jsii.set(self, "queueName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @send.setter # type: ignore
    def send(self, value: builtins.bool) -> None:
        jsii.set(self, "send", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusQueueAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusQueueAuthorizationRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.ServicebusQueueAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "queue_name": "queueName",
        "resource_group_name": "resourceGroupName",
        "listen": "listen",
        "manage": "manage",
        "send": "send",
        "timeouts": "timeouts",
    },
)
class ServicebusQueueAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        queue_name: builtins.str,
        resource_group_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusQueueAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param queue_name: -
        :param resource_group_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusQueueAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "queue_name": queue_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if listen is not None:
            self._values["listen"] = listen
        if manage is not None:
            self._values["manage"] = manage
        if send is not None:
            self._values["send"] = send
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def queue_name(self) -> builtins.str:
        result = self._values.get("queue_name")
        assert result is not None, "Required property 'queue_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def listen(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("listen")
        return result

    @builtins.property
    def manage(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manage")
        return result

    @builtins.property
    def send(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusQueueAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusQueueAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusQueueAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusQueueAuthorizationRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusQueueAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusQueueConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "auto_delete_on_idle": "autoDeleteOnIdle",
        "dead_lettering_on_message_expiration": "deadLetteringOnMessageExpiration",
        "default_message_ttl": "defaultMessageTtl",
        "duplicate_detection_history_time_window": "duplicateDetectionHistoryTimeWindow",
        "enable_batched_operations": "enableBatchedOperations",
        "enable_express": "enableExpress",
        "enable_partitioning": "enablePartitioning",
        "forward_dead_lettered_messages_to": "forwardDeadLetteredMessagesTo",
        "forward_to": "forwardTo",
        "lock_duration": "lockDuration",
        "max_delivery_count": "maxDeliveryCount",
        "max_size_in_megabytes": "maxSizeInMegabytes",
        "requires_duplicate_detection": "requiresDuplicateDetection",
        "requires_session": "requiresSession",
        "status": "status",
        "timeouts": "timeouts",
    },
)
class ServicebusQueueConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        auto_delete_on_idle: typing.Optional[builtins.str] = None,
        dead_lettering_on_message_expiration: typing.Optional[builtins.bool] = None,
        default_message_ttl: typing.Optional[builtins.str] = None,
        duplicate_detection_history_time_window: typing.Optional[builtins.str] = None,
        enable_batched_operations: typing.Optional[builtins.bool] = None,
        enable_express: typing.Optional[builtins.bool] = None,
        enable_partitioning: typing.Optional[builtins.bool] = None,
        forward_dead_lettered_messages_to: typing.Optional[builtins.str] = None,
        forward_to: typing.Optional[builtins.str] = None,
        lock_duration: typing.Optional[builtins.str] = None,
        max_delivery_count: typing.Optional[jsii.Number] = None,
        max_size_in_megabytes: typing.Optional[jsii.Number] = None,
        requires_duplicate_detection: typing.Optional[builtins.bool] = None,
        requires_session: typing.Optional[builtins.bool] = None,
        status: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ServicebusQueueTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param auto_delete_on_idle: -
        :param dead_lettering_on_message_expiration: -
        :param default_message_ttl: -
        :param duplicate_detection_history_time_window: -
        :param enable_batched_operations: -
        :param enable_express: -
        :param enable_partitioning: -
        :param forward_dead_lettered_messages_to: -
        :param forward_to: -
        :param lock_duration: -
        :param max_delivery_count: -
        :param max_size_in_megabytes: -
        :param requires_duplicate_detection: -
        :param requires_session: -
        :param status: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusQueueTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_delete_on_idle is not None:
            self._values["auto_delete_on_idle"] = auto_delete_on_idle
        if dead_lettering_on_message_expiration is not None:
            self._values["dead_lettering_on_message_expiration"] = dead_lettering_on_message_expiration
        if default_message_ttl is not None:
            self._values["default_message_ttl"] = default_message_ttl
        if duplicate_detection_history_time_window is not None:
            self._values["duplicate_detection_history_time_window"] = duplicate_detection_history_time_window
        if enable_batched_operations is not None:
            self._values["enable_batched_operations"] = enable_batched_operations
        if enable_express is not None:
            self._values["enable_express"] = enable_express
        if enable_partitioning is not None:
            self._values["enable_partitioning"] = enable_partitioning
        if forward_dead_lettered_messages_to is not None:
            self._values["forward_dead_lettered_messages_to"] = forward_dead_lettered_messages_to
        if forward_to is not None:
            self._values["forward_to"] = forward_to
        if lock_duration is not None:
            self._values["lock_duration"] = lock_duration
        if max_delivery_count is not None:
            self._values["max_delivery_count"] = max_delivery_count
        if max_size_in_megabytes is not None:
            self._values["max_size_in_megabytes"] = max_size_in_megabytes
        if requires_duplicate_detection is not None:
            self._values["requires_duplicate_detection"] = requires_duplicate_detection
        if requires_session is not None:
            self._values["requires_session"] = requires_session
        if status is not None:
            self._values["status"] = status
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def auto_delete_on_idle(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_delete_on_idle")
        return result

    @builtins.property
    def dead_lettering_on_message_expiration(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("dead_lettering_on_message_expiration")
        return result

    @builtins.property
    def default_message_ttl(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_message_ttl")
        return result

    @builtins.property
    def duplicate_detection_history_time_window(self) -> typing.Optional[builtins.str]:
        result = self._values.get("duplicate_detection_history_time_window")
        return result

    @builtins.property
    def enable_batched_operations(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_batched_operations")
        return result

    @builtins.property
    def enable_express(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_express")
        return result

    @builtins.property
    def enable_partitioning(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_partitioning")
        return result

    @builtins.property
    def forward_dead_lettered_messages_to(self) -> typing.Optional[builtins.str]:
        result = self._values.get("forward_dead_lettered_messages_to")
        return result

    @builtins.property
    def forward_to(self) -> typing.Optional[builtins.str]:
        result = self._values.get("forward_to")
        return result

    @builtins.property
    def lock_duration(self) -> typing.Optional[builtins.str]:
        result = self._values.get("lock_duration")
        return result

    @builtins.property
    def max_delivery_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_delivery_count")
        return result

    @builtins.property
    def max_size_in_megabytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_size_in_megabytes")
        return result

    @builtins.property
    def requires_duplicate_detection(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("requires_duplicate_detection")
        return result

    @builtins.property
    def requires_session(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("requires_session")
        return result

    @builtins.property
    def status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("status")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusQueueTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusQueueConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusQueueTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusQueueTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusQueueTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServicebusSubscription(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusSubscription",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        max_delivery_count: jsii.Number,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        auto_delete_on_idle: typing.Optional[builtins.str] = None,
        dead_lettering_on_filter_evaluation_error: typing.Optional[builtins.bool] = None,
        dead_lettering_on_message_expiration: typing.Optional[builtins.bool] = None,
        default_message_ttl: typing.Optional[builtins.str] = None,
        enable_batched_operations: typing.Optional[builtins.bool] = None,
        forward_dead_lettered_messages_to: typing.Optional[builtins.str] = None,
        forward_to: typing.Optional[builtins.str] = None,
        lock_duration: typing.Optional[builtins.str] = None,
        requires_session: typing.Optional[builtins.bool] = None,
        status: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ServicebusSubscriptionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param max_delivery_count: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param auto_delete_on_idle: -
        :param dead_lettering_on_filter_evaluation_error: -
        :param dead_lettering_on_message_expiration: -
        :param default_message_ttl: -
        :param enable_batched_operations: -
        :param forward_dead_lettered_messages_to: -
        :param forward_to: -
        :param lock_duration: -
        :param requires_session: -
        :param status: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusSubscriptionConfig(
            max_delivery_count=max_delivery_count,
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            topic_name=topic_name,
            auto_delete_on_idle=auto_delete_on_idle,
            dead_lettering_on_filter_evaluation_error=dead_lettering_on_filter_evaluation_error,
            dead_lettering_on_message_expiration=dead_lettering_on_message_expiration,
            default_message_ttl=default_message_ttl,
            enable_batched_operations=enable_batched_operations,
            forward_dead_lettered_messages_to=forward_dead_lettered_messages_to,
            forward_to=forward_to,
            lock_duration=lock_duration,
            requires_session=requires_session,
            status=status,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusSubscription, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoDeleteOnIdle")
    def reset_auto_delete_on_idle(self) -> None:
        return jsii.invoke(self, "resetAutoDeleteOnIdle", [])

    @jsii.member(jsii_name="resetDeadLetteringOnFilterEvaluationError")
    def reset_dead_lettering_on_filter_evaluation_error(self) -> None:
        return jsii.invoke(self, "resetDeadLetteringOnFilterEvaluationError", [])

    @jsii.member(jsii_name="resetDeadLetteringOnMessageExpiration")
    def reset_dead_lettering_on_message_expiration(self) -> None:
        return jsii.invoke(self, "resetDeadLetteringOnMessageExpiration", [])

    @jsii.member(jsii_name="resetDefaultMessageTtl")
    def reset_default_message_ttl(self) -> None:
        return jsii.invoke(self, "resetDefaultMessageTtl", [])

    @jsii.member(jsii_name="resetEnableBatchedOperations")
    def reset_enable_batched_operations(self) -> None:
        return jsii.invoke(self, "resetEnableBatchedOperations", [])

    @jsii.member(jsii_name="resetForwardDeadLetteredMessagesTo")
    def reset_forward_dead_lettered_messages_to(self) -> None:
        return jsii.invoke(self, "resetForwardDeadLetteredMessagesTo", [])

    @jsii.member(jsii_name="resetForwardTo")
    def reset_forward_to(self) -> None:
        return jsii.invoke(self, "resetForwardTo", [])

    @jsii.member(jsii_name="resetLockDuration")
    def reset_lock_duration(self) -> None:
        return jsii.invoke(self, "resetLockDuration", [])

    @jsii.member(jsii_name="resetRequiresSession")
    def reset_requires_session(self) -> None:
        return jsii.invoke(self, "resetRequiresSession", [])

    @jsii.member(jsii_name="resetStatus")
    def reset_status(self) -> None:
        return jsii.invoke(self, "resetStatus", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxDeliveryCountInput")
    def max_delivery_count_input(self) -> jsii.Number:
        return jsii.get(self, "maxDeliveryCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicNameInput")
    def topic_name_input(self) -> builtins.str:
        return jsii.get(self, "topicNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoDeleteOnIdleInput")
    def auto_delete_on_idle_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "autoDeleteOnIdleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnFilterEvaluationErrorInput")
    def dead_lettering_on_filter_evaluation_error_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "deadLetteringOnFilterEvaluationErrorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnMessageExpirationInput")
    def dead_lettering_on_message_expiration_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "deadLetteringOnMessageExpirationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultMessageTtlInput")
    def default_message_ttl_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultMessageTtlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBatchedOperationsInput")
    def enable_batched_operations_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableBatchedOperationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardDeadLetteredMessagesToInput")
    def forward_dead_lettered_messages_to_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "forwardDeadLetteredMessagesToInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardToInput")
    def forward_to_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "forwardToInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockDurationInput")
    def lock_duration_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "lockDurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresSessionInput")
    def requires_session_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "requiresSessionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="statusInput")
    def status_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "statusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServicebusSubscriptionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoDeleteOnIdle")
    def auto_delete_on_idle(self) -> builtins.str:
        return jsii.get(self, "autoDeleteOnIdle")

    @auto_delete_on_idle.setter # type: ignore
    def auto_delete_on_idle(self, value: builtins.str) -> None:
        jsii.set(self, "autoDeleteOnIdle", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnFilterEvaluationError")
    def dead_lettering_on_filter_evaluation_error(self) -> builtins.bool:
        return jsii.get(self, "deadLetteringOnFilterEvaluationError")

    @dead_lettering_on_filter_evaluation_error.setter # type: ignore
    def dead_lettering_on_filter_evaluation_error(self, value: builtins.bool) -> None:
        jsii.set(self, "deadLetteringOnFilterEvaluationError", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deadLetteringOnMessageExpiration")
    def dead_lettering_on_message_expiration(self) -> builtins.bool:
        return jsii.get(self, "deadLetteringOnMessageExpiration")

    @dead_lettering_on_message_expiration.setter # type: ignore
    def dead_lettering_on_message_expiration(self, value: builtins.bool) -> None:
        jsii.set(self, "deadLetteringOnMessageExpiration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultMessageTtl")
    def default_message_ttl(self) -> builtins.str:
        return jsii.get(self, "defaultMessageTtl")

    @default_message_ttl.setter # type: ignore
    def default_message_ttl(self, value: builtins.str) -> None:
        jsii.set(self, "defaultMessageTtl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBatchedOperations")
    def enable_batched_operations(self) -> builtins.bool:
        return jsii.get(self, "enableBatchedOperations")

    @enable_batched_operations.setter # type: ignore
    def enable_batched_operations(self, value: builtins.bool) -> None:
        jsii.set(self, "enableBatchedOperations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardDeadLetteredMessagesTo")
    def forward_dead_lettered_messages_to(self) -> builtins.str:
        return jsii.get(self, "forwardDeadLetteredMessagesTo")

    @forward_dead_lettered_messages_to.setter # type: ignore
    def forward_dead_lettered_messages_to(self, value: builtins.str) -> None:
        jsii.set(self, "forwardDeadLetteredMessagesTo", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forwardTo")
    def forward_to(self) -> builtins.str:
        return jsii.get(self, "forwardTo")

    @forward_to.setter # type: ignore
    def forward_to(self, value: builtins.str) -> None:
        jsii.set(self, "forwardTo", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lockDuration")
    def lock_duration(self) -> builtins.str:
        return jsii.get(self, "lockDuration")

    @lock_duration.setter # type: ignore
    def lock_duration(self, value: builtins.str) -> None:
        jsii.set(self, "lockDuration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxDeliveryCount")
    def max_delivery_count(self) -> jsii.Number:
        return jsii.get(self, "maxDeliveryCount")

    @max_delivery_count.setter # type: ignore
    def max_delivery_count(self, value: jsii.Number) -> None:
        jsii.set(self, "maxDeliveryCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresSession")
    def requires_session(self) -> builtins.bool:
        return jsii.get(self, "requiresSession")

    @requires_session.setter # type: ignore
    def requires_session(self, value: builtins.bool) -> None:
        jsii.set(self, "requiresSession", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")

    @status.setter # type: ignore
    def status(self, value: builtins.str) -> None:
        jsii.set(self, "status", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusSubscriptionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusSubscriptionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicName")
    def topic_name(self) -> builtins.str:
        return jsii.get(self, "topicName")

    @topic_name.setter # type: ignore
    def topic_name(self, value: builtins.str) -> None:
        jsii.set(self, "topicName", value)


@jsii.data_type(
    jsii_type="azurerm.ServicebusSubscriptionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "max_delivery_count": "maxDeliveryCount",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "topic_name": "topicName",
        "auto_delete_on_idle": "autoDeleteOnIdle",
        "dead_lettering_on_filter_evaluation_error": "deadLetteringOnFilterEvaluationError",
        "dead_lettering_on_message_expiration": "deadLetteringOnMessageExpiration",
        "default_message_ttl": "defaultMessageTtl",
        "enable_batched_operations": "enableBatchedOperations",
        "forward_dead_lettered_messages_to": "forwardDeadLetteredMessagesTo",
        "forward_to": "forwardTo",
        "lock_duration": "lockDuration",
        "requires_session": "requiresSession",
        "status": "status",
        "timeouts": "timeouts",
    },
)
class ServicebusSubscriptionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        max_delivery_count: jsii.Number,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        auto_delete_on_idle: typing.Optional[builtins.str] = None,
        dead_lettering_on_filter_evaluation_error: typing.Optional[builtins.bool] = None,
        dead_lettering_on_message_expiration: typing.Optional[builtins.bool] = None,
        default_message_ttl: typing.Optional[builtins.str] = None,
        enable_batched_operations: typing.Optional[builtins.bool] = None,
        forward_dead_lettered_messages_to: typing.Optional[builtins.str] = None,
        forward_to: typing.Optional[builtins.str] = None,
        lock_duration: typing.Optional[builtins.str] = None,
        requires_session: typing.Optional[builtins.bool] = None,
        status: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ServicebusSubscriptionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param max_delivery_count: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param auto_delete_on_idle: -
        :param dead_lettering_on_filter_evaluation_error: -
        :param dead_lettering_on_message_expiration: -
        :param default_message_ttl: -
        :param enable_batched_operations: -
        :param forward_dead_lettered_messages_to: -
        :param forward_to: -
        :param lock_duration: -
        :param requires_session: -
        :param status: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusSubscriptionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "max_delivery_count": max_delivery_count,
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
            "topic_name": topic_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_delete_on_idle is not None:
            self._values["auto_delete_on_idle"] = auto_delete_on_idle
        if dead_lettering_on_filter_evaluation_error is not None:
            self._values["dead_lettering_on_filter_evaluation_error"] = dead_lettering_on_filter_evaluation_error
        if dead_lettering_on_message_expiration is not None:
            self._values["dead_lettering_on_message_expiration"] = dead_lettering_on_message_expiration
        if default_message_ttl is not None:
            self._values["default_message_ttl"] = default_message_ttl
        if enable_batched_operations is not None:
            self._values["enable_batched_operations"] = enable_batched_operations
        if forward_dead_lettered_messages_to is not None:
            self._values["forward_dead_lettered_messages_to"] = forward_dead_lettered_messages_to
        if forward_to is not None:
            self._values["forward_to"] = forward_to
        if lock_duration is not None:
            self._values["lock_duration"] = lock_duration
        if requires_session is not None:
            self._values["requires_session"] = requires_session
        if status is not None:
            self._values["status"] = status
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def max_delivery_count(self) -> jsii.Number:
        result = self._values.get("max_delivery_count")
        assert result is not None, "Required property 'max_delivery_count' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def topic_name(self) -> builtins.str:
        result = self._values.get("topic_name")
        assert result is not None, "Required property 'topic_name' is missing"
        return result

    @builtins.property
    def auto_delete_on_idle(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_delete_on_idle")
        return result

    @builtins.property
    def dead_lettering_on_filter_evaluation_error(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("dead_lettering_on_filter_evaluation_error")
        return result

    @builtins.property
    def dead_lettering_on_message_expiration(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("dead_lettering_on_message_expiration")
        return result

    @builtins.property
    def default_message_ttl(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_message_ttl")
        return result

    @builtins.property
    def enable_batched_operations(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_batched_operations")
        return result

    @builtins.property
    def forward_dead_lettered_messages_to(self) -> typing.Optional[builtins.str]:
        result = self._values.get("forward_dead_lettered_messages_to")
        return result

    @builtins.property
    def forward_to(self) -> typing.Optional[builtins.str]:
        result = self._values.get("forward_to")
        return result

    @builtins.property
    def lock_duration(self) -> typing.Optional[builtins.str]:
        result = self._values.get("lock_duration")
        return result

    @builtins.property
    def requires_session(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("requires_session")
        return result

    @builtins.property
    def status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("status")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusSubscriptionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusSubscriptionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServicebusSubscriptionRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusSubscriptionRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        filter_type: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        subscription_name: builtins.str,
        topic_name: builtins.str,
        action: typing.Optional[builtins.str] = None,
        correlation_filter: typing.Optional[typing.List["ServicebusSubscriptionRuleCorrelationFilter"]] = None,
        sql_filter: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ServicebusSubscriptionRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param filter_type: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param subscription_name: -
        :param topic_name: -
        :param action: -
        :param correlation_filter: correlation_filter block.
        :param sql_filter: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusSubscriptionRuleConfig(
            filter_type=filter_type,
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            subscription_name=subscription_name,
            topic_name=topic_name,
            action=action,
            correlation_filter=correlation_filter,
            sql_filter=sql_filter,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusSubscriptionRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetAction")
    def reset_action(self) -> None:
        return jsii.invoke(self, "resetAction", [])

    @jsii.member(jsii_name="resetCorrelationFilter")
    def reset_correlation_filter(self) -> None:
        return jsii.invoke(self, "resetCorrelationFilter", [])

    @jsii.member(jsii_name="resetSqlFilter")
    def reset_sql_filter(self) -> None:
        return jsii.invoke(self, "resetSqlFilter", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterTypeInput")
    def filter_type_input(self) -> builtins.str:
        return jsii.get(self, "filterTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionNameInput")
    def subscription_name_input(self) -> builtins.str:
        return jsii.get(self, "subscriptionNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicNameInput")
    def topic_name_input(self) -> builtins.str:
        return jsii.get(self, "topicNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="actionInput")
    def action_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "actionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="correlationFilterInput")
    def correlation_filter_input(
        self,
    ) -> typing.Optional[typing.List["ServicebusSubscriptionRuleCorrelationFilter"]]:
        return jsii.get(self, "correlationFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlFilterInput")
    def sql_filter_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sqlFilterInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServicebusSubscriptionRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="action")
    def action(self) -> builtins.str:
        return jsii.get(self, "action")

    @action.setter # type: ignore
    def action(self, value: builtins.str) -> None:
        jsii.set(self, "action", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="correlationFilter")
    def correlation_filter(
        self,
    ) -> typing.List["ServicebusSubscriptionRuleCorrelationFilter"]:
        return jsii.get(self, "correlationFilter")

    @correlation_filter.setter # type: ignore
    def correlation_filter(
        self,
        value: typing.List["ServicebusSubscriptionRuleCorrelationFilter"],
    ) -> None:
        jsii.set(self, "correlationFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filterType")
    def filter_type(self) -> builtins.str:
        return jsii.get(self, "filterType")

    @filter_type.setter # type: ignore
    def filter_type(self, value: builtins.str) -> None:
        jsii.set(self, "filterType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlFilter")
    def sql_filter(self) -> builtins.str:
        return jsii.get(self, "sqlFilter")

    @sql_filter.setter # type: ignore
    def sql_filter(self, value: builtins.str) -> None:
        jsii.set(self, "sqlFilter", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subscriptionName")
    def subscription_name(self) -> builtins.str:
        return jsii.get(self, "subscriptionName")

    @subscription_name.setter # type: ignore
    def subscription_name(self, value: builtins.str) -> None:
        jsii.set(self, "subscriptionName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusSubscriptionRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusSubscriptionRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicName")
    def topic_name(self) -> builtins.str:
        return jsii.get(self, "topicName")

    @topic_name.setter # type: ignore
    def topic_name(self, value: builtins.str) -> None:
        jsii.set(self, "topicName", value)


@jsii.data_type(
    jsii_type="azurerm.ServicebusSubscriptionRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "filter_type": "filterType",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "subscription_name": "subscriptionName",
        "topic_name": "topicName",
        "action": "action",
        "correlation_filter": "correlationFilter",
        "sql_filter": "sqlFilter",
        "timeouts": "timeouts",
    },
)
class ServicebusSubscriptionRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        filter_type: builtins.str,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        subscription_name: builtins.str,
        topic_name: builtins.str,
        action: typing.Optional[builtins.str] = None,
        correlation_filter: typing.Optional[typing.List["ServicebusSubscriptionRuleCorrelationFilter"]] = None,
        sql_filter: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["ServicebusSubscriptionRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filter_type: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param subscription_name: -
        :param topic_name: -
        :param action: -
        :param correlation_filter: correlation_filter block.
        :param sql_filter: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusSubscriptionRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "filter_type": filter_type,
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
            "subscription_name": subscription_name,
            "topic_name": topic_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if action is not None:
            self._values["action"] = action
        if correlation_filter is not None:
            self._values["correlation_filter"] = correlation_filter
        if sql_filter is not None:
            self._values["sql_filter"] = sql_filter
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def filter_type(self) -> builtins.str:
        result = self._values.get("filter_type")
        assert result is not None, "Required property 'filter_type' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def subscription_name(self) -> builtins.str:
        result = self._values.get("subscription_name")
        assert result is not None, "Required property 'subscription_name' is missing"
        return result

    @builtins.property
    def topic_name(self) -> builtins.str:
        result = self._values.get("topic_name")
        assert result is not None, "Required property 'topic_name' is missing"
        return result

    @builtins.property
    def action(self) -> typing.Optional[builtins.str]:
        result = self._values.get("action")
        return result

    @builtins.property
    def correlation_filter(
        self,
    ) -> typing.Optional[typing.List["ServicebusSubscriptionRuleCorrelationFilter"]]:
        """correlation_filter block."""
        result = self._values.get("correlation_filter")
        return result

    @builtins.property
    def sql_filter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sql_filter")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusSubscriptionRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusSubscriptionRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusSubscriptionRuleCorrelationFilter",
    jsii_struct_bases=[],
    name_mapping={
        "content_type": "contentType",
        "correlation_id": "correlationId",
        "label": "label",
        "message_id": "messageId",
        "properties": "properties",
        "reply_to": "replyTo",
        "reply_to_session_id": "replyToSessionId",
        "session_id": "sessionId",
        "to": "to",
    },
)
class ServicebusSubscriptionRuleCorrelationFilter:
    def __init__(
        self,
        *,
        content_type: typing.Optional[builtins.str] = None,
        correlation_id: typing.Optional[builtins.str] = None,
        label: typing.Optional[builtins.str] = None,
        message_id: typing.Optional[builtins.str] = None,
        properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        reply_to: typing.Optional[builtins.str] = None,
        reply_to_session_id: typing.Optional[builtins.str] = None,
        session_id: typing.Optional[builtins.str] = None,
        to: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param content_type: -
        :param correlation_id: -
        :param label: -
        :param message_id: -
        :param properties: -
        :param reply_to: -
        :param reply_to_session_id: -
        :param session_id: -
        :param to: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if content_type is not None:
            self._values["content_type"] = content_type
        if correlation_id is not None:
            self._values["correlation_id"] = correlation_id
        if label is not None:
            self._values["label"] = label
        if message_id is not None:
            self._values["message_id"] = message_id
        if properties is not None:
            self._values["properties"] = properties
        if reply_to is not None:
            self._values["reply_to"] = reply_to
        if reply_to_session_id is not None:
            self._values["reply_to_session_id"] = reply_to_session_id
        if session_id is not None:
            self._values["session_id"] = session_id
        if to is not None:
            self._values["to"] = to

    @builtins.property
    def content_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_type")
        return result

    @builtins.property
    def correlation_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("correlation_id")
        return result

    @builtins.property
    def label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("label")
        return result

    @builtins.property
    def message_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("message_id")
        return result

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("properties")
        return result

    @builtins.property
    def reply_to(self) -> typing.Optional[builtins.str]:
        result = self._values.get("reply_to")
        return result

    @builtins.property
    def reply_to_session_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("reply_to_session_id")
        return result

    @builtins.property
    def session_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("session_id")
        return result

    @builtins.property
    def to(self) -> typing.Optional[builtins.str]:
        result = self._values.get("to")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusSubscriptionRuleCorrelationFilter(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusSubscriptionRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusSubscriptionRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusSubscriptionRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusSubscriptionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusSubscriptionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusSubscriptionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class ServicebusTopic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusTopic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        auto_delete_on_idle: typing.Optional[builtins.str] = None,
        default_message_ttl: typing.Optional[builtins.str] = None,
        duplicate_detection_history_time_window: typing.Optional[builtins.str] = None,
        enable_batched_operations: typing.Optional[builtins.bool] = None,
        enable_express: typing.Optional[builtins.bool] = None,
        enable_partitioning: typing.Optional[builtins.bool] = None,
        max_size_in_megabytes: typing.Optional[jsii.Number] = None,
        requires_duplicate_detection: typing.Optional[builtins.bool] = None,
        status: typing.Optional[builtins.str] = None,
        support_ordering: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusTopicTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param auto_delete_on_idle: -
        :param default_message_ttl: -
        :param duplicate_detection_history_time_window: -
        :param enable_batched_operations: -
        :param enable_express: -
        :param enable_partitioning: -
        :param max_size_in_megabytes: -
        :param requires_duplicate_detection: -
        :param status: -
        :param support_ordering: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusTopicConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            auto_delete_on_idle=auto_delete_on_idle,
            default_message_ttl=default_message_ttl,
            duplicate_detection_history_time_window=duplicate_detection_history_time_window,
            enable_batched_operations=enable_batched_operations,
            enable_express=enable_express,
            enable_partitioning=enable_partitioning,
            max_size_in_megabytes=max_size_in_megabytes,
            requires_duplicate_detection=requires_duplicate_detection,
            status=status,
            support_ordering=support_ordering,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusTopic, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoDeleteOnIdle")
    def reset_auto_delete_on_idle(self) -> None:
        return jsii.invoke(self, "resetAutoDeleteOnIdle", [])

    @jsii.member(jsii_name="resetDefaultMessageTtl")
    def reset_default_message_ttl(self) -> None:
        return jsii.invoke(self, "resetDefaultMessageTtl", [])

    @jsii.member(jsii_name="resetDuplicateDetectionHistoryTimeWindow")
    def reset_duplicate_detection_history_time_window(self) -> None:
        return jsii.invoke(self, "resetDuplicateDetectionHistoryTimeWindow", [])

    @jsii.member(jsii_name="resetEnableBatchedOperations")
    def reset_enable_batched_operations(self) -> None:
        return jsii.invoke(self, "resetEnableBatchedOperations", [])

    @jsii.member(jsii_name="resetEnableExpress")
    def reset_enable_express(self) -> None:
        return jsii.invoke(self, "resetEnableExpress", [])

    @jsii.member(jsii_name="resetEnablePartitioning")
    def reset_enable_partitioning(self) -> None:
        return jsii.invoke(self, "resetEnablePartitioning", [])

    @jsii.member(jsii_name="resetMaxSizeInMegabytes")
    def reset_max_size_in_megabytes(self) -> None:
        return jsii.invoke(self, "resetMaxSizeInMegabytes", [])

    @jsii.member(jsii_name="resetRequiresDuplicateDetection")
    def reset_requires_duplicate_detection(self) -> None:
        return jsii.invoke(self, "resetRequiresDuplicateDetection", [])

    @jsii.member(jsii_name="resetStatus")
    def reset_status(self) -> None:
        return jsii.invoke(self, "resetStatus", [])

    @jsii.member(jsii_name="resetSupportOrdering")
    def reset_support_ordering(self) -> None:
        return jsii.invoke(self, "resetSupportOrdering", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoDeleteOnIdleInput")
    def auto_delete_on_idle_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "autoDeleteOnIdleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultMessageTtlInput")
    def default_message_ttl_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultMessageTtlInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="duplicateDetectionHistoryTimeWindowInput")
    def duplicate_detection_history_time_window_input(
        self,
    ) -> typing.Optional[builtins.str]:
        return jsii.get(self, "duplicateDetectionHistoryTimeWindowInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBatchedOperationsInput")
    def enable_batched_operations_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableBatchedOperationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableExpressInput")
    def enable_express_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableExpressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePartitioningInput")
    def enable_partitioning_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enablePartitioningInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeInMegabytesInput")
    def max_size_in_megabytes_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxSizeInMegabytesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresDuplicateDetectionInput")
    def requires_duplicate_detection_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "requiresDuplicateDetectionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="statusInput")
    def status_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "statusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="supportOrderingInput")
    def support_ordering_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "supportOrderingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["ServicebusTopicTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoDeleteOnIdle")
    def auto_delete_on_idle(self) -> builtins.str:
        return jsii.get(self, "autoDeleteOnIdle")

    @auto_delete_on_idle.setter # type: ignore
    def auto_delete_on_idle(self, value: builtins.str) -> None:
        jsii.set(self, "autoDeleteOnIdle", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultMessageTtl")
    def default_message_ttl(self) -> builtins.str:
        return jsii.get(self, "defaultMessageTtl")

    @default_message_ttl.setter # type: ignore
    def default_message_ttl(self, value: builtins.str) -> None:
        jsii.set(self, "defaultMessageTtl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="duplicateDetectionHistoryTimeWindow")
    def duplicate_detection_history_time_window(self) -> builtins.str:
        return jsii.get(self, "duplicateDetectionHistoryTimeWindow")

    @duplicate_detection_history_time_window.setter # type: ignore
    def duplicate_detection_history_time_window(self, value: builtins.str) -> None:
        jsii.set(self, "duplicateDetectionHistoryTimeWindow", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBatchedOperations")
    def enable_batched_operations(self) -> builtins.bool:
        return jsii.get(self, "enableBatchedOperations")

    @enable_batched_operations.setter # type: ignore
    def enable_batched_operations(self, value: builtins.bool) -> None:
        jsii.set(self, "enableBatchedOperations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableExpress")
    def enable_express(self) -> builtins.bool:
        return jsii.get(self, "enableExpress")

    @enable_express.setter # type: ignore
    def enable_express(self, value: builtins.bool) -> None:
        jsii.set(self, "enableExpress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enablePartitioning")
    def enable_partitioning(self) -> builtins.bool:
        return jsii.get(self, "enablePartitioning")

    @enable_partitioning.setter # type: ignore
    def enable_partitioning(self, value: builtins.bool) -> None:
        jsii.set(self, "enablePartitioning", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeInMegabytes")
    def max_size_in_megabytes(self) -> jsii.Number:
        return jsii.get(self, "maxSizeInMegabytes")

    @max_size_in_megabytes.setter # type: ignore
    def max_size_in_megabytes(self, value: jsii.Number) -> None:
        jsii.set(self, "maxSizeInMegabytes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requiresDuplicateDetection")
    def requires_duplicate_detection(self) -> builtins.bool:
        return jsii.get(self, "requiresDuplicateDetection")

    @requires_duplicate_detection.setter # type: ignore
    def requires_duplicate_detection(self, value: builtins.bool) -> None:
        jsii.set(self, "requiresDuplicateDetection", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="status")
    def status(self) -> builtins.str:
        return jsii.get(self, "status")

    @status.setter # type: ignore
    def status(self, value: builtins.str) -> None:
        jsii.set(self, "status", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="supportOrdering")
    def support_ordering(self) -> builtins.bool:
        return jsii.get(self, "supportOrdering")

    @support_ordering.setter # type: ignore
    def support_ordering(self, value: builtins.bool) -> None:
        jsii.set(self, "supportOrdering", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusTopicTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusTopicTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class ServicebusTopicAuthorizationRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.ServicebusTopicAuthorizationRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusTopicAuthorizationRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServicebusTopicAuthorizationRuleConfig(
            name=name,
            namespace_name=namespace_name,
            resource_group_name=resource_group_name,
            topic_name=topic_name,
            listen=listen,
            manage=manage,
            send=send,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(ServicebusTopicAuthorizationRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetListen")
    def reset_listen(self) -> None:
        return jsii.invoke(self, "resetListen", [])

    @jsii.member(jsii_name="resetManage")
    def reset_manage(self) -> None:
        return jsii.invoke(self, "resetManage", [])

    @jsii.member(jsii_name="resetSend")
    def reset_send(self) -> None:
        return jsii.invoke(self, "resetSend", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceNameInput")
    def namespace_name_input(self) -> builtins.str:
        return jsii.get(self, "namespaceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryKey")
    def primary_key(self) -> builtins.str:
        return jsii.get(self, "primaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryKey")
    def secondary_key(self) -> builtins.str:
        return jsii.get(self, "secondaryKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicNameInput")
    def topic_name_input(self) -> builtins.str:
        return jsii.get(self, "topicNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listenInput")
    def listen_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "listenInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manageInput")
    def manage_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "manageInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sendInput")
    def send_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "sendInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["ServicebusTopicAuthorizationRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="listen")
    def listen(self) -> builtins.bool:
        return jsii.get(self, "listen")

    @listen.setter # type: ignore
    def listen(self, value: builtins.bool) -> None:
        jsii.set(self, "listen", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="manage")
    def manage(self) -> builtins.bool:
        return jsii.get(self, "manage")

    @manage.setter # type: ignore
    def manage(self, value: builtins.bool) -> None:
        jsii.set(self, "manage", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="namespaceName")
    def namespace_name(self) -> builtins.str:
        return jsii.get(self, "namespaceName")

    @namespace_name.setter # type: ignore
    def namespace_name(self, value: builtins.str) -> None:
        jsii.set(self, "namespaceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="send")
    def send(self) -> builtins.bool:
        return jsii.get(self, "send")

    @send.setter # type: ignore
    def send(self, value: builtins.bool) -> None:
        jsii.set(self, "send", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "ServicebusTopicAuthorizationRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "ServicebusTopicAuthorizationRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicName")
    def topic_name(self) -> builtins.str:
        return jsii.get(self, "topicName")

    @topic_name.setter # type: ignore
    def topic_name(self, value: builtins.str) -> None:
        jsii.set(self, "topicName", value)


@jsii.data_type(
    jsii_type="azurerm.ServicebusTopicAuthorizationRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "topic_name": "topicName",
        "listen": "listen",
        "manage": "manage",
        "send": "send",
        "timeouts": "timeouts",
    },
)
class ServicebusTopicAuthorizationRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        topic_name: builtins.str,
        listen: typing.Optional[builtins.bool] = None,
        manage: typing.Optional[builtins.bool] = None,
        send: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusTopicAuthorizationRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param topic_name: -
        :param listen: -
        :param manage: -
        :param send: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusTopicAuthorizationRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
            "topic_name": topic_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if listen is not None:
            self._values["listen"] = listen
        if manage is not None:
            self._values["manage"] = manage
        if send is not None:
            self._values["send"] = send
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def topic_name(self) -> builtins.str:
        result = self._values.get("topic_name")
        assert result is not None, "Required property 'topic_name' is missing"
        return result

    @builtins.property
    def listen(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("listen")
        return result

    @builtins.property
    def manage(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("manage")
        return result

    @builtins.property
    def send(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("send")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusTopicAuthorizationRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusTopicAuthorizationRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusTopicAuthorizationRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusTopicAuthorizationRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusTopicAuthorizationRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusTopicConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "namespace_name": "namespaceName",
        "resource_group_name": "resourceGroupName",
        "auto_delete_on_idle": "autoDeleteOnIdle",
        "default_message_ttl": "defaultMessageTtl",
        "duplicate_detection_history_time_window": "duplicateDetectionHistoryTimeWindow",
        "enable_batched_operations": "enableBatchedOperations",
        "enable_express": "enableExpress",
        "enable_partitioning": "enablePartitioning",
        "max_size_in_megabytes": "maxSizeInMegabytes",
        "requires_duplicate_detection": "requiresDuplicateDetection",
        "status": "status",
        "support_ordering": "supportOrdering",
        "timeouts": "timeouts",
    },
)
class ServicebusTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        namespace_name: builtins.str,
        resource_group_name: builtins.str,
        auto_delete_on_idle: typing.Optional[builtins.str] = None,
        default_message_ttl: typing.Optional[builtins.str] = None,
        duplicate_detection_history_time_window: typing.Optional[builtins.str] = None,
        enable_batched_operations: typing.Optional[builtins.bool] = None,
        enable_express: typing.Optional[builtins.bool] = None,
        enable_partitioning: typing.Optional[builtins.bool] = None,
        max_size_in_megabytes: typing.Optional[jsii.Number] = None,
        requires_duplicate_detection: typing.Optional[builtins.bool] = None,
        status: typing.Optional[builtins.str] = None,
        support_ordering: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["ServicebusTopicTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param namespace_name: -
        :param resource_group_name: -
        :param auto_delete_on_idle: -
        :param default_message_ttl: -
        :param duplicate_detection_history_time_window: -
        :param enable_batched_operations: -
        :param enable_express: -
        :param enable_partitioning: -
        :param max_size_in_megabytes: -
        :param requires_duplicate_detection: -
        :param status: -
        :param support_ordering: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = ServicebusTopicTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "namespace_name": namespace_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_delete_on_idle is not None:
            self._values["auto_delete_on_idle"] = auto_delete_on_idle
        if default_message_ttl is not None:
            self._values["default_message_ttl"] = default_message_ttl
        if duplicate_detection_history_time_window is not None:
            self._values["duplicate_detection_history_time_window"] = duplicate_detection_history_time_window
        if enable_batched_operations is not None:
            self._values["enable_batched_operations"] = enable_batched_operations
        if enable_express is not None:
            self._values["enable_express"] = enable_express
        if enable_partitioning is not None:
            self._values["enable_partitioning"] = enable_partitioning
        if max_size_in_megabytes is not None:
            self._values["max_size_in_megabytes"] = max_size_in_megabytes
        if requires_duplicate_detection is not None:
            self._values["requires_duplicate_detection"] = requires_duplicate_detection
        if status is not None:
            self._values["status"] = status
        if support_ordering is not None:
            self._values["support_ordering"] = support_ordering
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def namespace_name(self) -> builtins.str:
        result = self._values.get("namespace_name")
        assert result is not None, "Required property 'namespace_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def auto_delete_on_idle(self) -> typing.Optional[builtins.str]:
        result = self._values.get("auto_delete_on_idle")
        return result

    @builtins.property
    def default_message_ttl(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_message_ttl")
        return result

    @builtins.property
    def duplicate_detection_history_time_window(self) -> typing.Optional[builtins.str]:
        result = self._values.get("duplicate_detection_history_time_window")
        return result

    @builtins.property
    def enable_batched_operations(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_batched_operations")
        return result

    @builtins.property
    def enable_express(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_express")
        return result

    @builtins.property
    def enable_partitioning(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_partitioning")
        return result

    @builtins.property
    def max_size_in_megabytes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_size_in_megabytes")
        return result

    @builtins.property
    def requires_duplicate_detection(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("requires_duplicate_detection")
        return result

    @builtins.property
    def status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("status")
        return result

    @builtins.property
    def support_ordering(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("support_ordering")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["ServicebusTopicTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusTopicConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.ServicebusTopicTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class ServicebusTopicTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "ServicebusTopicTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SharedImage(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SharedImage",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        gallery_name: builtins.str,
        identifier: typing.List["SharedImageIdentifier"],
        location: builtins.str,
        name: builtins.str,
        os_type: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        eula: typing.Optional[builtins.str] = None,
        hyper_v_generation: typing.Optional[builtins.str] = None,
        privacy_statement_uri: typing.Optional[builtins.str] = None,
        purchase_plan: typing.Optional[typing.List["SharedImagePurchasePlan"]] = None,
        release_note_uri: typing.Optional[builtins.str] = None,
        specialized: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SharedImageTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param gallery_name: -
        :param identifier: identifier block.
        :param location: -
        :param name: -
        :param os_type: -
        :param resource_group_name: -
        :param description: -
        :param eula: -
        :param hyper_v_generation: -
        :param privacy_statement_uri: -
        :param purchase_plan: purchase_plan block.
        :param release_note_uri: -
        :param specialized: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SharedImageConfig(
            gallery_name=gallery_name,
            identifier=identifier,
            location=location,
            name=name,
            os_type=os_type,
            resource_group_name=resource_group_name,
            description=description,
            eula=eula,
            hyper_v_generation=hyper_v_generation,
            privacy_statement_uri=privacy_statement_uri,
            purchase_plan=purchase_plan,
            release_note_uri=release_note_uri,
            specialized=specialized,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SharedImage, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetEula")
    def reset_eula(self) -> None:
        return jsii.invoke(self, "resetEula", [])

    @jsii.member(jsii_name="resetHyperVGeneration")
    def reset_hyper_v_generation(self) -> None:
        return jsii.invoke(self, "resetHyperVGeneration", [])

    @jsii.member(jsii_name="resetPrivacyStatementUri")
    def reset_privacy_statement_uri(self) -> None:
        return jsii.invoke(self, "resetPrivacyStatementUri", [])

    @jsii.member(jsii_name="resetPurchasePlan")
    def reset_purchase_plan(self) -> None:
        return jsii.invoke(self, "resetPurchasePlan", [])

    @jsii.member(jsii_name="resetReleaseNoteUri")
    def reset_release_note_uri(self) -> None:
        return jsii.invoke(self, "resetReleaseNoteUri", [])

    @jsii.member(jsii_name="resetSpecialized")
    def reset_specialized(self) -> None:
        return jsii.invoke(self, "resetSpecialized", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryNameInput")
    def gallery_name_input(self) -> builtins.str:
        return jsii.get(self, "galleryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identifierInput")
    def identifier_input(self) -> typing.List["SharedImageIdentifier"]:
        return jsii.get(self, "identifierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osTypeInput")
    def os_type_input(self) -> builtins.str:
        return jsii.get(self, "osTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eulaInput")
    def eula_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "eulaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hyperVGenerationInput")
    def hyper_v_generation_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "hyperVGenerationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privacyStatementUriInput")
    def privacy_statement_uri_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "privacyStatementUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="purchasePlanInput")
    def purchase_plan_input(
        self,
    ) -> typing.Optional[typing.List["SharedImagePurchasePlan"]]:
        return jsii.get(self, "purchasePlanInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="releaseNoteUriInput")
    def release_note_uri_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "releaseNoteUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="specializedInput")
    def specialized_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "specializedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SharedImageTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eula")
    def eula(self) -> builtins.str:
        return jsii.get(self, "eula")

    @eula.setter # type: ignore
    def eula(self, value: builtins.str) -> None:
        jsii.set(self, "eula", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryName")
    def gallery_name(self) -> builtins.str:
        return jsii.get(self, "galleryName")

    @gallery_name.setter # type: ignore
    def gallery_name(self, value: builtins.str) -> None:
        jsii.set(self, "galleryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hyperVGeneration")
    def hyper_v_generation(self) -> builtins.str:
        return jsii.get(self, "hyperVGeneration")

    @hyper_v_generation.setter # type: ignore
    def hyper_v_generation(self, value: builtins.str) -> None:
        jsii.set(self, "hyperVGeneration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identifier")
    def identifier(self) -> typing.List["SharedImageIdentifier"]:
        return jsii.get(self, "identifier")

    @identifier.setter # type: ignore
    def identifier(self, value: typing.List["SharedImageIdentifier"]) -> None:
        jsii.set(self, "identifier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osType")
    def os_type(self) -> builtins.str:
        return jsii.get(self, "osType")

    @os_type.setter # type: ignore
    def os_type(self, value: builtins.str) -> None:
        jsii.set(self, "osType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privacyStatementUri")
    def privacy_statement_uri(self) -> builtins.str:
        return jsii.get(self, "privacyStatementUri")

    @privacy_statement_uri.setter # type: ignore
    def privacy_statement_uri(self, value: builtins.str) -> None:
        jsii.set(self, "privacyStatementUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="purchasePlan")
    def purchase_plan(self) -> typing.List["SharedImagePurchasePlan"]:
        return jsii.get(self, "purchasePlan")

    @purchase_plan.setter # type: ignore
    def purchase_plan(self, value: typing.List["SharedImagePurchasePlan"]) -> None:
        jsii.set(self, "purchasePlan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="releaseNoteUri")
    def release_note_uri(self) -> builtins.str:
        return jsii.get(self, "releaseNoteUri")

    @release_note_uri.setter # type: ignore
    def release_note_uri(self, value: builtins.str) -> None:
        jsii.set(self, "releaseNoteUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="specialized")
    def specialized(self) -> builtins.bool:
        return jsii.get(self, "specialized")

    @specialized.setter # type: ignore
    def specialized(self, value: builtins.bool) -> None:
        jsii.set(self, "specialized", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SharedImageTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SharedImageTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SharedImageConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "gallery_name": "galleryName",
        "identifier": "identifier",
        "location": "location",
        "name": "name",
        "os_type": "osType",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "eula": "eula",
        "hyper_v_generation": "hyperVGeneration",
        "privacy_statement_uri": "privacyStatementUri",
        "purchase_plan": "purchasePlan",
        "release_note_uri": "releaseNoteUri",
        "specialized": "specialized",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SharedImageConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        gallery_name: builtins.str,
        identifier: typing.List["SharedImageIdentifier"],
        location: builtins.str,
        name: builtins.str,
        os_type: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        eula: typing.Optional[builtins.str] = None,
        hyper_v_generation: typing.Optional[builtins.str] = None,
        privacy_statement_uri: typing.Optional[builtins.str] = None,
        purchase_plan: typing.Optional[typing.List["SharedImagePurchasePlan"]] = None,
        release_note_uri: typing.Optional[builtins.str] = None,
        specialized: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SharedImageTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param gallery_name: -
        :param identifier: identifier block.
        :param location: -
        :param name: -
        :param os_type: -
        :param resource_group_name: -
        :param description: -
        :param eula: -
        :param hyper_v_generation: -
        :param privacy_statement_uri: -
        :param purchase_plan: purchase_plan block.
        :param release_note_uri: -
        :param specialized: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SharedImageTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "gallery_name": gallery_name,
            "identifier": identifier,
            "location": location,
            "name": name,
            "os_type": os_type,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if eula is not None:
            self._values["eula"] = eula
        if hyper_v_generation is not None:
            self._values["hyper_v_generation"] = hyper_v_generation
        if privacy_statement_uri is not None:
            self._values["privacy_statement_uri"] = privacy_statement_uri
        if purchase_plan is not None:
            self._values["purchase_plan"] = purchase_plan
        if release_note_uri is not None:
            self._values["release_note_uri"] = release_note_uri
        if specialized is not None:
            self._values["specialized"] = specialized
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def gallery_name(self) -> builtins.str:
        result = self._values.get("gallery_name")
        assert result is not None, "Required property 'gallery_name' is missing"
        return result

    @builtins.property
    def identifier(self) -> typing.List["SharedImageIdentifier"]:
        """identifier block."""
        result = self._values.get("identifier")
        assert result is not None, "Required property 'identifier' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def os_type(self) -> builtins.str:
        result = self._values.get("os_type")
        assert result is not None, "Required property 'os_type' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def eula(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eula")
        return result

    @builtins.property
    def hyper_v_generation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("hyper_v_generation")
        return result

    @builtins.property
    def privacy_statement_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("privacy_statement_uri")
        return result

    @builtins.property
    def purchase_plan(self) -> typing.Optional[typing.List["SharedImagePurchasePlan"]]:
        """purchase_plan block."""
        result = self._values.get("purchase_plan")
        return result

    @builtins.property
    def release_note_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("release_note_uri")
        return result

    @builtins.property
    def specialized(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("specialized")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SharedImageTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SharedImageGallery(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SharedImageGallery",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SharedImageGalleryTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SharedImageGalleryConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SharedImageGallery, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueName")
    def unique_name(self) -> builtins.str:
        return jsii.get(self, "uniqueName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SharedImageGalleryTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SharedImageGalleryTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SharedImageGalleryTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SharedImageGalleryConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SharedImageGalleryConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SharedImageGalleryTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SharedImageGalleryTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SharedImageGalleryTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageGalleryConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SharedImageGalleryTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SharedImageGalleryTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageGalleryTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SharedImageIdentifier",
    jsii_struct_bases=[],
    name_mapping={"offer": "offer", "publisher": "publisher", "sku": "sku"},
)
class SharedImageIdentifier:
    def __init__(
        self,
        *,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
    ) -> None:
        """
        :param offer: -
        :param publisher: -
        :param sku: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
        }

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageIdentifier(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SharedImagePurchasePlan",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "product": "product", "publisher": "publisher"},
)
class SharedImagePurchasePlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: typing.Optional[builtins.str] = None,
        publisher: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if product is not None:
            self._values["product"] = product
        if publisher is not None:
            self._values["publisher"] = publisher

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> typing.Optional[builtins.str]:
        result = self._values.get("product")
        return result

    @builtins.property
    def publisher(self) -> typing.Optional[builtins.str]:
        result = self._values.get("publisher")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImagePurchasePlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SharedImageTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SharedImageTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SharedImageVersion(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SharedImageVersion",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        gallery_name: builtins.str,
        image_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        target_region: typing.List["SharedImageVersionTargetRegion"],
        exclude_from_latest: typing.Optional[builtins.bool] = None,
        managed_image_id: typing.Optional[builtins.str] = None,
        os_disk_snapshot_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SharedImageVersionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param gallery_name: -
        :param image_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param target_region: target_region block.
        :param exclude_from_latest: -
        :param managed_image_id: -
        :param os_disk_snapshot_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SharedImageVersionConfig(
            gallery_name=gallery_name,
            image_name=image_name,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            target_region=target_region,
            exclude_from_latest=exclude_from_latest,
            managed_image_id=managed_image_id,
            os_disk_snapshot_id=os_disk_snapshot_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SharedImageVersion, self, [scope, id, config])

    @jsii.member(jsii_name="resetExcludeFromLatest")
    def reset_exclude_from_latest(self) -> None:
        return jsii.invoke(self, "resetExcludeFromLatest", [])

    @jsii.member(jsii_name="resetManagedImageId")
    def reset_managed_image_id(self) -> None:
        return jsii.invoke(self, "resetManagedImageId", [])

    @jsii.member(jsii_name="resetOsDiskSnapshotId")
    def reset_os_disk_snapshot_id(self) -> None:
        return jsii.invoke(self, "resetOsDiskSnapshotId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryNameInput")
    def gallery_name_input(self) -> builtins.str:
        return jsii.get(self, "galleryNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageNameInput")
    def image_name_input(self) -> builtins.str:
        return jsii.get(self, "imageNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRegionInput")
    def target_region_input(self) -> typing.List["SharedImageVersionTargetRegion"]:
        return jsii.get(self, "targetRegionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="excludeFromLatestInput")
    def exclude_from_latest_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "excludeFromLatestInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedImageIdInput")
    def managed_image_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "managedImageIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskSnapshotIdInput")
    def os_disk_snapshot_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "osDiskSnapshotIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SharedImageVersionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="excludeFromLatest")
    def exclude_from_latest(self) -> builtins.bool:
        return jsii.get(self, "excludeFromLatest")

    @exclude_from_latest.setter # type: ignore
    def exclude_from_latest(self, value: builtins.bool) -> None:
        jsii.set(self, "excludeFromLatest", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="galleryName")
    def gallery_name(self) -> builtins.str:
        return jsii.get(self, "galleryName")

    @gallery_name.setter # type: ignore
    def gallery_name(self, value: builtins.str) -> None:
        jsii.set(self, "galleryName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="imageName")
    def image_name(self) -> builtins.str:
        return jsii.get(self, "imageName")

    @image_name.setter # type: ignore
    def image_name(self, value: builtins.str) -> None:
        jsii.set(self, "imageName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedImageId")
    def managed_image_id(self) -> builtins.str:
        return jsii.get(self, "managedImageId")

    @managed_image_id.setter # type: ignore
    def managed_image_id(self, value: builtins.str) -> None:
        jsii.set(self, "managedImageId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskSnapshotId")
    def os_disk_snapshot_id(self) -> builtins.str:
        return jsii.get(self, "osDiskSnapshotId")

    @os_disk_snapshot_id.setter # type: ignore
    def os_disk_snapshot_id(self, value: builtins.str) -> None:
        jsii.set(self, "osDiskSnapshotId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRegion")
    def target_region(self) -> typing.List["SharedImageVersionTargetRegion"]:
        return jsii.get(self, "targetRegion")

    @target_region.setter # type: ignore
    def target_region(
        self,
        value: typing.List["SharedImageVersionTargetRegion"],
    ) -> None:
        jsii.set(self, "targetRegion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SharedImageVersionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SharedImageVersionTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SharedImageVersionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "gallery_name": "galleryName",
        "image_name": "imageName",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "target_region": "targetRegion",
        "exclude_from_latest": "excludeFromLatest",
        "managed_image_id": "managedImageId",
        "os_disk_snapshot_id": "osDiskSnapshotId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SharedImageVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        gallery_name: builtins.str,
        image_name: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        target_region: typing.List["SharedImageVersionTargetRegion"],
        exclude_from_latest: typing.Optional[builtins.bool] = None,
        managed_image_id: typing.Optional[builtins.str] = None,
        os_disk_snapshot_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SharedImageVersionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param gallery_name: -
        :param image_name: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param target_region: target_region block.
        :param exclude_from_latest: -
        :param managed_image_id: -
        :param os_disk_snapshot_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SharedImageVersionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "gallery_name": gallery_name,
            "image_name": image_name,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "target_region": target_region,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if exclude_from_latest is not None:
            self._values["exclude_from_latest"] = exclude_from_latest
        if managed_image_id is not None:
            self._values["managed_image_id"] = managed_image_id
        if os_disk_snapshot_id is not None:
            self._values["os_disk_snapshot_id"] = os_disk_snapshot_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def gallery_name(self) -> builtins.str:
        result = self._values.get("gallery_name")
        assert result is not None, "Required property 'gallery_name' is missing"
        return result

    @builtins.property
    def image_name(self) -> builtins.str:
        result = self._values.get("image_name")
        assert result is not None, "Required property 'image_name' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def target_region(self) -> typing.List["SharedImageVersionTargetRegion"]:
        """target_region block."""
        result = self._values.get("target_region")
        assert result is not None, "Required property 'target_region' is missing"
        return result

    @builtins.property
    def exclude_from_latest(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("exclude_from_latest")
        return result

    @builtins.property
    def managed_image_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_image_id")
        return result

    @builtins.property
    def os_disk_snapshot_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_disk_snapshot_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SharedImageVersionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageVersionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SharedImageVersionTargetRegion",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "regional_replica_count": "regionalReplicaCount",
        "storage_account_type": "storageAccountType",
    },
)
class SharedImageVersionTargetRegion:
    def __init__(
        self,
        *,
        name: builtins.str,
        regional_replica_count: jsii.Number,
        storage_account_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param regional_replica_count: -
        :param storage_account_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "regional_replica_count": regional_replica_count,
        }
        if storage_account_type is not None:
            self._values["storage_account_type"] = storage_account_type

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def regional_replica_count(self) -> jsii.Number:
        result = self._values.get("regional_replica_count")
        assert result is not None, "Required property 'regional_replica_count' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageVersionTargetRegion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SharedImageVersionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SharedImageVersionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SharedImageVersionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SignalrService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SignalrService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["SignalrServiceSku"],
        cors: typing.Optional[typing.List["SignalrServiceCors"]] = None,
        features: typing.Optional[typing.List["SignalrServiceFeatures"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SignalrServiceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param cors: cors block.
        :param features: features block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SignalrServiceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            cors=cors,
            features=features,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SignalrService, self, [scope, id, config])

    @jsii.member(jsii_name="resetCors")
    def reset_cors(self) -> None:
        return jsii.invoke(self, "resetCors", [])

    @jsii.member(jsii_name="resetFeatures")
    def reset_features(self) -> None:
        return jsii.invoke(self, "resetFeatures", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> builtins.str:
        return jsii.get(self, "hostname")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> builtins.str:
        return jsii.get(self, "ipAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicPort")
    def public_port(self) -> jsii.Number:
        return jsii.get(self, "publicPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverPort")
    def server_port(self) -> jsii.Number:
        return jsii.get(self, "serverPort")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["SignalrServiceSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="corsInput")
    def cors_input(self) -> typing.Optional[typing.List["SignalrServiceCors"]]:
        return jsii.get(self, "corsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="featuresInput")
    def features_input(self) -> typing.Optional[typing.List["SignalrServiceFeatures"]]:
        return jsii.get(self, "featuresInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SignalrServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cors")
    def cors(self) -> typing.List["SignalrServiceCors"]:
        return jsii.get(self, "cors")

    @cors.setter # type: ignore
    def cors(self, value: typing.List["SignalrServiceCors"]) -> None:
        jsii.set(self, "cors", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="features")
    def features(self) -> typing.List["SignalrServiceFeatures"]:
        return jsii.get(self, "features")

    @features.setter # type: ignore
    def features(self, value: typing.List["SignalrServiceFeatures"]) -> None:
        jsii.set(self, "features", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["SignalrServiceSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["SignalrServiceSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SignalrServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SignalrServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SignalrServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "cors": "cors",
        "features": "features",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SignalrServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: typing.List["SignalrServiceSku"],
        cors: typing.Optional[typing.List["SignalrServiceCors"]] = None,
        features: typing.Optional[typing.List["SignalrServiceFeatures"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SignalrServiceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: sku block.
        :param cors: cors block.
        :param features: features block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SignalrServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if cors is not None:
            self._values["cors"] = cors
        if features is not None:
            self._values["features"] = features
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["SignalrServiceSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def cors(self) -> typing.Optional[typing.List["SignalrServiceCors"]]:
        """cors block."""
        result = self._values.get("cors")
        return result

    @builtins.property
    def features(self) -> typing.Optional[typing.List["SignalrServiceFeatures"]]:
        """features block."""
        result = self._values.get("features")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SignalrServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SignalrServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SignalrServiceCors",
    jsii_struct_bases=[],
    name_mapping={"allowed_origins": "allowedOrigins"},
)
class SignalrServiceCors:
    def __init__(self, *, allowed_origins: typing.List[builtins.str]) -> None:
        """
        :param allowed_origins: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_origins": allowed_origins,
        }

    @builtins.property
    def allowed_origins(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_origins")
        assert result is not None, "Required property 'allowed_origins' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SignalrServiceCors(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SignalrServiceFeatures",
    jsii_struct_bases=[],
    name_mapping={"flag": "flag", "value": "value"},
)
class SignalrServiceFeatures:
    def __init__(self, *, flag: builtins.str, value: builtins.str) -> None:
        """
        :param flag: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "flag": flag,
            "value": value,
        }

    @builtins.property
    def flag(self) -> builtins.str:
        result = self._values.get("flag")
        assert result is not None, "Required property 'flag' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SignalrServiceFeatures(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SignalrServiceSku",
    jsii_struct_bases=[],
    name_mapping={"capacity": "capacity", "name": "name"},
)
class SignalrServiceSku:
    def __init__(self, *, capacity: jsii.Number, name: builtins.str) -> None:
        """
        :param capacity: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "capacity": capacity,
            "name": name,
        }

    @builtins.property
    def capacity(self) -> jsii.Number:
        result = self._values.get("capacity")
        assert result is not None, "Required property 'capacity' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SignalrServiceSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SignalrServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SignalrServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SignalrServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SiteRecoveryFabric(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SiteRecoveryFabric",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryFabricTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SiteRecoveryFabricConfig(
            location=location,
            name=name,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SiteRecoveryFabric, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SiteRecoveryFabricTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SiteRecoveryFabricTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SiteRecoveryFabricTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryFabricConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class SiteRecoveryFabricConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryFabricTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SiteRecoveryFabricTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SiteRecoveryFabricTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryFabricConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryFabricTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SiteRecoveryFabricTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryFabricTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SiteRecoveryNetworkMapping(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SiteRecoveryNetworkMapping",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_network_id: builtins.str,
        source_recovery_fabric_name: builtins.str,
        target_network_id: builtins.str,
        target_recovery_fabric_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryNetworkMappingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_network_id: -
        :param source_recovery_fabric_name: -
        :param target_network_id: -
        :param target_recovery_fabric_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SiteRecoveryNetworkMappingConfig(
            name=name,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            source_network_id=source_network_id,
            source_recovery_fabric_name=source_recovery_fabric_name,
            target_network_id=target_network_id,
            target_recovery_fabric_name=target_recovery_fabric_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SiteRecoveryNetworkMapping, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceNetworkIdInput")
    def source_network_id_input(self) -> builtins.str:
        return jsii.get(self, "sourceNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceRecoveryFabricNameInput")
    def source_recovery_fabric_name_input(self) -> builtins.str:
        return jsii.get(self, "sourceRecoveryFabricNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetNetworkIdInput")
    def target_network_id_input(self) -> builtins.str:
        return jsii.get(self, "targetNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRecoveryFabricNameInput")
    def target_recovery_fabric_name_input(self) -> builtins.str:
        return jsii.get(self, "targetRecoveryFabricNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SiteRecoveryNetworkMappingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceNetworkId")
    def source_network_id(self) -> builtins.str:
        return jsii.get(self, "sourceNetworkId")

    @source_network_id.setter # type: ignore
    def source_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceNetworkId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceRecoveryFabricName")
    def source_recovery_fabric_name(self) -> builtins.str:
        return jsii.get(self, "sourceRecoveryFabricName")

    @source_recovery_fabric_name.setter # type: ignore
    def source_recovery_fabric_name(self, value: builtins.str) -> None:
        jsii.set(self, "sourceRecoveryFabricName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetNetworkId")
    def target_network_id(self) -> builtins.str:
        return jsii.get(self, "targetNetworkId")

    @target_network_id.setter # type: ignore
    def target_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetNetworkId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRecoveryFabricName")
    def target_recovery_fabric_name(self) -> builtins.str:
        return jsii.get(self, "targetRecoveryFabricName")

    @target_recovery_fabric_name.setter # type: ignore
    def target_recovery_fabric_name(self, value: builtins.str) -> None:
        jsii.set(self, "targetRecoveryFabricName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SiteRecoveryNetworkMappingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SiteRecoveryNetworkMappingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryNetworkMappingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "source_network_id": "sourceNetworkId",
        "source_recovery_fabric_name": "sourceRecoveryFabricName",
        "target_network_id": "targetNetworkId",
        "target_recovery_fabric_name": "targetRecoveryFabricName",
        "timeouts": "timeouts",
    },
)
class SiteRecoveryNetworkMappingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_network_id: builtins.str,
        source_recovery_fabric_name: builtins.str,
        target_network_id: builtins.str,
        target_recovery_fabric_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryNetworkMappingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_network_id: -
        :param source_recovery_fabric_name: -
        :param target_network_id: -
        :param target_recovery_fabric_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SiteRecoveryNetworkMappingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
            "source_network_id": source_network_id,
            "source_recovery_fabric_name": source_recovery_fabric_name,
            "target_network_id": target_network_id,
            "target_recovery_fabric_name": target_recovery_fabric_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def source_network_id(self) -> builtins.str:
        result = self._values.get("source_network_id")
        assert result is not None, "Required property 'source_network_id' is missing"
        return result

    @builtins.property
    def source_recovery_fabric_name(self) -> builtins.str:
        result = self._values.get("source_recovery_fabric_name")
        assert result is not None, "Required property 'source_recovery_fabric_name' is missing"
        return result

    @builtins.property
    def target_network_id(self) -> builtins.str:
        result = self._values.get("target_network_id")
        assert result is not None, "Required property 'target_network_id' is missing"
        return result

    @builtins.property
    def target_recovery_fabric_name(self) -> builtins.str:
        result = self._values.get("target_recovery_fabric_name")
        assert result is not None, "Required property 'target_recovery_fabric_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SiteRecoveryNetworkMappingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryNetworkMappingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryNetworkMappingTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SiteRecoveryNetworkMappingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryNetworkMappingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SiteRecoveryProtectionContainer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SiteRecoveryProtectionContainer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        recovery_fabric_name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryProtectionContainerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param recovery_fabric_name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SiteRecoveryProtectionContainerConfig(
            name=name,
            recovery_fabric_name=recovery_fabric_name,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SiteRecoveryProtectionContainer, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryFabricNameInput")
    def recovery_fabric_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryFabricNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SiteRecoveryProtectionContainerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryFabricName")
    def recovery_fabric_name(self) -> builtins.str:
        return jsii.get(self, "recoveryFabricName")

    @recovery_fabric_name.setter # type: ignore
    def recovery_fabric_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryFabricName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SiteRecoveryProtectionContainerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SiteRecoveryProtectionContainerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryProtectionContainerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "recovery_fabric_name": "recoveryFabricName",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class SiteRecoveryProtectionContainerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        recovery_fabric_name: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryProtectionContainerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param recovery_fabric_name: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SiteRecoveryProtectionContainerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "recovery_fabric_name": recovery_fabric_name,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_fabric_name(self) -> builtins.str:
        result = self._values.get("recovery_fabric_name")
        assert result is not None, "Required property 'recovery_fabric_name' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SiteRecoveryProtectionContainerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryProtectionContainerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SiteRecoveryProtectionContainerMapping(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SiteRecoveryProtectionContainerMapping",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        recovery_fabric_name: builtins.str,
        recovery_replication_policy_id: builtins.str,
        recovery_source_protection_container_name: builtins.str,
        recovery_target_protection_container_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryProtectionContainerMappingTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param recovery_fabric_name: -
        :param recovery_replication_policy_id: -
        :param recovery_source_protection_container_name: -
        :param recovery_target_protection_container_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SiteRecoveryProtectionContainerMappingConfig(
            name=name,
            recovery_fabric_name=recovery_fabric_name,
            recovery_replication_policy_id=recovery_replication_policy_id,
            recovery_source_protection_container_name=recovery_source_protection_container_name,
            recovery_target_protection_container_id=recovery_target_protection_container_id,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SiteRecoveryProtectionContainerMapping, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryFabricNameInput")
    def recovery_fabric_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryFabricNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryReplicationPolicyIdInput")
    def recovery_replication_policy_id_input(self) -> builtins.str:
        return jsii.get(self, "recoveryReplicationPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoverySourceProtectionContainerNameInput")
    def recovery_source_protection_container_name_input(self) -> builtins.str:
        return jsii.get(self, "recoverySourceProtectionContainerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryTargetProtectionContainerIdInput")
    def recovery_target_protection_container_id_input(self) -> builtins.str:
        return jsii.get(self, "recoveryTargetProtectionContainerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SiteRecoveryProtectionContainerMappingTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryFabricName")
    def recovery_fabric_name(self) -> builtins.str:
        return jsii.get(self, "recoveryFabricName")

    @recovery_fabric_name.setter # type: ignore
    def recovery_fabric_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryFabricName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryReplicationPolicyId")
    def recovery_replication_policy_id(self) -> builtins.str:
        return jsii.get(self, "recoveryReplicationPolicyId")

    @recovery_replication_policy_id.setter # type: ignore
    def recovery_replication_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryReplicationPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoverySourceProtectionContainerName")
    def recovery_source_protection_container_name(self) -> builtins.str:
        return jsii.get(self, "recoverySourceProtectionContainerName")

    @recovery_source_protection_container_name.setter # type: ignore
    def recovery_source_protection_container_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoverySourceProtectionContainerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryTargetProtectionContainerId")
    def recovery_target_protection_container_id(self) -> builtins.str:
        return jsii.get(self, "recoveryTargetProtectionContainerId")

    @recovery_target_protection_container_id.setter # type: ignore
    def recovery_target_protection_container_id(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryTargetProtectionContainerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SiteRecoveryProtectionContainerMappingTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SiteRecoveryProtectionContainerMappingTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryProtectionContainerMappingConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "recovery_fabric_name": "recoveryFabricName",
        "recovery_replication_policy_id": "recoveryReplicationPolicyId",
        "recovery_source_protection_container_name": "recoverySourceProtectionContainerName",
        "recovery_target_protection_container_id": "recoveryTargetProtectionContainerId",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class SiteRecoveryProtectionContainerMappingConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        recovery_fabric_name: builtins.str,
        recovery_replication_policy_id: builtins.str,
        recovery_source_protection_container_name: builtins.str,
        recovery_target_protection_container_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryProtectionContainerMappingTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param recovery_fabric_name: -
        :param recovery_replication_policy_id: -
        :param recovery_source_protection_container_name: -
        :param recovery_target_protection_container_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SiteRecoveryProtectionContainerMappingTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "recovery_fabric_name": recovery_fabric_name,
            "recovery_replication_policy_id": recovery_replication_policy_id,
            "recovery_source_protection_container_name": recovery_source_protection_container_name,
            "recovery_target_protection_container_id": recovery_target_protection_container_id,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_fabric_name(self) -> builtins.str:
        result = self._values.get("recovery_fabric_name")
        assert result is not None, "Required property 'recovery_fabric_name' is missing"
        return result

    @builtins.property
    def recovery_replication_policy_id(self) -> builtins.str:
        result = self._values.get("recovery_replication_policy_id")
        assert result is not None, "Required property 'recovery_replication_policy_id' is missing"
        return result

    @builtins.property
    def recovery_source_protection_container_name(self) -> builtins.str:
        result = self._values.get("recovery_source_protection_container_name")
        assert result is not None, "Required property 'recovery_source_protection_container_name' is missing"
        return result

    @builtins.property
    def recovery_target_protection_container_id(self) -> builtins.str:
        result = self._values.get("recovery_target_protection_container_id")
        assert result is not None, "Required property 'recovery_target_protection_container_id' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["SiteRecoveryProtectionContainerMappingTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryProtectionContainerMappingConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryProtectionContainerMappingTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SiteRecoveryProtectionContainerMappingTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryProtectionContainerMappingTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryProtectionContainerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SiteRecoveryProtectionContainerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryProtectionContainerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SiteRecoveryReplicatedVm(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SiteRecoveryReplicatedVm",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        recovery_replication_policy_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_recovery_fabric_name: builtins.str,
        source_recovery_protection_container_name: builtins.str,
        source_vm_id: builtins.str,
        target_recovery_fabric_id: builtins.str,
        target_recovery_protection_container_id: builtins.str,
        target_resource_group_id: builtins.str,
        managed_disk: typing.Optional[typing.List["SiteRecoveryReplicatedVmManagedDisk"]] = None,
        network_interface: typing.Optional[typing.List["SiteRecoveryReplicatedVmNetworkInterface"]] = None,
        target_availability_set_id: typing.Optional[builtins.str] = None,
        target_network_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["SiteRecoveryReplicatedVmTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param recovery_replication_policy_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_recovery_fabric_name: -
        :param source_recovery_protection_container_name: -
        :param source_vm_id: -
        :param target_recovery_fabric_id: -
        :param target_recovery_protection_container_id: -
        :param target_resource_group_id: -
        :param managed_disk: -
        :param network_interface: -
        :param target_availability_set_id: -
        :param target_network_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SiteRecoveryReplicatedVmConfig(
            name=name,
            recovery_replication_policy_id=recovery_replication_policy_id,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            source_recovery_fabric_name=source_recovery_fabric_name,
            source_recovery_protection_container_name=source_recovery_protection_container_name,
            source_vm_id=source_vm_id,
            target_recovery_fabric_id=target_recovery_fabric_id,
            target_recovery_protection_container_id=target_recovery_protection_container_id,
            target_resource_group_id=target_resource_group_id,
            managed_disk=managed_disk,
            network_interface=network_interface,
            target_availability_set_id=target_availability_set_id,
            target_network_id=target_network_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SiteRecoveryReplicatedVm, self, [scope, id, config])

    @jsii.member(jsii_name="resetManagedDisk")
    def reset_managed_disk(self) -> None:
        return jsii.invoke(self, "resetManagedDisk", [])

    @jsii.member(jsii_name="resetNetworkInterface")
    def reset_network_interface(self) -> None:
        return jsii.invoke(self, "resetNetworkInterface", [])

    @jsii.member(jsii_name="resetTargetAvailabilitySetId")
    def reset_target_availability_set_id(self) -> None:
        return jsii.invoke(self, "resetTargetAvailabilitySetId", [])

    @jsii.member(jsii_name="resetTargetNetworkId")
    def reset_target_network_id(self) -> None:
        return jsii.invoke(self, "resetTargetNetworkId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryReplicationPolicyIdInput")
    def recovery_replication_policy_id_input(self) -> builtins.str:
        return jsii.get(self, "recoveryReplicationPolicyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceRecoveryFabricNameInput")
    def source_recovery_fabric_name_input(self) -> builtins.str:
        return jsii.get(self, "sourceRecoveryFabricNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceRecoveryProtectionContainerNameInput")
    def source_recovery_protection_container_name_input(self) -> builtins.str:
        return jsii.get(self, "sourceRecoveryProtectionContainerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVmIdInput")
    def source_vm_id_input(self) -> builtins.str:
        return jsii.get(self, "sourceVmIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRecoveryFabricIdInput")
    def target_recovery_fabric_id_input(self) -> builtins.str:
        return jsii.get(self, "targetRecoveryFabricIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRecoveryProtectionContainerIdInput")
    def target_recovery_protection_container_id_input(self) -> builtins.str:
        return jsii.get(self, "targetRecoveryProtectionContainerIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceGroupIdInput")
    def target_resource_group_id_input(self) -> builtins.str:
        return jsii.get(self, "targetResourceGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDiskInput")
    def managed_disk_input(
        self,
    ) -> typing.Optional[typing.List["SiteRecoveryReplicatedVmManagedDisk"]]:
        return jsii.get(self, "managedDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceInput")
    def network_interface_input(
        self,
    ) -> typing.Optional[typing.List["SiteRecoveryReplicatedVmNetworkInterface"]]:
        return jsii.get(self, "networkInterfaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetAvailabilitySetIdInput")
    def target_availability_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetAvailabilitySetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetNetworkIdInput")
    def target_network_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SiteRecoveryReplicatedVmTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDisk")
    def managed_disk(self) -> typing.List["SiteRecoveryReplicatedVmManagedDisk"]:
        return jsii.get(self, "managedDisk")

    @managed_disk.setter # type: ignore
    def managed_disk(
        self,
        value: typing.List["SiteRecoveryReplicatedVmManagedDisk"],
    ) -> None:
        jsii.set(self, "managedDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterface")
    def network_interface(
        self,
    ) -> typing.List["SiteRecoveryReplicatedVmNetworkInterface"]:
        return jsii.get(self, "networkInterface")

    @network_interface.setter # type: ignore
    def network_interface(
        self,
        value: typing.List["SiteRecoveryReplicatedVmNetworkInterface"],
    ) -> None:
        jsii.set(self, "networkInterface", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryReplicationPolicyId")
    def recovery_replication_policy_id(self) -> builtins.str:
        return jsii.get(self, "recoveryReplicationPolicyId")

    @recovery_replication_policy_id.setter # type: ignore
    def recovery_replication_policy_id(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryReplicationPolicyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceRecoveryFabricName")
    def source_recovery_fabric_name(self) -> builtins.str:
        return jsii.get(self, "sourceRecoveryFabricName")

    @source_recovery_fabric_name.setter # type: ignore
    def source_recovery_fabric_name(self, value: builtins.str) -> None:
        jsii.set(self, "sourceRecoveryFabricName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceRecoveryProtectionContainerName")
    def source_recovery_protection_container_name(self) -> builtins.str:
        return jsii.get(self, "sourceRecoveryProtectionContainerName")

    @source_recovery_protection_container_name.setter # type: ignore
    def source_recovery_protection_container_name(self, value: builtins.str) -> None:
        jsii.set(self, "sourceRecoveryProtectionContainerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceVmId")
    def source_vm_id(self) -> builtins.str:
        return jsii.get(self, "sourceVmId")

    @source_vm_id.setter # type: ignore
    def source_vm_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceVmId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetAvailabilitySetId")
    def target_availability_set_id(self) -> builtins.str:
        return jsii.get(self, "targetAvailabilitySetId")

    @target_availability_set_id.setter # type: ignore
    def target_availability_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetAvailabilitySetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetNetworkId")
    def target_network_id(self) -> builtins.str:
        return jsii.get(self, "targetNetworkId")

    @target_network_id.setter # type: ignore
    def target_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetNetworkId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRecoveryFabricId")
    def target_recovery_fabric_id(self) -> builtins.str:
        return jsii.get(self, "targetRecoveryFabricId")

    @target_recovery_fabric_id.setter # type: ignore
    def target_recovery_fabric_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetRecoveryFabricId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetRecoveryProtectionContainerId")
    def target_recovery_protection_container_id(self) -> builtins.str:
        return jsii.get(self, "targetRecoveryProtectionContainerId")

    @target_recovery_protection_container_id.setter # type: ignore
    def target_recovery_protection_container_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetRecoveryProtectionContainerId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceGroupId")
    def target_resource_group_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceGroupId")

    @target_resource_group_id.setter # type: ignore
    def target_resource_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SiteRecoveryReplicatedVmTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SiteRecoveryReplicatedVmTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryReplicatedVmConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "recovery_replication_policy_id": "recoveryReplicationPolicyId",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "source_recovery_fabric_name": "sourceRecoveryFabricName",
        "source_recovery_protection_container_name": "sourceRecoveryProtectionContainerName",
        "source_vm_id": "sourceVmId",
        "target_recovery_fabric_id": "targetRecoveryFabricId",
        "target_recovery_protection_container_id": "targetRecoveryProtectionContainerId",
        "target_resource_group_id": "targetResourceGroupId",
        "managed_disk": "managedDisk",
        "network_interface": "networkInterface",
        "target_availability_set_id": "targetAvailabilitySetId",
        "target_network_id": "targetNetworkId",
        "timeouts": "timeouts",
    },
)
class SiteRecoveryReplicatedVmConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        recovery_replication_policy_id: builtins.str,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        source_recovery_fabric_name: builtins.str,
        source_recovery_protection_container_name: builtins.str,
        source_vm_id: builtins.str,
        target_recovery_fabric_id: builtins.str,
        target_recovery_protection_container_id: builtins.str,
        target_resource_group_id: builtins.str,
        managed_disk: typing.Optional[typing.List["SiteRecoveryReplicatedVmManagedDisk"]] = None,
        network_interface: typing.Optional[typing.List["SiteRecoveryReplicatedVmNetworkInterface"]] = None,
        target_availability_set_id: typing.Optional[builtins.str] = None,
        target_network_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["SiteRecoveryReplicatedVmTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param recovery_replication_policy_id: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param source_recovery_fabric_name: -
        :param source_recovery_protection_container_name: -
        :param source_vm_id: -
        :param target_recovery_fabric_id: -
        :param target_recovery_protection_container_id: -
        :param target_resource_group_id: -
        :param managed_disk: -
        :param network_interface: -
        :param target_availability_set_id: -
        :param target_network_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SiteRecoveryReplicatedVmTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "recovery_replication_policy_id": recovery_replication_policy_id,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
            "source_recovery_fabric_name": source_recovery_fabric_name,
            "source_recovery_protection_container_name": source_recovery_protection_container_name,
            "source_vm_id": source_vm_id,
            "target_recovery_fabric_id": target_recovery_fabric_id,
            "target_recovery_protection_container_id": target_recovery_protection_container_id,
            "target_resource_group_id": target_resource_group_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if managed_disk is not None:
            self._values["managed_disk"] = managed_disk
        if network_interface is not None:
            self._values["network_interface"] = network_interface
        if target_availability_set_id is not None:
            self._values["target_availability_set_id"] = target_availability_set_id
        if target_network_id is not None:
            self._values["target_network_id"] = target_network_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_replication_policy_id(self) -> builtins.str:
        result = self._values.get("recovery_replication_policy_id")
        assert result is not None, "Required property 'recovery_replication_policy_id' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def source_recovery_fabric_name(self) -> builtins.str:
        result = self._values.get("source_recovery_fabric_name")
        assert result is not None, "Required property 'source_recovery_fabric_name' is missing"
        return result

    @builtins.property
    def source_recovery_protection_container_name(self) -> builtins.str:
        result = self._values.get("source_recovery_protection_container_name")
        assert result is not None, "Required property 'source_recovery_protection_container_name' is missing"
        return result

    @builtins.property
    def source_vm_id(self) -> builtins.str:
        result = self._values.get("source_vm_id")
        assert result is not None, "Required property 'source_vm_id' is missing"
        return result

    @builtins.property
    def target_recovery_fabric_id(self) -> builtins.str:
        result = self._values.get("target_recovery_fabric_id")
        assert result is not None, "Required property 'target_recovery_fabric_id' is missing"
        return result

    @builtins.property
    def target_recovery_protection_container_id(self) -> builtins.str:
        result = self._values.get("target_recovery_protection_container_id")
        assert result is not None, "Required property 'target_recovery_protection_container_id' is missing"
        return result

    @builtins.property
    def target_resource_group_id(self) -> builtins.str:
        result = self._values.get("target_resource_group_id")
        assert result is not None, "Required property 'target_resource_group_id' is missing"
        return result

    @builtins.property
    def managed_disk(
        self,
    ) -> typing.Optional[typing.List["SiteRecoveryReplicatedVmManagedDisk"]]:
        result = self._values.get("managed_disk")
        return result

    @builtins.property
    def network_interface(
        self,
    ) -> typing.Optional[typing.List["SiteRecoveryReplicatedVmNetworkInterface"]]:
        result = self._values.get("network_interface")
        return result

    @builtins.property
    def target_availability_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_availability_set_id")
        return result

    @builtins.property
    def target_network_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_network_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SiteRecoveryReplicatedVmTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryReplicatedVmConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryReplicatedVmManagedDisk",
    jsii_struct_bases=[],
    name_mapping={
        "disk_id": "diskId",
        "staging_storage_account_id": "stagingStorageAccountId",
        "target_disk_type": "targetDiskType",
        "target_replica_disk_type": "targetReplicaDiskType",
        "target_resource_group_id": "targetResourceGroupId",
    },
)
class SiteRecoveryReplicatedVmManagedDisk:
    def __init__(
        self,
        *,
        disk_id: typing.Optional[builtins.str] = None,
        staging_storage_account_id: typing.Optional[builtins.str] = None,
        target_disk_type: typing.Optional[builtins.str] = None,
        target_replica_disk_type: typing.Optional[builtins.str] = None,
        target_resource_group_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param disk_id: -
        :param staging_storage_account_id: -
        :param target_disk_type: -
        :param target_replica_disk_type: -
        :param target_resource_group_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if disk_id is not None:
            self._values["disk_id"] = disk_id
        if staging_storage_account_id is not None:
            self._values["staging_storage_account_id"] = staging_storage_account_id
        if target_disk_type is not None:
            self._values["target_disk_type"] = target_disk_type
        if target_replica_disk_type is not None:
            self._values["target_replica_disk_type"] = target_replica_disk_type
        if target_resource_group_id is not None:
            self._values["target_resource_group_id"] = target_resource_group_id

    @builtins.property
    def disk_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_id")
        return result

    @builtins.property
    def staging_storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("staging_storage_account_id")
        return result

    @builtins.property
    def target_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_disk_type")
        return result

    @builtins.property
    def target_replica_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_replica_disk_type")
        return result

    @builtins.property
    def target_resource_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_resource_group_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryReplicatedVmManagedDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryReplicatedVmNetworkInterface",
    jsii_struct_bases=[],
    name_mapping={
        "source_network_interface_id": "sourceNetworkInterfaceId",
        "target_static_ip": "targetStaticIp",
        "target_subnet_name": "targetSubnetName",
    },
)
class SiteRecoveryReplicatedVmNetworkInterface:
    def __init__(
        self,
        *,
        source_network_interface_id: typing.Optional[builtins.str] = None,
        target_static_ip: typing.Optional[builtins.str] = None,
        target_subnet_name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param source_network_interface_id: -
        :param target_static_ip: -
        :param target_subnet_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if source_network_interface_id is not None:
            self._values["source_network_interface_id"] = source_network_interface_id
        if target_static_ip is not None:
            self._values["target_static_ip"] = target_static_ip
        if target_subnet_name is not None:
            self._values["target_subnet_name"] = target_subnet_name

    @builtins.property
    def source_network_interface_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_network_interface_id")
        return result

    @builtins.property
    def target_static_ip(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_static_ip")
        return result

    @builtins.property
    def target_subnet_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_subnet_name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryReplicatedVmNetworkInterface(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryReplicatedVmTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SiteRecoveryReplicatedVmTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryReplicatedVmTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SiteRecoveryReplicationPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SiteRecoveryReplicationPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_consistent_snapshot_frequency_in_minutes: jsii.Number,
        name: builtins.str,
        recovery_point_retention_in_minutes: jsii.Number,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryReplicationPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_consistent_snapshot_frequency_in_minutes: -
        :param name: -
        :param recovery_point_retention_in_minutes: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SiteRecoveryReplicationPolicyConfig(
            application_consistent_snapshot_frequency_in_minutes=application_consistent_snapshot_frequency_in_minutes,
            name=name,
            recovery_point_retention_in_minutes=recovery_point_retention_in_minutes,
            recovery_vault_name=recovery_vault_name,
            resource_group_name=resource_group_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SiteRecoveryReplicationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationConsistentSnapshotFrequencyInMinutesInput")
    def application_consistent_snapshot_frequency_in_minutes_input(self) -> jsii.Number:
        return jsii.get(self, "applicationConsistentSnapshotFrequencyInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryPointRetentionInMinutesInput")
    def recovery_point_retention_in_minutes_input(self) -> jsii.Number:
        return jsii.get(self, "recoveryPointRetentionInMinutesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultNameInput")
    def recovery_vault_name_input(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SiteRecoveryReplicationPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationConsistentSnapshotFrequencyInMinutes")
    def application_consistent_snapshot_frequency_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "applicationConsistentSnapshotFrequencyInMinutes")

    @application_consistent_snapshot_frequency_in_minutes.setter # type: ignore
    def application_consistent_snapshot_frequency_in_minutes(
        self,
        value: jsii.Number,
    ) -> None:
        jsii.set(self, "applicationConsistentSnapshotFrequencyInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryPointRetentionInMinutes")
    def recovery_point_retention_in_minutes(self) -> jsii.Number:
        return jsii.get(self, "recoveryPointRetentionInMinutes")

    @recovery_point_retention_in_minutes.setter # type: ignore
    def recovery_point_retention_in_minutes(self, value: jsii.Number) -> None:
        jsii.set(self, "recoveryPointRetentionInMinutes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryVaultName")
    def recovery_vault_name(self) -> builtins.str:
        return jsii.get(self, "recoveryVaultName")

    @recovery_vault_name.setter # type: ignore
    def recovery_vault_name(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryVaultName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SiteRecoveryReplicationPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SiteRecoveryReplicationPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryReplicationPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_consistent_snapshot_frequency_in_minutes": "applicationConsistentSnapshotFrequencyInMinutes",
        "name": "name",
        "recovery_point_retention_in_minutes": "recoveryPointRetentionInMinutes",
        "recovery_vault_name": "recoveryVaultName",
        "resource_group_name": "resourceGroupName",
        "timeouts": "timeouts",
    },
)
class SiteRecoveryReplicationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_consistent_snapshot_frequency_in_minutes: jsii.Number,
        name: builtins.str,
        recovery_point_retention_in_minutes: jsii.Number,
        recovery_vault_name: builtins.str,
        resource_group_name: builtins.str,
        timeouts: typing.Optional["SiteRecoveryReplicationPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_consistent_snapshot_frequency_in_minutes: -
        :param name: -
        :param recovery_point_retention_in_minutes: -
        :param recovery_vault_name: -
        :param resource_group_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SiteRecoveryReplicationPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_consistent_snapshot_frequency_in_minutes": application_consistent_snapshot_frequency_in_minutes,
            "name": name,
            "recovery_point_retention_in_minutes": recovery_point_retention_in_minutes,
            "recovery_vault_name": recovery_vault_name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_consistent_snapshot_frequency_in_minutes(self) -> jsii.Number:
        result = self._values.get("application_consistent_snapshot_frequency_in_minutes")
        assert result is not None, "Required property 'application_consistent_snapshot_frequency_in_minutes' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def recovery_point_retention_in_minutes(self) -> jsii.Number:
        result = self._values.get("recovery_point_retention_in_minutes")
        assert result is not None, "Required property 'recovery_point_retention_in_minutes' is missing"
        return result

    @builtins.property
    def recovery_vault_name(self) -> builtins.str:
        result = self._values.get("recovery_vault_name")
        assert result is not None, "Required property 'recovery_vault_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SiteRecoveryReplicationPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryReplicationPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SiteRecoveryReplicationPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SiteRecoveryReplicationPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SiteRecoveryReplicationPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Snapshot(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Snapshot",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        create_option: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        encryption_settings: typing.Optional[typing.List["SnapshotEncryptionSettings"]] = None,
        source_resource_id: typing.Optional[builtins.str] = None,
        source_uri: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SnapshotTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param create_option: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param disk_size_gb: -
        :param encryption_settings: encryption_settings block.
        :param source_resource_id: -
        :param source_uri: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SnapshotConfig(
            create_option=create_option,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            disk_size_gb=disk_size_gb,
            encryption_settings=encryption_settings,
            source_resource_id=source_resource_id,
            source_uri=source_uri,
            storage_account_id=storage_account_id,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Snapshot, self, [scope, id, config])

    @jsii.member(jsii_name="resetDiskSizeGb")
    def reset_disk_size_gb(self) -> None:
        return jsii.invoke(self, "resetDiskSizeGb", [])

    @jsii.member(jsii_name="resetEncryptionSettings")
    def reset_encryption_settings(self) -> None:
        return jsii.invoke(self, "resetEncryptionSettings", [])

    @jsii.member(jsii_name="resetSourceResourceId")
    def reset_source_resource_id(self) -> None:
        return jsii.invoke(self, "resetSourceResourceId", [])

    @jsii.member(jsii_name="resetSourceUri")
    def reset_source_uri(self) -> None:
        return jsii.invoke(self, "resetSourceUri", [])

    @jsii.member(jsii_name="resetStorageAccountId")
    def reset_storage_account_id(self) -> None:
        return jsii.invoke(self, "resetStorageAccountId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createOptionInput")
    def create_option_input(self) -> builtins.str:
        return jsii.get(self, "createOptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskSizeGbInput")
    def disk_size_gb_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "diskSizeGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionSettingsInput")
    def encryption_settings_input(
        self,
    ) -> typing.Optional[typing.List["SnapshotEncryptionSettings"]]:
        return jsii.get(self, "encryptionSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceResourceIdInput")
    def source_resource_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUriInput")
    def source_uri_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SnapshotTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createOption")
    def create_option(self) -> builtins.str:
        return jsii.get(self, "createOption")

    @create_option.setter # type: ignore
    def create_option(self, value: builtins.str) -> None:
        jsii.set(self, "createOption", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @disk_size_gb.setter # type: ignore
    def disk_size_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "diskSizeGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionSettings")
    def encryption_settings(self) -> typing.List["SnapshotEncryptionSettings"]:
        return jsii.get(self, "encryptionSettings")

    @encryption_settings.setter # type: ignore
    def encryption_settings(
        self,
        value: typing.List["SnapshotEncryptionSettings"],
    ) -> None:
        jsii.set(self, "encryptionSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceResourceId")
    def source_resource_id(self) -> builtins.str:
        return jsii.get(self, "sourceResourceId")

    @source_resource_id.setter # type: ignore
    def source_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUri")
    def source_uri(self) -> builtins.str:
        return jsii.get(self, "sourceUri")

    @source_uri.setter # type: ignore
    def source_uri(self, value: builtins.str) -> None:
        jsii.set(self, "sourceUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SnapshotTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SnapshotTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SnapshotConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "create_option": "createOption",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "disk_size_gb": "diskSizeGb",
        "encryption_settings": "encryptionSettings",
        "source_resource_id": "sourceResourceId",
        "source_uri": "sourceUri",
        "storage_account_id": "storageAccountId",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SnapshotConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        create_option: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        encryption_settings: typing.Optional[typing.List["SnapshotEncryptionSettings"]] = None,
        source_resource_id: typing.Optional[builtins.str] = None,
        source_uri: typing.Optional[builtins.str] = None,
        storage_account_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SnapshotTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param create_option: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param disk_size_gb: -
        :param encryption_settings: encryption_settings block.
        :param source_resource_id: -
        :param source_uri: -
        :param storage_account_id: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SnapshotTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "create_option": create_option,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if encryption_settings is not None:
            self._values["encryption_settings"] = encryption_settings
        if source_resource_id is not None:
            self._values["source_resource_id"] = source_resource_id
        if source_uri is not None:
            self._values["source_uri"] = source_uri
        if storage_account_id is not None:
            self._values["storage_account_id"] = storage_account_id
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def create_option(self) -> builtins.str:
        result = self._values.get("create_option")
        assert result is not None, "Required property 'create_option' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def encryption_settings(
        self,
    ) -> typing.Optional[typing.List["SnapshotEncryptionSettings"]]:
        """encryption_settings block."""
        result = self._values.get("encryption_settings")
        return result

    @builtins.property
    def source_resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_resource_id")
        return result

    @builtins.property
    def source_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_uri")
        return result

    @builtins.property
    def storage_account_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SnapshotTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SnapshotConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SnapshotEncryptionSettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "disk_encryption_key": "diskEncryptionKey",
        "key_encryption_key": "keyEncryptionKey",
    },
)
class SnapshotEncryptionSettings:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        disk_encryption_key: typing.Optional[typing.List["SnapshotEncryptionSettingsDiskEncryptionKey"]] = None,
        key_encryption_key: typing.Optional[typing.List["SnapshotEncryptionSettingsKeyEncryptionKey"]] = None,
    ) -> None:
        """
        :param enabled: -
        :param disk_encryption_key: disk_encryption_key block.
        :param key_encryption_key: key_encryption_key block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if disk_encryption_key is not None:
            self._values["disk_encryption_key"] = disk_encryption_key
        if key_encryption_key is not None:
            self._values["key_encryption_key"] = key_encryption_key

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def disk_encryption_key(
        self,
    ) -> typing.Optional[typing.List["SnapshotEncryptionSettingsDiskEncryptionKey"]]:
        """disk_encryption_key block."""
        result = self._values.get("disk_encryption_key")
        return result

    @builtins.property
    def key_encryption_key(
        self,
    ) -> typing.Optional[typing.List["SnapshotEncryptionSettingsKeyEncryptionKey"]]:
        """key_encryption_key block."""
        result = self._values.get("key_encryption_key")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SnapshotEncryptionSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SnapshotEncryptionSettingsDiskEncryptionKey",
    jsii_struct_bases=[],
    name_mapping={"secret_url": "secretUrl", "source_vault_id": "sourceVaultId"},
)
class SnapshotEncryptionSettingsDiskEncryptionKey:
    def __init__(
        self,
        *,
        secret_url: builtins.str,
        source_vault_id: builtins.str,
    ) -> None:
        """
        :param secret_url: -
        :param source_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "secret_url": secret_url,
            "source_vault_id": source_vault_id,
        }

    @builtins.property
    def secret_url(self) -> builtins.str:
        result = self._values.get("secret_url")
        assert result is not None, "Required property 'secret_url' is missing"
        return result

    @builtins.property
    def source_vault_id(self) -> builtins.str:
        result = self._values.get("source_vault_id")
        assert result is not None, "Required property 'source_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SnapshotEncryptionSettingsDiskEncryptionKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SnapshotEncryptionSettingsKeyEncryptionKey",
    jsii_struct_bases=[],
    name_mapping={"key_url": "keyUrl", "source_vault_id": "sourceVaultId"},
)
class SnapshotEncryptionSettingsKeyEncryptionKey:
    def __init__(self, *, key_url: builtins.str, source_vault_id: builtins.str) -> None:
        """
        :param key_url: -
        :param source_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key_url": key_url,
            "source_vault_id": source_vault_id,
        }

    @builtins.property
    def key_url(self) -> builtins.str:
        result = self._values.get("key_url")
        assert result is not None, "Required property 'key_url' is missing"
        return result

    @builtins.property
    def source_vault_id(self) -> builtins.str:
        result = self._values.get("source_vault_id")
        assert result is not None, "Required property 'source_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SnapshotEncryptionSettingsKeyEncryptionKey(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SnapshotTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SnapshotTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SnapshotTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SpatialAnchorsAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SpatialAnchorsAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SpatialAnchorsAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpatialAnchorsAccountConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SpatialAnchorsAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SpatialAnchorsAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SpatialAnchorsAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SpatialAnchorsAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SpatialAnchorsAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SpatialAnchorsAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SpatialAnchorsAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SpatialAnchorsAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SpatialAnchorsAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpatialAnchorsAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpatialAnchorsAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SpatialAnchorsAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpatialAnchorsAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SpringCloudApp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SpringCloudApp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        identity: typing.Optional[typing.List["SpringCloudAppIdentity"]] = None,
        timeouts: typing.Optional["SpringCloudAppTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param identity: identity block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpringCloudAppConfig(
            name=name,
            resource_group_name=resource_group_name,
            service_name=service_name,
            identity=identity,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SpringCloudApp, self, [scope, id, config])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceNameInput")
    def service_name_input(self) -> builtins.str:
        return jsii.get(self, "serviceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["SpringCloudAppIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SpringCloudAppTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["SpringCloudAppIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["SpringCloudAppIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> builtins.str:
        return jsii.get(self, "serviceName")

    @service_name.setter # type: ignore
    def service_name(self, value: builtins.str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SpringCloudAppTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SpringCloudAppTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SpringCloudAppConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "service_name": "serviceName",
        "identity": "identity",
        "timeouts": "timeouts",
    },
)
class SpringCloudAppConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        identity: typing.Optional[typing.List["SpringCloudAppIdentity"]] = None,
        timeouts: typing.Optional["SpringCloudAppTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param identity: identity block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SpringCloudAppTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "service_name": service_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if identity is not None:
            self._values["identity"] = identity
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_name(self) -> builtins.str:
        result = self._values.get("service_name")
        assert result is not None, "Required property 'service_name' is missing"
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["SpringCloudAppIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SpringCloudAppTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudAppConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudAppIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class SpringCloudAppIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudAppIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudAppTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SpringCloudAppTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudAppTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SpringCloudCertificate(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SpringCloudCertificate",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_vault_certificate_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        timeouts: typing.Optional["SpringCloudCertificateTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_vault_certificate_id: -
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpringCloudCertificateConfig(
            key_vault_certificate_id=key_vault_certificate_id,
            name=name,
            resource_group_name=resource_group_name,
            service_name=service_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SpringCloudCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultCertificateIdInput")
    def key_vault_certificate_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultCertificateIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceNameInput")
    def service_name_input(self) -> builtins.str:
        return jsii.get(self, "serviceNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SpringCloudCertificateTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultCertificateId")
    def key_vault_certificate_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultCertificateId")

    @key_vault_certificate_id.setter # type: ignore
    def key_vault_certificate_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultCertificateId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> builtins.str:
        return jsii.get(self, "serviceName")

    @service_name.setter # type: ignore
    def service_name(self, value: builtins.str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SpringCloudCertificateTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SpringCloudCertificateTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SpringCloudCertificateConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_vault_certificate_id": "keyVaultCertificateId",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "service_name": "serviceName",
        "timeouts": "timeouts",
    },
)
class SpringCloudCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_vault_certificate_id: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        service_name: builtins.str,
        timeouts: typing.Optional["SpringCloudCertificateTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_vault_certificate_id: -
        :param name: -
        :param resource_group_name: -
        :param service_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SpringCloudCertificateTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_vault_certificate_id": key_vault_certificate_id,
            "name": name,
            "resource_group_name": resource_group_name,
            "service_name": service_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_vault_certificate_id(self) -> builtins.str:
        result = self._values.get("key_vault_certificate_id")
        assert result is not None, "Required property 'key_vault_certificate_id' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def service_name(self) -> builtins.str:
        result = self._values.get("service_name")
        assert result is not None, "Required property 'service_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SpringCloudCertificateTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudCertificateConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudCertificateTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class SpringCloudCertificateTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudCertificateTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SpringCloudService(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SpringCloudService",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        config_server_git_setting: typing.Optional[typing.List["SpringCloudServiceConfigServerGitSetting"]] = None,
        network: typing.Optional[typing.List["SpringCloudServiceNetwork"]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SpringCloudServiceTimeouts"] = None,
        trace: typing.Optional[typing.List["SpringCloudServiceTrace"]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param config_server_git_setting: config_server_git_setting block.
        :param network: network block.
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param trace: trace block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpringCloudServiceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            config_server_git_setting=config_server_git_setting,
            network=network,
            sku_name=sku_name,
            tags=tags,
            timeouts=timeouts,
            trace=trace,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SpringCloudService, self, [scope, id, config])

    @jsii.member(jsii_name="resetConfigServerGitSetting")
    def reset_config_server_git_setting(self) -> None:
        return jsii.invoke(self, "resetConfigServerGitSetting", [])

    @jsii.member(jsii_name="resetNetwork")
    def reset_network(self) -> None:
        return jsii.invoke(self, "resetNetwork", [])

    @jsii.member(jsii_name="resetSkuName")
    def reset_sku_name(self) -> None:
        return jsii.invoke(self, "resetSkuName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTrace")
    def reset_trace(self) -> None:
        return jsii.invoke(self, "resetTrace", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outboundPublicIpAddresses")
    def outbound_public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "outboundPublicIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="configServerGitSettingInput")
    def config_server_git_setting_input(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceConfigServerGitSetting"]]:
        return jsii.get(self, "configServerGitSettingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInput")
    def network_input(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceNetwork"]]:
        return jsii.get(self, "networkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SpringCloudServiceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="traceInput")
    def trace_input(self) -> typing.Optional[typing.List["SpringCloudServiceTrace"]]:
        return jsii.get(self, "traceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="configServerGitSetting")
    def config_server_git_setting(
        self,
    ) -> typing.List["SpringCloudServiceConfigServerGitSetting"]:
        return jsii.get(self, "configServerGitSetting")

    @config_server_git_setting.setter # type: ignore
    def config_server_git_setting(
        self,
        value: typing.List["SpringCloudServiceConfigServerGitSetting"],
    ) -> None:
        jsii.set(self, "configServerGitSetting", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="network")
    def network(self) -> typing.List["SpringCloudServiceNetwork"]:
        return jsii.get(self, "network")

    @network.setter # type: ignore
    def network(self, value: typing.List["SpringCloudServiceNetwork"]) -> None:
        jsii.set(self, "network", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SpringCloudServiceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SpringCloudServiceTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trace")
    def trace(self) -> typing.List["SpringCloudServiceTrace"]:
        return jsii.get(self, "trace")

    @trace.setter # type: ignore
    def trace(self, value: typing.List["SpringCloudServiceTrace"]) -> None:
        jsii.set(self, "trace", value)


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "config_server_git_setting": "configServerGitSetting",
        "network": "network",
        "sku_name": "skuName",
        "tags": "tags",
        "timeouts": "timeouts",
        "trace": "trace",
    },
)
class SpringCloudServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        config_server_git_setting: typing.Optional[typing.List["SpringCloudServiceConfigServerGitSetting"]] = None,
        network: typing.Optional[typing.List["SpringCloudServiceNetwork"]] = None,
        sku_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SpringCloudServiceTimeouts"] = None,
        trace: typing.Optional[typing.List["SpringCloudServiceTrace"]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param config_server_git_setting: config_server_git_setting block.
        :param network: network block.
        :param sku_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param trace: trace block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SpringCloudServiceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if config_server_git_setting is not None:
            self._values["config_server_git_setting"] = config_server_git_setting
        if network is not None:
            self._values["network"] = network
        if sku_name is not None:
            self._values["sku_name"] = sku_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if trace is not None:
            self._values["trace"] = trace

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def config_server_git_setting(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceConfigServerGitSetting"]]:
        """config_server_git_setting block."""
        result = self._values.get("config_server_git_setting")
        return result

    @builtins.property
    def network(self) -> typing.Optional[typing.List["SpringCloudServiceNetwork"]]:
        """network block."""
        result = self._values.get("network")
        return result

    @builtins.property
    def sku_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SpringCloudServiceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def trace(self) -> typing.Optional[typing.List["SpringCloudServiceTrace"]]:
        """trace block."""
        result = self._values.get("trace")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceConfigServerGitSetting",
    jsii_struct_bases=[],
    name_mapping={
        "uri": "uri",
        "http_basic_auth": "httpBasicAuth",
        "label": "label",
        "repository": "repository",
        "search_paths": "searchPaths",
        "ssh_auth": "sshAuth",
    },
)
class SpringCloudServiceConfigServerGitSetting:
    def __init__(
        self,
        *,
        uri: builtins.str,
        http_basic_auth: typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingHttpBasicAuth"]] = None,
        label: typing.Optional[builtins.str] = None,
        repository: typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingRepository"]] = None,
        search_paths: typing.Optional[typing.List[builtins.str]] = None,
        ssh_auth: typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingSshAuth"]] = None,
    ) -> None:
        """
        :param uri: -
        :param http_basic_auth: http_basic_auth block.
        :param label: -
        :param repository: repository block.
        :param search_paths: -
        :param ssh_auth: ssh_auth block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "uri": uri,
        }
        if http_basic_auth is not None:
            self._values["http_basic_auth"] = http_basic_auth
        if label is not None:
            self._values["label"] = label
        if repository is not None:
            self._values["repository"] = repository
        if search_paths is not None:
            self._values["search_paths"] = search_paths
        if ssh_auth is not None:
            self._values["ssh_auth"] = ssh_auth

    @builtins.property
    def uri(self) -> builtins.str:
        result = self._values.get("uri")
        assert result is not None, "Required property 'uri' is missing"
        return result

    @builtins.property
    def http_basic_auth(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingHttpBasicAuth"]]:
        """http_basic_auth block."""
        result = self._values.get("http_basic_auth")
        return result

    @builtins.property
    def label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("label")
        return result

    @builtins.property
    def repository(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingRepository"]]:
        """repository block."""
        result = self._values.get("repository")
        return result

    @builtins.property
    def search_paths(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("search_paths")
        return result

    @builtins.property
    def ssh_auth(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingSshAuth"]]:
        """ssh_auth block."""
        result = self._values.get("ssh_auth")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceConfigServerGitSetting(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceConfigServerGitSettingHttpBasicAuth",
    jsii_struct_bases=[],
    name_mapping={"password": "password", "username": "username"},
)
class SpringCloudServiceConfigServerGitSettingHttpBasicAuth:
    def __init__(self, *, password: builtins.str, username: builtins.str) -> None:
        """
        :param password: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceConfigServerGitSettingHttpBasicAuth(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceConfigServerGitSettingRepository",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "uri": "uri",
        "http_basic_auth": "httpBasicAuth",
        "label": "label",
        "pattern": "pattern",
        "search_paths": "searchPaths",
        "ssh_auth": "sshAuth",
    },
)
class SpringCloudServiceConfigServerGitSettingRepository:
    def __init__(
        self,
        *,
        name: builtins.str,
        uri: builtins.str,
        http_basic_auth: typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth"]] = None,
        label: typing.Optional[builtins.str] = None,
        pattern: typing.Optional[typing.List[builtins.str]] = None,
        search_paths: typing.Optional[typing.List[builtins.str]] = None,
        ssh_auth: typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingRepositorySshAuth"]] = None,
    ) -> None:
        """
        :param name: -
        :param uri: -
        :param http_basic_auth: http_basic_auth block.
        :param label: -
        :param pattern: -
        :param search_paths: -
        :param ssh_auth: ssh_auth block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "uri": uri,
        }
        if http_basic_auth is not None:
            self._values["http_basic_auth"] = http_basic_auth
        if label is not None:
            self._values["label"] = label
        if pattern is not None:
            self._values["pattern"] = pattern
        if search_paths is not None:
            self._values["search_paths"] = search_paths
        if ssh_auth is not None:
            self._values["ssh_auth"] = ssh_auth

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def uri(self) -> builtins.str:
        result = self._values.get("uri")
        assert result is not None, "Required property 'uri' is missing"
        return result

    @builtins.property
    def http_basic_auth(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth"]]:
        """http_basic_auth block."""
        result = self._values.get("http_basic_auth")
        return result

    @builtins.property
    def label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("label")
        return result

    @builtins.property
    def pattern(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("pattern")
        return result

    @builtins.property
    def search_paths(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("search_paths")
        return result

    @builtins.property
    def ssh_auth(
        self,
    ) -> typing.Optional[typing.List["SpringCloudServiceConfigServerGitSettingRepositorySshAuth"]]:
        """ssh_auth block."""
        result = self._values.get("ssh_auth")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceConfigServerGitSettingRepository(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth",
    jsii_struct_bases=[],
    name_mapping={"password": "password", "username": "username"},
)
class SpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth:
    def __init__(self, *, password: builtins.str, username: builtins.str) -> None:
        """
        :param password: -
        :param username: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "password": password,
            "username": username,
        }

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def username(self) -> builtins.str:
        result = self._values.get("username")
        assert result is not None, "Required property 'username' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceConfigServerGitSettingRepositorySshAuth",
    jsii_struct_bases=[],
    name_mapping={
        "private_key": "privateKey",
        "host_key": "hostKey",
        "host_key_algorithm": "hostKeyAlgorithm",
        "strict_host_key_checking_enabled": "strictHostKeyCheckingEnabled",
    },
)
class SpringCloudServiceConfigServerGitSettingRepositorySshAuth:
    def __init__(
        self,
        *,
        private_key: builtins.str,
        host_key: typing.Optional[builtins.str] = None,
        host_key_algorithm: typing.Optional[builtins.str] = None,
        strict_host_key_checking_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param private_key: -
        :param host_key: -
        :param host_key_algorithm: -
        :param strict_host_key_checking_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "private_key": private_key,
        }
        if host_key is not None:
            self._values["host_key"] = host_key
        if host_key_algorithm is not None:
            self._values["host_key_algorithm"] = host_key_algorithm
        if strict_host_key_checking_enabled is not None:
            self._values["strict_host_key_checking_enabled"] = strict_host_key_checking_enabled

    @builtins.property
    def private_key(self) -> builtins.str:
        result = self._values.get("private_key")
        assert result is not None, "Required property 'private_key' is missing"
        return result

    @builtins.property
    def host_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host_key")
        return result

    @builtins.property
    def host_key_algorithm(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host_key_algorithm")
        return result

    @builtins.property
    def strict_host_key_checking_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("strict_host_key_checking_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceConfigServerGitSettingRepositorySshAuth(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceConfigServerGitSettingSshAuth",
    jsii_struct_bases=[],
    name_mapping={
        "private_key": "privateKey",
        "host_key": "hostKey",
        "host_key_algorithm": "hostKeyAlgorithm",
        "strict_host_key_checking_enabled": "strictHostKeyCheckingEnabled",
    },
)
class SpringCloudServiceConfigServerGitSettingSshAuth:
    def __init__(
        self,
        *,
        private_key: builtins.str,
        host_key: typing.Optional[builtins.str] = None,
        host_key_algorithm: typing.Optional[builtins.str] = None,
        strict_host_key_checking_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param private_key: -
        :param host_key: -
        :param host_key_algorithm: -
        :param strict_host_key_checking_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "private_key": private_key,
        }
        if host_key is not None:
            self._values["host_key"] = host_key
        if host_key_algorithm is not None:
            self._values["host_key_algorithm"] = host_key_algorithm
        if strict_host_key_checking_enabled is not None:
            self._values["strict_host_key_checking_enabled"] = strict_host_key_checking_enabled

    @builtins.property
    def private_key(self) -> builtins.str:
        result = self._values.get("private_key")
        assert result is not None, "Required property 'private_key' is missing"
        return result

    @builtins.property
    def host_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host_key")
        return result

    @builtins.property
    def host_key_algorithm(self) -> typing.Optional[builtins.str]:
        result = self._values.get("host_key_algorithm")
        return result

    @builtins.property
    def strict_host_key_checking_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("strict_host_key_checking_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceConfigServerGitSettingSshAuth(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceNetwork",
    jsii_struct_bases=[],
    name_mapping={
        "app_subnet_id": "appSubnetId",
        "cidr_ranges": "cidrRanges",
        "service_runtime_subnet_id": "serviceRuntimeSubnetId",
        "app_network_resource_group": "appNetworkResourceGroup",
        "service_runtime_network_resource_group": "serviceRuntimeNetworkResourceGroup",
    },
)
class SpringCloudServiceNetwork:
    def __init__(
        self,
        *,
        app_subnet_id: builtins.str,
        cidr_ranges: typing.List[builtins.str],
        service_runtime_subnet_id: builtins.str,
        app_network_resource_group: typing.Optional[builtins.str] = None,
        service_runtime_network_resource_group: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param app_subnet_id: -
        :param cidr_ranges: -
        :param service_runtime_subnet_id: -
        :param app_network_resource_group: -
        :param service_runtime_network_resource_group: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "app_subnet_id": app_subnet_id,
            "cidr_ranges": cidr_ranges,
            "service_runtime_subnet_id": service_runtime_subnet_id,
        }
        if app_network_resource_group is not None:
            self._values["app_network_resource_group"] = app_network_resource_group
        if service_runtime_network_resource_group is not None:
            self._values["service_runtime_network_resource_group"] = service_runtime_network_resource_group

    @builtins.property
    def app_subnet_id(self) -> builtins.str:
        result = self._values.get("app_subnet_id")
        assert result is not None, "Required property 'app_subnet_id' is missing"
        return result

    @builtins.property
    def cidr_ranges(self) -> typing.List[builtins.str]:
        result = self._values.get("cidr_ranges")
        assert result is not None, "Required property 'cidr_ranges' is missing"
        return result

    @builtins.property
    def service_runtime_subnet_id(self) -> builtins.str:
        result = self._values.get("service_runtime_subnet_id")
        assert result is not None, "Required property 'service_runtime_subnet_id' is missing"
        return result

    @builtins.property
    def app_network_resource_group(self) -> typing.Optional[builtins.str]:
        result = self._values.get("app_network_resource_group")
        return result

    @builtins.property
    def service_runtime_network_resource_group(self) -> typing.Optional[builtins.str]:
        result = self._values.get("service_runtime_network_resource_group")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceNetwork(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SpringCloudServiceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SpringCloudServiceTrace",
    jsii_struct_bases=[],
    name_mapping={"instrumentation_key": "instrumentationKey"},
)
class SpringCloudServiceTrace:
    def __init__(self, *, instrumentation_key: builtins.str) -> None:
        """
        :param instrumentation_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "instrumentation_key": instrumentation_key,
        }

    @builtins.property
    def instrumentation_key(self) -> builtins.str:
        result = self._values.get("instrumentation_key")
        assert result is not None, "Required property 'instrumentation_key' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SpringCloudServiceTrace(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SqlActiveDirectoryAdministrator(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SqlActiveDirectoryAdministrator",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        login: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["SqlActiveDirectoryAdministratorTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param login: -
        :param object_id: -
        :param resource_group_name: -
        :param server_name: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlActiveDirectoryAdministratorConfig(
            login=login,
            object_id=object_id,
            resource_group_name=resource_group_name,
            server_name=server_name,
            tenant_id=tenant_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SqlActiveDirectoryAdministrator, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loginInput")
    def login_input(self) -> builtins.str:
        return jsii.get(self, "loginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectIdInput")
    def object_id_input(self) -> builtins.str:
        return jsii.get(self, "objectIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> builtins.str:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SqlActiveDirectoryAdministratorTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="login")
    def login(self) -> builtins.str:
        return jsii.get(self, "login")

    @login.setter # type: ignore
    def login(self, value: builtins.str) -> None:
        jsii.set(self, "login", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="objectId")
    def object_id(self) -> builtins.str:
        return jsii.get(self, "objectId")

    @object_id.setter # type: ignore
    def object_id(self, value: builtins.str) -> None:
        jsii.set(self, "objectId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SqlActiveDirectoryAdministratorTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SqlActiveDirectoryAdministratorTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SqlActiveDirectoryAdministratorConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "login": "login",
        "object_id": "objectId",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "tenant_id": "tenantId",
        "timeouts": "timeouts",
    },
)
class SqlActiveDirectoryAdministratorConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        login: builtins.str,
        object_id: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        tenant_id: builtins.str,
        timeouts: typing.Optional["SqlActiveDirectoryAdministratorTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param login: -
        :param object_id: -
        :param resource_group_name: -
        :param server_name: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SqlActiveDirectoryAdministratorTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "login": login,
            "object_id": object_id,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "tenant_id": tenant_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def login(self) -> builtins.str:
        result = self._values.get("login")
        assert result is not None, "Required property 'login' is missing"
        return result

    @builtins.property
    def object_id(self) -> builtins.str:
        result = self._values.get("object_id")
        assert result is not None, "Required property 'object_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def tenant_id(self) -> builtins.str:
        result = self._values.get("tenant_id")
        assert result is not None, "Required property 'tenant_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlActiveDirectoryAdministratorTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlActiveDirectoryAdministratorConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlActiveDirectoryAdministratorTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SqlActiveDirectoryAdministratorTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlActiveDirectoryAdministratorTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SqlDatabase(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SqlDatabase",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        collation: typing.Optional[builtins.str] = None,
        create_mode: typing.Optional[builtins.str] = None,
        edition: typing.Optional[builtins.str] = None,
        elastic_pool_name: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["SqlDatabaseExtendedAuditingPolicy"]] = None,
        import_: typing.Optional[typing.List["SqlDatabaseImport"]] = None,
        max_size_bytes: typing.Optional[builtins.str] = None,
        max_size_gb: typing.Optional[builtins.str] = None,
        read_scale: typing.Optional[builtins.bool] = None,
        requested_service_objective_id: typing.Optional[builtins.str] = None,
        requested_service_objective_name: typing.Optional[builtins.str] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        source_database_deletion_date: typing.Optional[builtins.str] = None,
        source_database_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["SqlDatabaseThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["SqlDatabaseTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param collation: -
        :param create_mode: -
        :param edition: -
        :param elastic_pool_name: -
        :param extended_auditing_policy: -
        :param import_: import block.
        :param max_size_bytes: -
        :param max_size_gb: -
        :param read_scale: -
        :param requested_service_objective_id: -
        :param requested_service_objective_name: -
        :param restore_point_in_time: -
        :param source_database_deletion_date: -
        :param source_database_id: -
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        :param zone_redundant: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlDatabaseConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            collation=collation,
            create_mode=create_mode,
            edition=edition,
            elastic_pool_name=elastic_pool_name,
            extended_auditing_policy=extended_auditing_policy,
            import_=import_,
            max_size_bytes=max_size_bytes,
            max_size_gb=max_size_gb,
            read_scale=read_scale,
            requested_service_objective_id=requested_service_objective_id,
            requested_service_objective_name=requested_service_objective_name,
            restore_point_in_time=restore_point_in_time,
            source_database_deletion_date=source_database_deletion_date,
            source_database_id=source_database_id,
            tags=tags,
            threat_detection_policy=threat_detection_policy,
            timeouts=timeouts,
            zone_redundant=zone_redundant,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="resetCollation")
    def reset_collation(self) -> None:
        return jsii.invoke(self, "resetCollation", [])

    @jsii.member(jsii_name="resetCreateMode")
    def reset_create_mode(self) -> None:
        return jsii.invoke(self, "resetCreateMode", [])

    @jsii.member(jsii_name="resetEdition")
    def reset_edition(self) -> None:
        return jsii.invoke(self, "resetEdition", [])

    @jsii.member(jsii_name="resetElasticPoolName")
    def reset_elastic_pool_name(self) -> None:
        return jsii.invoke(self, "resetElasticPoolName", [])

    @jsii.member(jsii_name="resetExtendedAuditingPolicy")
    def reset_extended_auditing_policy(self) -> None:
        return jsii.invoke(self, "resetExtendedAuditingPolicy", [])

    @jsii.member(jsii_name="resetImport")
    def reset_import(self) -> None:
        return jsii.invoke(self, "resetImport", [])

    @jsii.member(jsii_name="resetMaxSizeBytes")
    def reset_max_size_bytes(self) -> None:
        return jsii.invoke(self, "resetMaxSizeBytes", [])

    @jsii.member(jsii_name="resetMaxSizeGb")
    def reset_max_size_gb(self) -> None:
        return jsii.invoke(self, "resetMaxSizeGb", [])

    @jsii.member(jsii_name="resetReadScale")
    def reset_read_scale(self) -> None:
        return jsii.invoke(self, "resetReadScale", [])

    @jsii.member(jsii_name="resetRequestedServiceObjectiveId")
    def reset_requested_service_objective_id(self) -> None:
        return jsii.invoke(self, "resetRequestedServiceObjectiveId", [])

    @jsii.member(jsii_name="resetRequestedServiceObjectiveName")
    def reset_requested_service_objective_name(self) -> None:
        return jsii.invoke(self, "resetRequestedServiceObjectiveName", [])

    @jsii.member(jsii_name="resetRestorePointInTime")
    def reset_restore_point_in_time(self) -> None:
        return jsii.invoke(self, "resetRestorePointInTime", [])

    @jsii.member(jsii_name="resetSourceDatabaseDeletionDate")
    def reset_source_database_deletion_date(self) -> None:
        return jsii.invoke(self, "resetSourceDatabaseDeletionDate", [])

    @jsii.member(jsii_name="resetSourceDatabaseId")
    def reset_source_database_id(self) -> None:
        return jsii.invoke(self, "resetSourceDatabaseId", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetThreatDetectionPolicy")
    def reset_threat_detection_policy(self) -> None:
        return jsii.invoke(self, "resetThreatDetectionPolicy", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZoneRedundant")
    def reset_zone_redundant(self) -> None:
        return jsii.invoke(self, "resetZoneRedundant", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationDate")
    def creation_date(self) -> builtins.str:
        return jsii.get(self, "creationDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultSecondaryLocation")
    def default_secondary_location(self) -> builtins.str:
        return jsii.get(self, "defaultSecondaryLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryption")
    def encryption(self) -> builtins.str:
        return jsii.get(self, "encryption")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collationInput")
    def collation_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "collationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createModeInput")
    def create_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="editionInput")
    def edition_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "editionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="elasticPoolNameInput")
    def elastic_pool_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "elasticPoolNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicyInput")
    def extended_auditing_policy_input(
        self,
    ) -> typing.Optional[typing.List["SqlDatabaseExtendedAuditingPolicy"]]:
        return jsii.get(self, "extendedAuditingPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="importInput")
    def import_input(self) -> typing.Optional[typing.List["SqlDatabaseImport"]]:
        return jsii.get(self, "importInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeBytesInput")
    def max_size_bytes_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "maxSizeBytesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGbInput")
    def max_size_gb_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "maxSizeGbInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readScaleInput")
    def read_scale_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "readScaleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestedServiceObjectiveIdInput")
    def requested_service_objective_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "requestedServiceObjectiveIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestedServiceObjectiveNameInput")
    def requested_service_objective_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "requestedServiceObjectiveNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTimeInput")
    def restore_point_in_time_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "restorePointInTimeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceDatabaseDeletionDateInput")
    def source_database_deletion_date_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceDatabaseDeletionDateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceDatabaseIdInput")
    def source_database_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceDatabaseIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicyInput")
    def threat_detection_policy_input(
        self,
    ) -> typing.Optional[typing.List["SqlDatabaseThreatDetectionPolicy"]]:
        return jsii.get(self, "threatDetectionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SqlDatabaseTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundantInput")
    def zone_redundant_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneRedundantInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @collation.setter # type: ignore
    def collation(self, value: builtins.str) -> None:
        jsii.set(self, "collation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createMode")
    def create_mode(self) -> builtins.str:
        return jsii.get(self, "createMode")

    @create_mode.setter # type: ignore
    def create_mode(self, value: builtins.str) -> None:
        jsii.set(self, "createMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="edition")
    def edition(self) -> builtins.str:
        return jsii.get(self, "edition")

    @edition.setter # type: ignore
    def edition(self, value: builtins.str) -> None:
        jsii.set(self, "edition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="elasticPoolName")
    def elastic_pool_name(self) -> builtins.str:
        return jsii.get(self, "elasticPoolName")

    @elastic_pool_name.setter # type: ignore
    def elastic_pool_name(self, value: builtins.str) -> None:
        jsii.set(self, "elasticPoolName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicy")
    def extended_auditing_policy(
        self,
    ) -> typing.List["SqlDatabaseExtendedAuditingPolicy"]:
        return jsii.get(self, "extendedAuditingPolicy")

    @extended_auditing_policy.setter # type: ignore
    def extended_auditing_policy(
        self,
        value: typing.List["SqlDatabaseExtendedAuditingPolicy"],
    ) -> None:
        jsii.set(self, "extendedAuditingPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="import")
    def import_(self) -> typing.List["SqlDatabaseImport"]:
        return jsii.get(self, "import")

    @import_.setter # type: ignore
    def import_(self, value: typing.List["SqlDatabaseImport"]) -> None:
        jsii.set(self, "import", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeBytes")
    def max_size_bytes(self) -> builtins.str:
        return jsii.get(self, "maxSizeBytes")

    @max_size_bytes.setter # type: ignore
    def max_size_bytes(self, value: builtins.str) -> None:
        jsii.set(self, "maxSizeBytes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxSizeGb")
    def max_size_gb(self) -> builtins.str:
        return jsii.get(self, "maxSizeGb")

    @max_size_gb.setter # type: ignore
    def max_size_gb(self, value: builtins.str) -> None:
        jsii.set(self, "maxSizeGb", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readScale")
    def read_scale(self) -> builtins.bool:
        return jsii.get(self, "readScale")

    @read_scale.setter # type: ignore
    def read_scale(self, value: builtins.bool) -> None:
        jsii.set(self, "readScale", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestedServiceObjectiveId")
    def requested_service_objective_id(self) -> builtins.str:
        return jsii.get(self, "requestedServiceObjectiveId")

    @requested_service_objective_id.setter # type: ignore
    def requested_service_objective_id(self, value: builtins.str) -> None:
        jsii.set(self, "requestedServiceObjectiveId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="requestedServiceObjectiveName")
    def requested_service_objective_name(self) -> builtins.str:
        return jsii.get(self, "requestedServiceObjectiveName")

    @requested_service_objective_name.setter # type: ignore
    def requested_service_objective_name(self, value: builtins.str) -> None:
        jsii.set(self, "requestedServiceObjectiveName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restorePointInTime")
    def restore_point_in_time(self) -> builtins.str:
        return jsii.get(self, "restorePointInTime")

    @restore_point_in_time.setter # type: ignore
    def restore_point_in_time(self, value: builtins.str) -> None:
        jsii.set(self, "restorePointInTime", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceDatabaseDeletionDate")
    def source_database_deletion_date(self) -> builtins.str:
        return jsii.get(self, "sourceDatabaseDeletionDate")

    @source_database_deletion_date.setter # type: ignore
    def source_database_deletion_date(self, value: builtins.str) -> None:
        jsii.set(self, "sourceDatabaseDeletionDate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceDatabaseId")
    def source_database_id(self) -> builtins.str:
        return jsii.get(self, "sourceDatabaseId")

    @source_database_id.setter # type: ignore
    def source_database_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceDatabaseId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="threatDetectionPolicy")
    def threat_detection_policy(
        self,
    ) -> typing.List["SqlDatabaseThreatDetectionPolicy"]:
        return jsii.get(self, "threatDetectionPolicy")

    @threat_detection_policy.setter # type: ignore
    def threat_detection_policy(
        self,
        value: typing.List["SqlDatabaseThreatDetectionPolicy"],
    ) -> None:
        jsii.set(self, "threatDetectionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SqlDatabaseTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SqlDatabaseTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneRedundant")
    def zone_redundant(self) -> builtins.bool:
        return jsii.get(self, "zoneRedundant")

    @zone_redundant.setter # type: ignore
    def zone_redundant(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneRedundant", value)


@jsii.data_type(
    jsii_type="azurerm.SqlDatabaseConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "collation": "collation",
        "create_mode": "createMode",
        "edition": "edition",
        "elastic_pool_name": "elasticPoolName",
        "extended_auditing_policy": "extendedAuditingPolicy",
        "import_": "import",
        "max_size_bytes": "maxSizeBytes",
        "max_size_gb": "maxSizeGb",
        "read_scale": "readScale",
        "requested_service_objective_id": "requestedServiceObjectiveId",
        "requested_service_objective_name": "requestedServiceObjectiveName",
        "restore_point_in_time": "restorePointInTime",
        "source_database_deletion_date": "sourceDatabaseDeletionDate",
        "source_database_id": "sourceDatabaseId",
        "tags": "tags",
        "threat_detection_policy": "threatDetectionPolicy",
        "timeouts": "timeouts",
        "zone_redundant": "zoneRedundant",
    },
)
class SqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        collation: typing.Optional[builtins.str] = None,
        create_mode: typing.Optional[builtins.str] = None,
        edition: typing.Optional[builtins.str] = None,
        elastic_pool_name: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["SqlDatabaseExtendedAuditingPolicy"]] = None,
        import_: typing.Optional[typing.List["SqlDatabaseImport"]] = None,
        max_size_bytes: typing.Optional[builtins.str] = None,
        max_size_gb: typing.Optional[builtins.str] = None,
        read_scale: typing.Optional[builtins.bool] = None,
        requested_service_objective_id: typing.Optional[builtins.str] = None,
        requested_service_objective_name: typing.Optional[builtins.str] = None,
        restore_point_in_time: typing.Optional[builtins.str] = None,
        source_database_deletion_date: typing.Optional[builtins.str] = None,
        source_database_id: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        threat_detection_policy: typing.Optional[typing.List["SqlDatabaseThreatDetectionPolicy"]] = None,
        timeouts: typing.Optional["SqlDatabaseTimeouts"] = None,
        zone_redundant: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param collation: -
        :param create_mode: -
        :param edition: -
        :param elastic_pool_name: -
        :param extended_auditing_policy: -
        :param import_: import block.
        :param max_size_bytes: -
        :param max_size_gb: -
        :param read_scale: -
        :param requested_service_objective_id: -
        :param requested_service_objective_name: -
        :param restore_point_in_time: -
        :param source_database_deletion_date: -
        :param source_database_id: -
        :param tags: -
        :param threat_detection_policy: threat_detection_policy block.
        :param timeouts: timeouts block.
        :param zone_redundant: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SqlDatabaseTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if collation is not None:
            self._values["collation"] = collation
        if create_mode is not None:
            self._values["create_mode"] = create_mode
        if edition is not None:
            self._values["edition"] = edition
        if elastic_pool_name is not None:
            self._values["elastic_pool_name"] = elastic_pool_name
        if extended_auditing_policy is not None:
            self._values["extended_auditing_policy"] = extended_auditing_policy
        if import_ is not None:
            self._values["import_"] = import_
        if max_size_bytes is not None:
            self._values["max_size_bytes"] = max_size_bytes
        if max_size_gb is not None:
            self._values["max_size_gb"] = max_size_gb
        if read_scale is not None:
            self._values["read_scale"] = read_scale
        if requested_service_objective_id is not None:
            self._values["requested_service_objective_id"] = requested_service_objective_id
        if requested_service_objective_name is not None:
            self._values["requested_service_objective_name"] = requested_service_objective_name
        if restore_point_in_time is not None:
            self._values["restore_point_in_time"] = restore_point_in_time
        if source_database_deletion_date is not None:
            self._values["source_database_deletion_date"] = source_database_deletion_date
        if source_database_id is not None:
            self._values["source_database_id"] = source_database_id
        if tags is not None:
            self._values["tags"] = tags
        if threat_detection_policy is not None:
            self._values["threat_detection_policy"] = threat_detection_policy
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zone_redundant is not None:
            self._values["zone_redundant"] = zone_redundant

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def collation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("collation")
        return result

    @builtins.property
    def create_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_mode")
        return result

    @builtins.property
    def edition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("edition")
        return result

    @builtins.property
    def elastic_pool_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("elastic_pool_name")
        return result

    @builtins.property
    def extended_auditing_policy(
        self,
    ) -> typing.Optional[typing.List["SqlDatabaseExtendedAuditingPolicy"]]:
        result = self._values.get("extended_auditing_policy")
        return result

    @builtins.property
    def import_(self) -> typing.Optional[typing.List["SqlDatabaseImport"]]:
        """import block."""
        result = self._values.get("import_")
        return result

    @builtins.property
    def max_size_bytes(self) -> typing.Optional[builtins.str]:
        result = self._values.get("max_size_bytes")
        return result

    @builtins.property
    def max_size_gb(self) -> typing.Optional[builtins.str]:
        result = self._values.get("max_size_gb")
        return result

    @builtins.property
    def read_scale(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("read_scale")
        return result

    @builtins.property
    def requested_service_objective_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("requested_service_objective_id")
        return result

    @builtins.property
    def requested_service_objective_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("requested_service_objective_name")
        return result

    @builtins.property
    def restore_point_in_time(self) -> typing.Optional[builtins.str]:
        result = self._values.get("restore_point_in_time")
        return result

    @builtins.property
    def source_database_deletion_date(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_database_deletion_date")
        return result

    @builtins.property
    def source_database_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_database_id")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def threat_detection_policy(
        self,
    ) -> typing.Optional[typing.List["SqlDatabaseThreatDetectionPolicy"]]:
        """threat_detection_policy block."""
        result = self._values.get("threat_detection_policy")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlDatabaseTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zone_redundant(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_redundant")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlDatabaseConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlDatabaseExtendedAuditingPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "retention_in_days": "retentionInDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_access_key_is_secondary": "storageAccountAccessKeyIsSecondary",
        "storage_endpoint": "storageEndpoint",
    },
)
class SqlDatabaseExtendedAuditingPolicy:
    def __init__(
        self,
        *,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param storage_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_account_access_key_is_secondary is not None:
            self._values["storage_account_access_key_is_secondary"] = storage_account_access_key_is_secondary
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_account_access_key_is_secondary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("storage_account_access_key_is_secondary")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlDatabaseExtendedAuditingPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlDatabaseImport",
    jsii_struct_bases=[],
    name_mapping={
        "administrator_login": "administratorLogin",
        "administrator_login_password": "administratorLoginPassword",
        "authentication_type": "authenticationType",
        "storage_key": "storageKey",
        "storage_key_type": "storageKeyType",
        "storage_uri": "storageUri",
        "operation_mode": "operationMode",
    },
)
class SqlDatabaseImport:
    def __init__(
        self,
        *,
        administrator_login: builtins.str,
        administrator_login_password: builtins.str,
        authentication_type: builtins.str,
        storage_key: builtins.str,
        storage_key_type: builtins.str,
        storage_uri: builtins.str,
        operation_mode: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param administrator_login: -
        :param administrator_login_password: -
        :param authentication_type: -
        :param storage_key: -
        :param storage_key_type: -
        :param storage_uri: -
        :param operation_mode: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "administrator_login": administrator_login,
            "administrator_login_password": administrator_login_password,
            "authentication_type": authentication_type,
            "storage_key": storage_key,
            "storage_key_type": storage_key_type,
            "storage_uri": storage_uri,
        }
        if operation_mode is not None:
            self._values["operation_mode"] = operation_mode

    @builtins.property
    def administrator_login(self) -> builtins.str:
        result = self._values.get("administrator_login")
        assert result is not None, "Required property 'administrator_login' is missing"
        return result

    @builtins.property
    def administrator_login_password(self) -> builtins.str:
        result = self._values.get("administrator_login_password")
        assert result is not None, "Required property 'administrator_login_password' is missing"
        return result

    @builtins.property
    def authentication_type(self) -> builtins.str:
        result = self._values.get("authentication_type")
        assert result is not None, "Required property 'authentication_type' is missing"
        return result

    @builtins.property
    def storage_key(self) -> builtins.str:
        result = self._values.get("storage_key")
        assert result is not None, "Required property 'storage_key' is missing"
        return result

    @builtins.property
    def storage_key_type(self) -> builtins.str:
        result = self._values.get("storage_key_type")
        assert result is not None, "Required property 'storage_key_type' is missing"
        return result

    @builtins.property
    def storage_uri(self) -> builtins.str:
        result = self._values.get("storage_uri")
        assert result is not None, "Required property 'storage_uri' is missing"
        return result

    @builtins.property
    def operation_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("operation_mode")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlDatabaseImport(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlDatabaseThreatDetectionPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "disabled_alerts": "disabledAlerts",
        "email_account_admins": "emailAccountAdmins",
        "email_addresses": "emailAddresses",
        "retention_days": "retentionDays",
        "state": "state",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_endpoint": "storageEndpoint",
        "use_server_default": "useServerDefault",
    },
)
class SqlDatabaseThreatDetectionPolicy:
    def __init__(
        self,
        *,
        disabled_alerts: typing.Optional[typing.List[builtins.str]] = None,
        email_account_admins: typing.Optional[builtins.str] = None,
        email_addresses: typing.Optional[typing.List[builtins.str]] = None,
        retention_days: typing.Optional[jsii.Number] = None,
        state: typing.Optional[builtins.str] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
        use_server_default: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param disabled_alerts: -
        :param email_account_admins: -
        :param email_addresses: -
        :param retention_days: -
        :param state: -
        :param storage_account_access_key: -
        :param storage_endpoint: -
        :param use_server_default: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if disabled_alerts is not None:
            self._values["disabled_alerts"] = disabled_alerts
        if email_account_admins is not None:
            self._values["email_account_admins"] = email_account_admins
        if email_addresses is not None:
            self._values["email_addresses"] = email_addresses
        if retention_days is not None:
            self._values["retention_days"] = retention_days
        if state is not None:
            self._values["state"] = state
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint
        if use_server_default is not None:
            self._values["use_server_default"] = use_server_default

    @builtins.property
    def disabled_alerts(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("disabled_alerts")
        return result

    @builtins.property
    def email_account_admins(self) -> typing.Optional[builtins.str]:
        result = self._values.get("email_account_admins")
        return result

    @builtins.property
    def email_addresses(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("email_addresses")
        return result

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_days")
        return result

    @builtins.property
    def state(self) -> typing.Optional[builtins.str]:
        result = self._values.get("state")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    @builtins.property
    def use_server_default(self) -> typing.Optional[builtins.str]:
        result = self._values.get("use_server_default")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlDatabaseThreatDetectionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlDatabaseTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SqlDatabaseTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlDatabaseTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SqlElasticpool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SqlElasticpool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        dtu: jsii.Number,
        edition: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        db_dtu_max: typing.Optional[jsii.Number] = None,
        db_dtu_min: typing.Optional[jsii.Number] = None,
        pool_size: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SqlElasticpoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param dtu: -
        :param edition: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param db_dtu_max: -
        :param db_dtu_min: -
        :param pool_size: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlElasticpoolConfig(
            dtu=dtu,
            edition=edition,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            db_dtu_max=db_dtu_max,
            db_dtu_min=db_dtu_min,
            pool_size=pool_size,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SqlElasticpool, self, [scope, id, config])

    @jsii.member(jsii_name="resetDbDtuMax")
    def reset_db_dtu_max(self) -> None:
        return jsii.invoke(self, "resetDbDtuMax", [])

    @jsii.member(jsii_name="resetDbDtuMin")
    def reset_db_dtu_min(self) -> None:
        return jsii.invoke(self, "resetDbDtuMin", [])

    @jsii.member(jsii_name="resetPoolSize")
    def reset_pool_size(self) -> None:
        return jsii.invoke(self, "resetPoolSize", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="creationDate")
    def creation_date(self) -> builtins.str:
        return jsii.get(self, "creationDate")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dtuInput")
    def dtu_input(self) -> jsii.Number:
        return jsii.get(self, "dtuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="editionInput")
    def edition_input(self) -> builtins.str:
        return jsii.get(self, "editionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dbDtuMaxInput")
    def db_dtu_max_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dbDtuMaxInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dbDtuMinInput")
    def db_dtu_min_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dbDtuMinInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolSizeInput")
    def pool_size_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "poolSizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SqlElasticpoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dbDtuMax")
    def db_dtu_max(self) -> jsii.Number:
        return jsii.get(self, "dbDtuMax")

    @db_dtu_max.setter # type: ignore
    def db_dtu_max(self, value: jsii.Number) -> None:
        jsii.set(self, "dbDtuMax", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dbDtuMin")
    def db_dtu_min(self) -> jsii.Number:
        return jsii.get(self, "dbDtuMin")

    @db_dtu_min.setter # type: ignore
    def db_dtu_min(self, value: jsii.Number) -> None:
        jsii.set(self, "dbDtuMin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dtu")
    def dtu(self) -> jsii.Number:
        return jsii.get(self, "dtu")

    @dtu.setter # type: ignore
    def dtu(self, value: jsii.Number) -> None:
        jsii.set(self, "dtu", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="edition")
    def edition(self) -> builtins.str:
        return jsii.get(self, "edition")

    @edition.setter # type: ignore
    def edition(self, value: builtins.str) -> None:
        jsii.set(self, "edition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="poolSize")
    def pool_size(self) -> jsii.Number:
        return jsii.get(self, "poolSize")

    @pool_size.setter # type: ignore
    def pool_size(self, value: jsii.Number) -> None:
        jsii.set(self, "poolSize", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SqlElasticpoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SqlElasticpoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SqlElasticpoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "dtu": "dtu",
        "edition": "edition",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "db_dtu_max": "dbDtuMax",
        "db_dtu_min": "dbDtuMin",
        "pool_size": "poolSize",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SqlElasticpoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        dtu: jsii.Number,
        edition: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        db_dtu_max: typing.Optional[jsii.Number] = None,
        db_dtu_min: typing.Optional[jsii.Number] = None,
        pool_size: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SqlElasticpoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dtu: -
        :param edition: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param db_dtu_max: -
        :param db_dtu_min: -
        :param pool_size: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SqlElasticpoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "dtu": dtu,
            "edition": edition,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if db_dtu_max is not None:
            self._values["db_dtu_max"] = db_dtu_max
        if db_dtu_min is not None:
            self._values["db_dtu_min"] = db_dtu_min
        if pool_size is not None:
            self._values["pool_size"] = pool_size
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def dtu(self) -> jsii.Number:
        result = self._values.get("dtu")
        assert result is not None, "Required property 'dtu' is missing"
        return result

    @builtins.property
    def edition(self) -> builtins.str:
        result = self._values.get("edition")
        assert result is not None, "Required property 'edition' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def db_dtu_max(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("db_dtu_max")
        return result

    @builtins.property
    def db_dtu_min(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("db_dtu_min")
        return result

    @builtins.property
    def pool_size(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("pool_size")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlElasticpoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlElasticpoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlElasticpoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SqlElasticpoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlElasticpoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SqlFailoverGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SqlFailoverGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        partner_servers: typing.List["SqlFailoverGroupPartnerServers"],
        read_write_endpoint_failover_policy: typing.List["SqlFailoverGroupReadWriteEndpointFailoverPolicy"],
        resource_group_name: builtins.str,
        server_name: builtins.str,
        databases: typing.Optional[typing.List[builtins.str]] = None,
        readonly_endpoint_failover_policy: typing.Optional[typing.List["SqlFailoverGroupReadonlyEndpointFailoverPolicy"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SqlFailoverGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param partner_servers: partner_servers block.
        :param read_write_endpoint_failover_policy: read_write_endpoint_failover_policy block.
        :param resource_group_name: -
        :param server_name: -
        :param databases: -
        :param readonly_endpoint_failover_policy: readonly_endpoint_failover_policy block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlFailoverGroupConfig(
            name=name,
            partner_servers=partner_servers,
            read_write_endpoint_failover_policy=read_write_endpoint_failover_policy,
            resource_group_name=resource_group_name,
            server_name=server_name,
            databases=databases,
            readonly_endpoint_failover_policy=readonly_endpoint_failover_policy,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SqlFailoverGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetDatabases")
    def reset_databases(self) -> None:
        return jsii.invoke(self, "resetDatabases", [])

    @jsii.member(jsii_name="resetReadonlyEndpointFailoverPolicy")
    def reset_readonly_endpoint_failover_policy(self) -> None:
        return jsii.invoke(self, "resetReadonlyEndpointFailoverPolicy", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partnerServersInput")
    def partner_servers_input(self) -> typing.List["SqlFailoverGroupPartnerServers"]:
        return jsii.get(self, "partnerServersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readWriteEndpointFailoverPolicyInput")
    def read_write_endpoint_failover_policy_input(
        self,
    ) -> typing.List["SqlFailoverGroupReadWriteEndpointFailoverPolicy"]:
        return jsii.get(self, "readWriteEndpointFailoverPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="role")
    def role(self) -> builtins.str:
        return jsii.get(self, "role")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databasesInput")
    def databases_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "databasesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readonlyEndpointFailoverPolicyInput")
    def readonly_endpoint_failover_policy_input(
        self,
    ) -> typing.Optional[typing.List["SqlFailoverGroupReadonlyEndpointFailoverPolicy"]]:
        return jsii.get(self, "readonlyEndpointFailoverPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SqlFailoverGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databases")
    def databases(self) -> typing.List[builtins.str]:
        return jsii.get(self, "databases")

    @databases.setter # type: ignore
    def databases(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "databases", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partnerServers")
    def partner_servers(self) -> typing.List["SqlFailoverGroupPartnerServers"]:
        return jsii.get(self, "partnerServers")

    @partner_servers.setter # type: ignore
    def partner_servers(
        self,
        value: typing.List["SqlFailoverGroupPartnerServers"],
    ) -> None:
        jsii.set(self, "partnerServers", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readonlyEndpointFailoverPolicy")
    def readonly_endpoint_failover_policy(
        self,
    ) -> typing.List["SqlFailoverGroupReadonlyEndpointFailoverPolicy"]:
        return jsii.get(self, "readonlyEndpointFailoverPolicy")

    @readonly_endpoint_failover_policy.setter # type: ignore
    def readonly_endpoint_failover_policy(
        self,
        value: typing.List["SqlFailoverGroupReadonlyEndpointFailoverPolicy"],
    ) -> None:
        jsii.set(self, "readonlyEndpointFailoverPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="readWriteEndpointFailoverPolicy")
    def read_write_endpoint_failover_policy(
        self,
    ) -> typing.List["SqlFailoverGroupReadWriteEndpointFailoverPolicy"]:
        return jsii.get(self, "readWriteEndpointFailoverPolicy")

    @read_write_endpoint_failover_policy.setter # type: ignore
    def read_write_endpoint_failover_policy(
        self,
        value: typing.List["SqlFailoverGroupReadWriteEndpointFailoverPolicy"],
    ) -> None:
        jsii.set(self, "readWriteEndpointFailoverPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SqlFailoverGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SqlFailoverGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SqlFailoverGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "partner_servers": "partnerServers",
        "read_write_endpoint_failover_policy": "readWriteEndpointFailoverPolicy",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "databases": "databases",
        "readonly_endpoint_failover_policy": "readonlyEndpointFailoverPolicy",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SqlFailoverGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        partner_servers: typing.List["SqlFailoverGroupPartnerServers"],
        read_write_endpoint_failover_policy: typing.List["SqlFailoverGroupReadWriteEndpointFailoverPolicy"],
        resource_group_name: builtins.str,
        server_name: builtins.str,
        databases: typing.Optional[typing.List[builtins.str]] = None,
        readonly_endpoint_failover_policy: typing.Optional[typing.List["SqlFailoverGroupReadonlyEndpointFailoverPolicy"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SqlFailoverGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param partner_servers: partner_servers block.
        :param read_write_endpoint_failover_policy: read_write_endpoint_failover_policy block.
        :param resource_group_name: -
        :param server_name: -
        :param databases: -
        :param readonly_endpoint_failover_policy: readonly_endpoint_failover_policy block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SqlFailoverGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "partner_servers": partner_servers,
            "read_write_endpoint_failover_policy": read_write_endpoint_failover_policy,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if databases is not None:
            self._values["databases"] = databases
        if readonly_endpoint_failover_policy is not None:
            self._values["readonly_endpoint_failover_policy"] = readonly_endpoint_failover_policy
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def partner_servers(self) -> typing.List["SqlFailoverGroupPartnerServers"]:
        """partner_servers block."""
        result = self._values.get("partner_servers")
        assert result is not None, "Required property 'partner_servers' is missing"
        return result

    @builtins.property
    def read_write_endpoint_failover_policy(
        self,
    ) -> typing.List["SqlFailoverGroupReadWriteEndpointFailoverPolicy"]:
        """read_write_endpoint_failover_policy block."""
        result = self._values.get("read_write_endpoint_failover_policy")
        assert result is not None, "Required property 'read_write_endpoint_failover_policy' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def databases(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("databases")
        return result

    @builtins.property
    def readonly_endpoint_failover_policy(
        self,
    ) -> typing.Optional[typing.List["SqlFailoverGroupReadonlyEndpointFailoverPolicy"]]:
        """readonly_endpoint_failover_policy block."""
        result = self._values.get("readonly_endpoint_failover_policy")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlFailoverGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlFailoverGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlFailoverGroupPartnerServers",
    jsii_struct_bases=[],
    name_mapping={"id": "id"},
)
class SqlFailoverGroupPartnerServers:
    def __init__(self, *, id: builtins.str) -> None:
        """
        :param id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
        }

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlFailoverGroupPartnerServers(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlFailoverGroupReadWriteEndpointFailoverPolicy",
    jsii_struct_bases=[],
    name_mapping={"mode": "mode", "grace_minutes": "graceMinutes"},
)
class SqlFailoverGroupReadWriteEndpointFailoverPolicy:
    def __init__(
        self,
        *,
        mode: builtins.str,
        grace_minutes: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param mode: -
        :param grace_minutes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "mode": mode,
        }
        if grace_minutes is not None:
            self._values["grace_minutes"] = grace_minutes

    @builtins.property
    def mode(self) -> builtins.str:
        result = self._values.get("mode")
        assert result is not None, "Required property 'mode' is missing"
        return result

    @builtins.property
    def grace_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("grace_minutes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlFailoverGroupReadWriteEndpointFailoverPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlFailoverGroupReadonlyEndpointFailoverPolicy",
    jsii_struct_bases=[],
    name_mapping={"mode": "mode"},
)
class SqlFailoverGroupReadonlyEndpointFailoverPolicy:
    def __init__(self, *, mode: builtins.str) -> None:
        """
        :param mode: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "mode": mode,
        }

    @builtins.property
    def mode(self) -> builtins.str:
        result = self._values.get("mode")
        assert result is not None, "Required property 'mode' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlFailoverGroupReadonlyEndpointFailoverPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlFailoverGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SqlFailoverGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlFailoverGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SqlFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SqlFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["SqlFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlFirewallRuleConfig(
            end_ip_address=end_ip_address,
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            start_ip_address=start_ip_address,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SqlFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddressInput")
    def end_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "endIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddressInput")
    def start_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "startIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SqlFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddress")
    def end_ip_address(self) -> builtins.str:
        return jsii.get(self, "endIpAddress")

    @end_ip_address.setter # type: ignore
    def end_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "endIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddress")
    def start_ip_address(self) -> builtins.str:
        return jsii.get(self, "startIpAddress")

    @start_ip_address.setter # type: ignore
    def start_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "startIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SqlFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SqlFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SqlFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "end_ip_address": "endIpAddress",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "start_ip_address": "startIpAddress",
        "timeouts": "timeouts",
    },
)
class SqlFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        end_ip_address: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        start_ip_address: builtins.str,
        timeouts: typing.Optional["SqlFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param end_ip_address: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param start_ip_address: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SqlFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "end_ip_address": end_ip_address,
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "start_ip_address": start_ip_address,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def end_ip_address(self) -> builtins.str:
        result = self._values.get("end_ip_address")
        assert result is not None, "Required property 'end_ip_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def start_ip_address(self) -> builtins.str:
        result = self._values.get("start_ip_address")
        assert result is not None, "Required property 'start_ip_address' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SqlFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SqlServer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SqlServer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        administrator_login: builtins.str,
        administrator_login_password: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        version: builtins.str,
        connection_policy: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["SqlServerExtendedAuditingPolicy"]] = None,
        identity: typing.Optional[typing.List["SqlServerIdentity"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SqlServerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param administrator_login: -
        :param administrator_login_password: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param version: -
        :param connection_policy: -
        :param extended_auditing_policy: -
        :param identity: identity block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlServerConfig(
            administrator_login=administrator_login,
            administrator_login_password=administrator_login_password,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            version=version,
            connection_policy=connection_policy,
            extended_auditing_policy=extended_auditing_policy,
            identity=identity,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SqlServer, self, [scope, id, config])

    @jsii.member(jsii_name="resetConnectionPolicy")
    def reset_connection_policy(self) -> None:
        return jsii.invoke(self, "resetConnectionPolicy", [])

    @jsii.member(jsii_name="resetExtendedAuditingPolicy")
    def reset_extended_auditing_policy(self) -> None:
        return jsii.invoke(self, "resetExtendedAuditingPolicy", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginInput")
    def administrator_login_input(self) -> builtins.str:
        return jsii.get(self, "administratorLoginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPasswordInput")
    def administrator_login_password_input(self) -> builtins.str:
        return jsii.get(self, "administratorLoginPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fullyQualifiedDomainName")
    def fully_qualified_domain_name(self) -> builtins.str:
        return jsii.get(self, "fullyQualifiedDomainName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="versionInput")
    def version_input(self) -> builtins.str:
        return jsii.get(self, "versionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionPolicyInput")
    def connection_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "connectionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicyInput")
    def extended_auditing_policy_input(
        self,
    ) -> typing.Optional[typing.List["SqlServerExtendedAuditingPolicy"]]:
        return jsii.get(self, "extendedAuditingPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["SqlServerIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SqlServerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLogin")
    def administrator_login(self) -> builtins.str:
        return jsii.get(self, "administratorLogin")

    @administrator_login.setter # type: ignore
    def administrator_login(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLogin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="administratorLoginPassword")
    def administrator_login_password(self) -> builtins.str:
        return jsii.get(self, "administratorLoginPassword")

    @administrator_login_password.setter # type: ignore
    def administrator_login_password(self, value: builtins.str) -> None:
        jsii.set(self, "administratorLoginPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionPolicy")
    def connection_policy(self) -> builtins.str:
        return jsii.get(self, "connectionPolicy")

    @connection_policy.setter # type: ignore
    def connection_policy(self, value: builtins.str) -> None:
        jsii.set(self, "connectionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extendedAuditingPolicy")
    def extended_auditing_policy(
        self,
    ) -> typing.List["SqlServerExtendedAuditingPolicy"]:
        return jsii.get(self, "extendedAuditingPolicy")

    @extended_auditing_policy.setter # type: ignore
    def extended_auditing_policy(
        self,
        value: typing.List["SqlServerExtendedAuditingPolicy"],
    ) -> None:
        jsii.set(self, "extendedAuditingPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["SqlServerIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["SqlServerIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SqlServerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SqlServerTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="version")
    def version(self) -> builtins.str:
        return jsii.get(self, "version")

    @version.setter # type: ignore
    def version(self, value: builtins.str) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(
    jsii_type="azurerm.SqlServerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "administrator_login": "administratorLogin",
        "administrator_login_password": "administratorLoginPassword",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "version": "version",
        "connection_policy": "connectionPolicy",
        "extended_auditing_policy": "extendedAuditingPolicy",
        "identity": "identity",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SqlServerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        administrator_login: builtins.str,
        administrator_login_password: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        version: builtins.str,
        connection_policy: typing.Optional[builtins.str] = None,
        extended_auditing_policy: typing.Optional[typing.List["SqlServerExtendedAuditingPolicy"]] = None,
        identity: typing.Optional[typing.List["SqlServerIdentity"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SqlServerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param administrator_login: -
        :param administrator_login_password: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param version: -
        :param connection_policy: -
        :param extended_auditing_policy: -
        :param identity: identity block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SqlServerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "administrator_login": administrator_login,
            "administrator_login_password": administrator_login_password,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "version": version,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if connection_policy is not None:
            self._values["connection_policy"] = connection_policy
        if extended_auditing_policy is not None:
            self._values["extended_auditing_policy"] = extended_auditing_policy
        if identity is not None:
            self._values["identity"] = identity
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def administrator_login(self) -> builtins.str:
        result = self._values.get("administrator_login")
        assert result is not None, "Required property 'administrator_login' is missing"
        return result

    @builtins.property
    def administrator_login_password(self) -> builtins.str:
        result = self._values.get("administrator_login_password")
        assert result is not None, "Required property 'administrator_login_password' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def connection_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("connection_policy")
        return result

    @builtins.property
    def extended_auditing_policy(
        self,
    ) -> typing.Optional[typing.List["SqlServerExtendedAuditingPolicy"]]:
        result = self._values.get("extended_auditing_policy")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["SqlServerIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlServerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlServerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlServerExtendedAuditingPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "retention_in_days": "retentionInDays",
        "storage_account_access_key": "storageAccountAccessKey",
        "storage_account_access_key_is_secondary": "storageAccountAccessKeyIsSecondary",
        "storage_endpoint": "storageEndpoint",
    },
)
class SqlServerExtendedAuditingPolicy:
    def __init__(
        self,
        *,
        retention_in_days: typing.Optional[jsii.Number] = None,
        storage_account_access_key: typing.Optional[builtins.str] = None,
        storage_account_access_key_is_secondary: typing.Optional[builtins.bool] = None,
        storage_endpoint: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param retention_in_days: -
        :param storage_account_access_key: -
        :param storage_account_access_key_is_secondary: -
        :param storage_endpoint: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if retention_in_days is not None:
            self._values["retention_in_days"] = retention_in_days
        if storage_account_access_key is not None:
            self._values["storage_account_access_key"] = storage_account_access_key
        if storage_account_access_key_is_secondary is not None:
            self._values["storage_account_access_key_is_secondary"] = storage_account_access_key_is_secondary
        if storage_endpoint is not None:
            self._values["storage_endpoint"] = storage_endpoint

    @builtins.property
    def retention_in_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_in_days")
        return result

    @builtins.property
    def storage_account_access_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_access_key")
        return result

    @builtins.property
    def storage_account_access_key_is_secondary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("storage_account_access_key_is_secondary")
        return result

    @builtins.property
    def storage_endpoint(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_endpoint")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlServerExtendedAuditingPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlServerIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class SqlServerIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlServerIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlServerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SqlServerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlServerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SqlVirtualNetworkRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SqlVirtualNetworkRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        ignore_missing_vnet_service_endpoint: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["SqlVirtualNetworkRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param ignore_missing_vnet_service_endpoint: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlVirtualNetworkRuleConfig(
            name=name,
            resource_group_name=resource_group_name,
            server_name=server_name,
            subnet_id=subnet_id,
            ignore_missing_vnet_service_endpoint=ignore_missing_vnet_service_endpoint,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SqlVirtualNetworkRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetIgnoreMissingVnetServiceEndpoint")
    def reset_ignore_missing_vnet_service_endpoint(self) -> None:
        return jsii.invoke(self, "resetIgnoreMissingVnetServiceEndpoint", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverNameInput")
    def server_name_input(self) -> builtins.str:
        return jsii.get(self, "serverNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ignoreMissingVnetServiceEndpointInput")
    def ignore_missing_vnet_service_endpoint_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "ignoreMissingVnetServiceEndpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SqlVirtualNetworkRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ignoreMissingVnetServiceEndpoint")
    def ignore_missing_vnet_service_endpoint(self) -> builtins.bool:
        return jsii.get(self, "ignoreMissingVnetServiceEndpoint")

    @ignore_missing_vnet_service_endpoint.setter # type: ignore
    def ignore_missing_vnet_service_endpoint(self, value: builtins.bool) -> None:
        jsii.set(self, "ignoreMissingVnetServiceEndpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverName")
    def server_name(self) -> builtins.str:
        return jsii.get(self, "serverName")

    @server_name.setter # type: ignore
    def server_name(self, value: builtins.str) -> None:
        jsii.set(self, "serverName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SqlVirtualNetworkRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SqlVirtualNetworkRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SqlVirtualNetworkRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "server_name": "serverName",
        "subnet_id": "subnetId",
        "ignore_missing_vnet_service_endpoint": "ignoreMissingVnetServiceEndpoint",
        "timeouts": "timeouts",
    },
)
class SqlVirtualNetworkRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        server_name: builtins.str,
        subnet_id: builtins.str,
        ignore_missing_vnet_service_endpoint: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["SqlVirtualNetworkRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param server_name: -
        :param subnet_id: -
        :param ignore_missing_vnet_service_endpoint: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SqlVirtualNetworkRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "server_name": server_name,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if ignore_missing_vnet_service_endpoint is not None:
            self._values["ignore_missing_vnet_service_endpoint"] = ignore_missing_vnet_service_endpoint
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server_name(self) -> builtins.str:
        result = self._values.get("server_name")
        assert result is not None, "Required property 'server_name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def ignore_missing_vnet_service_endpoint(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ignore_missing_vnet_service_endpoint")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlVirtualNetworkRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlVirtualNetworkRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SqlVirtualNetworkRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SqlVirtualNetworkRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SqlVirtualNetworkRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StackHciCluster(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StackHciCluster",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        client_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tenant_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StackHciClusterTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param client_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StackHciClusterConfig(
            client_id=client_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            tenant_id=tenant_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StackHciCluster, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTenantId")
    def reset_tenant_id(self) -> None:
        return jsii.invoke(self, "resetTenantId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientIdInput")
    def client_id_input(self) -> builtins.str:
        return jsii.get(self, "clientIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantIdInput")
    def tenant_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "tenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StackHciClusterTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @client_id.setter # type: ignore
    def client_id(self, value: builtins.str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @tenant_id.setter # type: ignore
    def tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "tenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StackHciClusterTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StackHciClusterTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StackHciClusterConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "client_id": "clientId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "tenant_id": "tenantId",
        "timeouts": "timeouts",
    },
)
class StackHciClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        client_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        tenant_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StackHciClusterTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param client_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param tenant_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StackHciClusterTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "client_id": client_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if tenant_id is not None:
            self._values["tenant_id"] = tenant_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def client_id(self) -> builtins.str:
        result = self._values.get("client_id")
        assert result is not None, "Required property 'client_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def tenant_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tenant_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StackHciClusterTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StackHciClusterConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StackHciClusterTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StackHciClusterTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StackHciClusterTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageAccount(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageAccount",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        account_replication_type: builtins.str,
        account_tier: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        access_tier: typing.Optional[builtins.str] = None,
        account_kind: typing.Optional[builtins.str] = None,
        allow_blob_public_access: typing.Optional[builtins.bool] = None,
        blob_properties: typing.Optional[typing.List["StorageAccountBlobProperties"]] = None,
        custom_domain: typing.Optional[typing.List["StorageAccountCustomDomain"]] = None,
        enable_https_traffic_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["StorageAccountIdentity"]] = None,
        is_hns_enabled: typing.Optional[builtins.bool] = None,
        large_file_share_enabled: typing.Optional[builtins.bool] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        network_rules: typing.Optional[typing.List["StorageAccountNetworkRules"]] = None,
        queue_properties: typing.Optional[typing.List["StorageAccountQueueProperties"]] = None,
        static_website: typing.Optional[typing.List["StorageAccountStaticWebsite"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageAccountTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param account_replication_type: -
        :param account_tier: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param access_tier: -
        :param account_kind: -
        :param allow_blob_public_access: -
        :param blob_properties: blob_properties block.
        :param custom_domain: custom_domain block.
        :param enable_https_traffic_only: -
        :param identity: identity block.
        :param is_hns_enabled: -
        :param large_file_share_enabled: -
        :param min_tls_version: -
        :param network_rules: network_rules block.
        :param queue_properties: queue_properties block.
        :param static_website: static_website block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageAccountConfig(
            account_replication_type=account_replication_type,
            account_tier=account_tier,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            access_tier=access_tier,
            account_kind=account_kind,
            allow_blob_public_access=allow_blob_public_access,
            blob_properties=blob_properties,
            custom_domain=custom_domain,
            enable_https_traffic_only=enable_https_traffic_only,
            identity=identity,
            is_hns_enabled=is_hns_enabled,
            large_file_share_enabled=large_file_share_enabled,
            min_tls_version=min_tls_version,
            network_rules=network_rules,
            queue_properties=queue_properties,
            static_website=static_website,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageAccount, self, [scope, id, config])

    @jsii.member(jsii_name="resetAccessTier")
    def reset_access_tier(self) -> None:
        return jsii.invoke(self, "resetAccessTier", [])

    @jsii.member(jsii_name="resetAccountKind")
    def reset_account_kind(self) -> None:
        return jsii.invoke(self, "resetAccountKind", [])

    @jsii.member(jsii_name="resetAllowBlobPublicAccess")
    def reset_allow_blob_public_access(self) -> None:
        return jsii.invoke(self, "resetAllowBlobPublicAccess", [])

    @jsii.member(jsii_name="resetBlobProperties")
    def reset_blob_properties(self) -> None:
        return jsii.invoke(self, "resetBlobProperties", [])

    @jsii.member(jsii_name="resetCustomDomain")
    def reset_custom_domain(self) -> None:
        return jsii.invoke(self, "resetCustomDomain", [])

    @jsii.member(jsii_name="resetEnableHttpsTrafficOnly")
    def reset_enable_https_traffic_only(self) -> None:
        return jsii.invoke(self, "resetEnableHttpsTrafficOnly", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetIsHnsEnabled")
    def reset_is_hns_enabled(self) -> None:
        return jsii.invoke(self, "resetIsHnsEnabled", [])

    @jsii.member(jsii_name="resetLargeFileShareEnabled")
    def reset_large_file_share_enabled(self) -> None:
        return jsii.invoke(self, "resetLargeFileShareEnabled", [])

    @jsii.member(jsii_name="resetMinTlsVersion")
    def reset_min_tls_version(self) -> None:
        return jsii.invoke(self, "resetMinTlsVersion", [])

    @jsii.member(jsii_name="resetNetworkRules")
    def reset_network_rules(self) -> None:
        return jsii.invoke(self, "resetNetworkRules", [])

    @jsii.member(jsii_name="resetQueueProperties")
    def reset_queue_properties(self) -> None:
        return jsii.invoke(self, "resetQueueProperties", [])

    @jsii.member(jsii_name="resetStaticWebsite")
    def reset_static_website(self) -> None:
        return jsii.invoke(self, "resetStaticWebsite", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountReplicationTypeInput")
    def account_replication_type_input(self) -> builtins.str:
        return jsii.get(self, "accountReplicationTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountTierInput")
    def account_tier_input(self) -> builtins.str:
        return jsii.get(self, "accountTierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryAccessKey")
    def primary_access_key(self) -> builtins.str:
        return jsii.get(self, "primaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryBlobConnectionString")
    def primary_blob_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryBlobConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryBlobEndpoint")
    def primary_blob_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryBlobEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryBlobHost")
    def primary_blob_host(self) -> builtins.str:
        return jsii.get(self, "primaryBlobHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryConnectionString")
    def primary_connection_string(self) -> builtins.str:
        return jsii.get(self, "primaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryDfsEndpoint")
    def primary_dfs_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryDfsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryDfsHost")
    def primary_dfs_host(self) -> builtins.str:
        return jsii.get(self, "primaryDfsHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryFileEndpoint")
    def primary_file_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryFileEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryFileHost")
    def primary_file_host(self) -> builtins.str:
        return jsii.get(self, "primaryFileHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryLocation")
    def primary_location(self) -> builtins.str:
        return jsii.get(self, "primaryLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryQueueEndpoint")
    def primary_queue_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryQueueEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryQueueHost")
    def primary_queue_host(self) -> builtins.str:
        return jsii.get(self, "primaryQueueHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryTableEndpoint")
    def primary_table_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryTableEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryTableHost")
    def primary_table_host(self) -> builtins.str:
        return jsii.get(self, "primaryTableHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryWebEndpoint")
    def primary_web_endpoint(self) -> builtins.str:
        return jsii.get(self, "primaryWebEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryWebHost")
    def primary_web_host(self) -> builtins.str:
        return jsii.get(self, "primaryWebHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryAccessKey")
    def secondary_access_key(self) -> builtins.str:
        return jsii.get(self, "secondaryAccessKey")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryBlobConnectionString")
    def secondary_blob_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryBlobConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryBlobEndpoint")
    def secondary_blob_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryBlobEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryBlobHost")
    def secondary_blob_host(self) -> builtins.str:
        return jsii.get(self, "secondaryBlobHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryConnectionString")
    def secondary_connection_string(self) -> builtins.str:
        return jsii.get(self, "secondaryConnectionString")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryDfsEndpoint")
    def secondary_dfs_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryDfsEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryDfsHost")
    def secondary_dfs_host(self) -> builtins.str:
        return jsii.get(self, "secondaryDfsHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryFileEndpoint")
    def secondary_file_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryFileEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryFileHost")
    def secondary_file_host(self) -> builtins.str:
        return jsii.get(self, "secondaryFileHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryLocation")
    def secondary_location(self) -> builtins.str:
        return jsii.get(self, "secondaryLocation")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryQueueEndpoint")
    def secondary_queue_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryQueueEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryQueueHost")
    def secondary_queue_host(self) -> builtins.str:
        return jsii.get(self, "secondaryQueueHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryTableEndpoint")
    def secondary_table_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryTableEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryTableHost")
    def secondary_table_host(self) -> builtins.str:
        return jsii.get(self, "secondaryTableHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryWebEndpoint")
    def secondary_web_endpoint(self) -> builtins.str:
        return jsii.get(self, "secondaryWebEndpoint")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secondaryWebHost")
    def secondary_web_host(self) -> builtins.str:
        return jsii.get(self, "secondaryWebHost")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessTierInput")
    def access_tier_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "accessTierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountKindInput")
    def account_kind_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "accountKindInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowBlobPublicAccessInput")
    def allow_blob_public_access_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowBlobPublicAccessInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobPropertiesInput")
    def blob_properties_input(
        self,
    ) -> typing.Optional[typing.List["StorageAccountBlobProperties"]]:
        return jsii.get(self, "blobPropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDomainInput")
    def custom_domain_input(
        self,
    ) -> typing.Optional[typing.List["StorageAccountCustomDomain"]]:
        return jsii.get(self, "customDomainInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableHttpsTrafficOnlyInput")
    def enable_https_traffic_only_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableHttpsTrafficOnlyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["StorageAccountIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isHnsEnabledInput")
    def is_hns_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "isHnsEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="largeFileShareEnabledInput")
    def large_file_share_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "largeFileShareEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersionInput")
    def min_tls_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "minTlsVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRulesInput")
    def network_rules_input(
        self,
    ) -> typing.Optional[typing.List["StorageAccountNetworkRules"]]:
        return jsii.get(self, "networkRulesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queuePropertiesInput")
    def queue_properties_input(
        self,
    ) -> typing.Optional[typing.List["StorageAccountQueueProperties"]]:
        return jsii.get(self, "queuePropertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="staticWebsiteInput")
    def static_website_input(
        self,
    ) -> typing.Optional[typing.List["StorageAccountStaticWebsite"]]:
        return jsii.get(self, "staticWebsiteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageAccountTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessTier")
    def access_tier(self) -> builtins.str:
        return jsii.get(self, "accessTier")

    @access_tier.setter # type: ignore
    def access_tier(self, value: builtins.str) -> None:
        jsii.set(self, "accessTier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountKind")
    def account_kind(self) -> builtins.str:
        return jsii.get(self, "accountKind")

    @account_kind.setter # type: ignore
    def account_kind(self, value: builtins.str) -> None:
        jsii.set(self, "accountKind", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountReplicationType")
    def account_replication_type(self) -> builtins.str:
        return jsii.get(self, "accountReplicationType")

    @account_replication_type.setter # type: ignore
    def account_replication_type(self, value: builtins.str) -> None:
        jsii.set(self, "accountReplicationType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accountTier")
    def account_tier(self) -> builtins.str:
        return jsii.get(self, "accountTier")

    @account_tier.setter # type: ignore
    def account_tier(self, value: builtins.str) -> None:
        jsii.set(self, "accountTier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowBlobPublicAccess")
    def allow_blob_public_access(self) -> builtins.bool:
        return jsii.get(self, "allowBlobPublicAccess")

    @allow_blob_public_access.setter # type: ignore
    def allow_blob_public_access(self, value: builtins.bool) -> None:
        jsii.set(self, "allowBlobPublicAccess", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="blobProperties")
    def blob_properties(self) -> typing.List["StorageAccountBlobProperties"]:
        return jsii.get(self, "blobProperties")

    @blob_properties.setter # type: ignore
    def blob_properties(
        self,
        value: typing.List["StorageAccountBlobProperties"],
    ) -> None:
        jsii.set(self, "blobProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDomain")
    def custom_domain(self) -> typing.List["StorageAccountCustomDomain"]:
        return jsii.get(self, "customDomain")

    @custom_domain.setter # type: ignore
    def custom_domain(self, value: typing.List["StorageAccountCustomDomain"]) -> None:
        jsii.set(self, "customDomain", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableHttpsTrafficOnly")
    def enable_https_traffic_only(self) -> builtins.bool:
        return jsii.get(self, "enableHttpsTrafficOnly")

    @enable_https_traffic_only.setter # type: ignore
    def enable_https_traffic_only(self, value: builtins.bool) -> None:
        jsii.set(self, "enableHttpsTrafficOnly", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["StorageAccountIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["StorageAccountIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="isHnsEnabled")
    def is_hns_enabled(self) -> builtins.bool:
        return jsii.get(self, "isHnsEnabled")

    @is_hns_enabled.setter # type: ignore
    def is_hns_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "isHnsEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="largeFileShareEnabled")
    def large_file_share_enabled(self) -> builtins.bool:
        return jsii.get(self, "largeFileShareEnabled")

    @large_file_share_enabled.setter # type: ignore
    def large_file_share_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "largeFileShareEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minTlsVersion")
    def min_tls_version(self) -> builtins.str:
        return jsii.get(self, "minTlsVersion")

    @min_tls_version.setter # type: ignore
    def min_tls_version(self, value: builtins.str) -> None:
        jsii.set(self, "minTlsVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkRules")
    def network_rules(self) -> typing.List["StorageAccountNetworkRules"]:
        return jsii.get(self, "networkRules")

    @network_rules.setter # type: ignore
    def network_rules(self, value: typing.List["StorageAccountNetworkRules"]) -> None:
        jsii.set(self, "networkRules", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queueProperties")
    def queue_properties(self) -> typing.List["StorageAccountQueueProperties"]:
        return jsii.get(self, "queueProperties")

    @queue_properties.setter # type: ignore
    def queue_properties(
        self,
        value: typing.List["StorageAccountQueueProperties"],
    ) -> None:
        jsii.set(self, "queueProperties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="staticWebsite")
    def static_website(self) -> typing.List["StorageAccountStaticWebsite"]:
        return jsii.get(self, "staticWebsite")

    @static_website.setter # type: ignore
    def static_website(self, value: typing.List["StorageAccountStaticWebsite"]) -> None:
        jsii.set(self, "staticWebsite", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageAccountTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageAccountTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageAccountBlobProperties",
    jsii_struct_bases=[],
    name_mapping={
        "cors_rule": "corsRule",
        "delete_retention_policy": "deleteRetentionPolicy",
    },
)
class StorageAccountBlobProperties:
    def __init__(
        self,
        *,
        cors_rule: typing.Optional[typing.List["StorageAccountBlobPropertiesCorsRule"]] = None,
        delete_retention_policy: typing.Optional[typing.List["StorageAccountBlobPropertiesDeleteRetentionPolicy"]] = None,
    ) -> None:
        """
        :param cors_rule: cors_rule block.
        :param delete_retention_policy: delete_retention_policy block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if cors_rule is not None:
            self._values["cors_rule"] = cors_rule
        if delete_retention_policy is not None:
            self._values["delete_retention_policy"] = delete_retention_policy

    @builtins.property
    def cors_rule(
        self,
    ) -> typing.Optional[typing.List["StorageAccountBlobPropertiesCorsRule"]]:
        """cors_rule block."""
        result = self._values.get("cors_rule")
        return result

    @builtins.property
    def delete_retention_policy(
        self,
    ) -> typing.Optional[typing.List["StorageAccountBlobPropertiesDeleteRetentionPolicy"]]:
        """delete_retention_policy block."""
        result = self._values.get("delete_retention_policy")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountBlobProperties(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountBlobPropertiesCorsRule",
    jsii_struct_bases=[],
    name_mapping={
        "allowed_headers": "allowedHeaders",
        "allowed_methods": "allowedMethods",
        "allowed_origins": "allowedOrigins",
        "exposed_headers": "exposedHeaders",
        "max_age_in_seconds": "maxAgeInSeconds",
    },
)
class StorageAccountBlobPropertiesCorsRule:
    def __init__(
        self,
        *,
        allowed_headers: typing.List[builtins.str],
        allowed_methods: typing.List[builtins.str],
        allowed_origins: typing.List[builtins.str],
        exposed_headers: typing.List[builtins.str],
        max_age_in_seconds: jsii.Number,
    ) -> None:
        """
        :param allowed_headers: -
        :param allowed_methods: -
        :param allowed_origins: -
        :param exposed_headers: -
        :param max_age_in_seconds: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_headers": allowed_headers,
            "allowed_methods": allowed_methods,
            "allowed_origins": allowed_origins,
            "exposed_headers": exposed_headers,
            "max_age_in_seconds": max_age_in_seconds,
        }

    @builtins.property
    def allowed_headers(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_headers")
        assert result is not None, "Required property 'allowed_headers' is missing"
        return result

    @builtins.property
    def allowed_methods(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_methods")
        assert result is not None, "Required property 'allowed_methods' is missing"
        return result

    @builtins.property
    def allowed_origins(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_origins")
        assert result is not None, "Required property 'allowed_origins' is missing"
        return result

    @builtins.property
    def exposed_headers(self) -> typing.List[builtins.str]:
        result = self._values.get("exposed_headers")
        assert result is not None, "Required property 'exposed_headers' is missing"
        return result

    @builtins.property
    def max_age_in_seconds(self) -> jsii.Number:
        result = self._values.get("max_age_in_seconds")
        assert result is not None, "Required property 'max_age_in_seconds' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountBlobPropertiesCorsRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountBlobPropertiesDeleteRetentionPolicy",
    jsii_struct_bases=[],
    name_mapping={"days": "days"},
)
class StorageAccountBlobPropertiesDeleteRetentionPolicy:
    def __init__(self, *, days: typing.Optional[jsii.Number] = None) -> None:
        """
        :param days: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if days is not None:
            self._values["days"] = days

    @builtins.property
    def days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountBlobPropertiesDeleteRetentionPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "account_replication_type": "accountReplicationType",
        "account_tier": "accountTier",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "access_tier": "accessTier",
        "account_kind": "accountKind",
        "allow_blob_public_access": "allowBlobPublicAccess",
        "blob_properties": "blobProperties",
        "custom_domain": "customDomain",
        "enable_https_traffic_only": "enableHttpsTrafficOnly",
        "identity": "identity",
        "is_hns_enabled": "isHnsEnabled",
        "large_file_share_enabled": "largeFileShareEnabled",
        "min_tls_version": "minTlsVersion",
        "network_rules": "networkRules",
        "queue_properties": "queueProperties",
        "static_website": "staticWebsite",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class StorageAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        account_replication_type: builtins.str,
        account_tier: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        access_tier: typing.Optional[builtins.str] = None,
        account_kind: typing.Optional[builtins.str] = None,
        allow_blob_public_access: typing.Optional[builtins.bool] = None,
        blob_properties: typing.Optional[typing.List[StorageAccountBlobProperties]] = None,
        custom_domain: typing.Optional[typing.List["StorageAccountCustomDomain"]] = None,
        enable_https_traffic_only: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["StorageAccountIdentity"]] = None,
        is_hns_enabled: typing.Optional[builtins.bool] = None,
        large_file_share_enabled: typing.Optional[builtins.bool] = None,
        min_tls_version: typing.Optional[builtins.str] = None,
        network_rules: typing.Optional[typing.List["StorageAccountNetworkRules"]] = None,
        queue_properties: typing.Optional[typing.List["StorageAccountQueueProperties"]] = None,
        static_website: typing.Optional[typing.List["StorageAccountStaticWebsite"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageAccountTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_replication_type: -
        :param account_tier: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param access_tier: -
        :param account_kind: -
        :param allow_blob_public_access: -
        :param blob_properties: blob_properties block.
        :param custom_domain: custom_domain block.
        :param enable_https_traffic_only: -
        :param identity: identity block.
        :param is_hns_enabled: -
        :param large_file_share_enabled: -
        :param min_tls_version: -
        :param network_rules: network_rules block.
        :param queue_properties: queue_properties block.
        :param static_website: static_website block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageAccountTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "account_replication_type": account_replication_type,
            "account_tier": account_tier,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if access_tier is not None:
            self._values["access_tier"] = access_tier
        if account_kind is not None:
            self._values["account_kind"] = account_kind
        if allow_blob_public_access is not None:
            self._values["allow_blob_public_access"] = allow_blob_public_access
        if blob_properties is not None:
            self._values["blob_properties"] = blob_properties
        if custom_domain is not None:
            self._values["custom_domain"] = custom_domain
        if enable_https_traffic_only is not None:
            self._values["enable_https_traffic_only"] = enable_https_traffic_only
        if identity is not None:
            self._values["identity"] = identity
        if is_hns_enabled is not None:
            self._values["is_hns_enabled"] = is_hns_enabled
        if large_file_share_enabled is not None:
            self._values["large_file_share_enabled"] = large_file_share_enabled
        if min_tls_version is not None:
            self._values["min_tls_version"] = min_tls_version
        if network_rules is not None:
            self._values["network_rules"] = network_rules
        if queue_properties is not None:
            self._values["queue_properties"] = queue_properties
        if static_website is not None:
            self._values["static_website"] = static_website
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def account_replication_type(self) -> builtins.str:
        result = self._values.get("account_replication_type")
        assert result is not None, "Required property 'account_replication_type' is missing"
        return result

    @builtins.property
    def account_tier(self) -> builtins.str:
        result = self._values.get("account_tier")
        assert result is not None, "Required property 'account_tier' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def access_tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("access_tier")
        return result

    @builtins.property
    def account_kind(self) -> typing.Optional[builtins.str]:
        result = self._values.get("account_kind")
        return result

    @builtins.property
    def allow_blob_public_access(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_blob_public_access")
        return result

    @builtins.property
    def blob_properties(
        self,
    ) -> typing.Optional[typing.List[StorageAccountBlobProperties]]:
        """blob_properties block."""
        result = self._values.get("blob_properties")
        return result

    @builtins.property
    def custom_domain(
        self,
    ) -> typing.Optional[typing.List["StorageAccountCustomDomain"]]:
        """custom_domain block."""
        result = self._values.get("custom_domain")
        return result

    @builtins.property
    def enable_https_traffic_only(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_https_traffic_only")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["StorageAccountIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def is_hns_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("is_hns_enabled")
        return result

    @builtins.property
    def large_file_share_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("large_file_share_enabled")
        return result

    @builtins.property
    def min_tls_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("min_tls_version")
        return result

    @builtins.property
    def network_rules(
        self,
    ) -> typing.Optional[typing.List["StorageAccountNetworkRules"]]:
        """network_rules block."""
        result = self._values.get("network_rules")
        return result

    @builtins.property
    def queue_properties(
        self,
    ) -> typing.Optional[typing.List["StorageAccountQueueProperties"]]:
        """queue_properties block."""
        result = self._values.get("queue_properties")
        return result

    @builtins.property
    def static_website(
        self,
    ) -> typing.Optional[typing.List["StorageAccountStaticWebsite"]]:
        """static_website block."""
        result = self._values.get("static_website")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageAccountTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountCustomDomain",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "use_subdomain": "useSubdomain"},
)
class StorageAccountCustomDomain:
    def __init__(
        self,
        *,
        name: builtins.str,
        use_subdomain: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param name: -
        :param use_subdomain: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if use_subdomain is not None:
            self._values["use_subdomain"] = use_subdomain

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def use_subdomain(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_subdomain")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountCustomDomain(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageAccountCustomerManagedKey(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageAccountCustomerManagedKey",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        key_name: builtins.str,
        key_vault_id: builtins.str,
        storage_account_id: builtins.str,
        key_version: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageAccountCustomerManagedKeyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param key_name: -
        :param key_vault_id: -
        :param storage_account_id: -
        :param key_version: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageAccountCustomerManagedKeyConfig(
            key_name=key_name,
            key_vault_id=key_vault_id,
            storage_account_id=storage_account_id,
            key_version=key_version,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageAccountCustomerManagedKey, self, [scope, id, config])

    @jsii.member(jsii_name="resetKeyVersion")
    def reset_key_version(self) -> None:
        return jsii.invoke(self, "resetKeyVersion", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyNameInput")
    def key_name_input(self) -> builtins.str:
        return jsii.get(self, "keyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultIdInput")
    def key_vault_id_input(self) -> builtins.str:
        return jsii.get(self, "keyVaultIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVersionInput")
    def key_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "keyVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StorageAccountCustomerManagedKeyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyName")
    def key_name(self) -> builtins.str:
        return jsii.get(self, "keyName")

    @key_name.setter # type: ignore
    def key_name(self, value: builtins.str) -> None:
        jsii.set(self, "keyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultId")
    def key_vault_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultId")

    @key_vault_id.setter # type: ignore
    def key_vault_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVersion")
    def key_version(self) -> builtins.str:
        return jsii.get(self, "keyVersion")

    @key_version.setter # type: ignore
    def key_version(self, value: builtins.str) -> None:
        jsii.set(self, "keyVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageAccountCustomerManagedKeyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageAccountCustomerManagedKeyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageAccountCustomerManagedKeyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "key_name": "keyName",
        "key_vault_id": "keyVaultId",
        "storage_account_id": "storageAccountId",
        "key_version": "keyVersion",
        "timeouts": "timeouts",
    },
)
class StorageAccountCustomerManagedKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        key_name: builtins.str,
        key_vault_id: builtins.str,
        storage_account_id: builtins.str,
        key_version: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageAccountCustomerManagedKeyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_name: -
        :param key_vault_id: -
        :param storage_account_id: -
        :param key_version: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageAccountCustomerManagedKeyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "key_name": key_name,
            "key_vault_id": key_vault_id,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if key_version is not None:
            self._values["key_version"] = key_version
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def key_name(self) -> builtins.str:
        result = self._values.get("key_name")
        assert result is not None, "Required property 'key_name' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def key_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_version")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageAccountCustomerManagedKeyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountCustomerManagedKeyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountCustomerManagedKeyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageAccountCustomerManagedKeyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountCustomerManagedKeyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class StorageAccountIdentity:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountNetworkRules",
    jsii_struct_bases=[],
    name_mapping={
        "default_action": "defaultAction",
        "bypass": "bypass",
        "ip_rules": "ipRules",
        "virtual_network_subnet_ids": "virtualNetworkSubnetIds",
    },
)
class StorageAccountNetworkRules:
    def __init__(
        self,
        *,
        default_action: builtins.str,
        bypass: typing.Optional[typing.List[builtins.str]] = None,
        ip_rules: typing.Optional[typing.List[builtins.str]] = None,
        virtual_network_subnet_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param default_action: -
        :param bypass: -
        :param ip_rules: -
        :param virtual_network_subnet_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "default_action": default_action,
        }
        if bypass is not None:
            self._values["bypass"] = bypass
        if ip_rules is not None:
            self._values["ip_rules"] = ip_rules
        if virtual_network_subnet_ids is not None:
            self._values["virtual_network_subnet_ids"] = virtual_network_subnet_ids

    @builtins.property
    def default_action(self) -> builtins.str:
        result = self._values.get("default_action")
        assert result is not None, "Required property 'default_action' is missing"
        return result

    @builtins.property
    def bypass(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("bypass")
        return result

    @builtins.property
    def ip_rules(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ip_rules")
        return result

    @builtins.property
    def virtual_network_subnet_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("virtual_network_subnet_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountNetworkRules(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageAccountNetworkRulesA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageAccountNetworkRulesA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        default_action: builtins.str,
        resource_group_name: builtins.str,
        storage_account_name: builtins.str,
        bypass: typing.Optional[typing.List[builtins.str]] = None,
        ip_rules: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["StorageAccountNetworkRulesTimeouts"] = None,
        virtual_network_subnet_ids: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param default_action: -
        :param resource_group_name: -
        :param storage_account_name: -
        :param bypass: -
        :param ip_rules: -
        :param timeouts: timeouts block.
        :param virtual_network_subnet_ids: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageAccountNetworkRulesAConfig(
            default_action=default_action,
            resource_group_name=resource_group_name,
            storage_account_name=storage_account_name,
            bypass=bypass,
            ip_rules=ip_rules,
            timeouts=timeouts,
            virtual_network_subnet_ids=virtual_network_subnet_ids,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageAccountNetworkRulesA, self, [scope, id, config])

    @jsii.member(jsii_name="resetBypass")
    def reset_bypass(self) -> None:
        return jsii.invoke(self, "resetBypass", [])

    @jsii.member(jsii_name="resetIpRules")
    def reset_ip_rules(self) -> None:
        return jsii.invoke(self, "resetIpRules", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVirtualNetworkSubnetIds")
    def reset_virtual_network_subnet_ids(self) -> None:
        return jsii.invoke(self, "resetVirtualNetworkSubnetIds", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultActionInput")
    def default_action_input(self) -> builtins.str:
        return jsii.get(self, "defaultActionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bypassInput")
    def bypass_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "bypassInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRulesInput")
    def ip_rules_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "ipRulesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageAccountNetworkRulesTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetIdsInput")
    def virtual_network_subnet_ids_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "virtualNetworkSubnetIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bypass")
    def bypass(self) -> typing.List[builtins.str]:
        return jsii.get(self, "bypass")

    @bypass.setter # type: ignore
    def bypass(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "bypass", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultAction")
    def default_action(self) -> builtins.str:
        return jsii.get(self, "defaultAction")

    @default_action.setter # type: ignore
    def default_action(self, value: builtins.str) -> None:
        jsii.set(self, "defaultAction", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipRules")
    def ip_rules(self) -> typing.List[builtins.str]:
        return jsii.get(self, "ipRules")

    @ip_rules.setter # type: ignore
    def ip_rules(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "ipRules", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageAccountNetworkRulesTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageAccountNetworkRulesTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkSubnetIds")
    def virtual_network_subnet_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "virtualNetworkSubnetIds")

    @virtual_network_subnet_ids.setter # type: ignore
    def virtual_network_subnet_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "virtualNetworkSubnetIds", value)


@jsii.data_type(
    jsii_type="azurerm.StorageAccountNetworkRulesAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "default_action": "defaultAction",
        "resource_group_name": "resourceGroupName",
        "storage_account_name": "storageAccountName",
        "bypass": "bypass",
        "ip_rules": "ipRules",
        "timeouts": "timeouts",
        "virtual_network_subnet_ids": "virtualNetworkSubnetIds",
    },
)
class StorageAccountNetworkRulesAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        default_action: builtins.str,
        resource_group_name: builtins.str,
        storage_account_name: builtins.str,
        bypass: typing.Optional[typing.List[builtins.str]] = None,
        ip_rules: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["StorageAccountNetworkRulesTimeouts"] = None,
        virtual_network_subnet_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param default_action: -
        :param resource_group_name: -
        :param storage_account_name: -
        :param bypass: -
        :param ip_rules: -
        :param timeouts: timeouts block.
        :param virtual_network_subnet_ids: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageAccountNetworkRulesTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "default_action": default_action,
            "resource_group_name": resource_group_name,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if bypass is not None:
            self._values["bypass"] = bypass
        if ip_rules is not None:
            self._values["ip_rules"] = ip_rules
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if virtual_network_subnet_ids is not None:
            self._values["virtual_network_subnet_ids"] = virtual_network_subnet_ids

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def default_action(self) -> builtins.str:
        result = self._values.get("default_action")
        assert result is not None, "Required property 'default_action' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def bypass(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("bypass")
        return result

    @builtins.property
    def ip_rules(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("ip_rules")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageAccountNetworkRulesTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def virtual_network_subnet_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("virtual_network_subnet_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountNetworkRulesAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountNetworkRulesTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageAccountNetworkRulesTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountNetworkRulesTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountQueueProperties",
    jsii_struct_bases=[],
    name_mapping={
        "cors_rule": "corsRule",
        "hour_metrics": "hourMetrics",
        "logging": "logging",
        "minute_metrics": "minuteMetrics",
    },
)
class StorageAccountQueueProperties:
    def __init__(
        self,
        *,
        cors_rule: typing.Optional[typing.List["StorageAccountQueuePropertiesCorsRule"]] = None,
        hour_metrics: typing.Optional[typing.List["StorageAccountQueuePropertiesHourMetrics"]] = None,
        logging: typing.Optional[typing.List["StorageAccountQueuePropertiesLogging"]] = None,
        minute_metrics: typing.Optional[typing.List["StorageAccountQueuePropertiesMinuteMetrics"]] = None,
    ) -> None:
        """
        :param cors_rule: cors_rule block.
        :param hour_metrics: hour_metrics block.
        :param logging: logging block.
        :param minute_metrics: minute_metrics block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if cors_rule is not None:
            self._values["cors_rule"] = cors_rule
        if hour_metrics is not None:
            self._values["hour_metrics"] = hour_metrics
        if logging is not None:
            self._values["logging"] = logging
        if minute_metrics is not None:
            self._values["minute_metrics"] = minute_metrics

    @builtins.property
    def cors_rule(
        self,
    ) -> typing.Optional[typing.List["StorageAccountQueuePropertiesCorsRule"]]:
        """cors_rule block."""
        result = self._values.get("cors_rule")
        return result

    @builtins.property
    def hour_metrics(
        self,
    ) -> typing.Optional[typing.List["StorageAccountQueuePropertiesHourMetrics"]]:
        """hour_metrics block."""
        result = self._values.get("hour_metrics")
        return result

    @builtins.property
    def logging(
        self,
    ) -> typing.Optional[typing.List["StorageAccountQueuePropertiesLogging"]]:
        """logging block."""
        result = self._values.get("logging")
        return result

    @builtins.property
    def minute_metrics(
        self,
    ) -> typing.Optional[typing.List["StorageAccountQueuePropertiesMinuteMetrics"]]:
        """minute_metrics block."""
        result = self._values.get("minute_metrics")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountQueueProperties(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountQueuePropertiesCorsRule",
    jsii_struct_bases=[],
    name_mapping={
        "allowed_headers": "allowedHeaders",
        "allowed_methods": "allowedMethods",
        "allowed_origins": "allowedOrigins",
        "exposed_headers": "exposedHeaders",
        "max_age_in_seconds": "maxAgeInSeconds",
    },
)
class StorageAccountQueuePropertiesCorsRule:
    def __init__(
        self,
        *,
        allowed_headers: typing.List[builtins.str],
        allowed_methods: typing.List[builtins.str],
        allowed_origins: typing.List[builtins.str],
        exposed_headers: typing.List[builtins.str],
        max_age_in_seconds: jsii.Number,
    ) -> None:
        """
        :param allowed_headers: -
        :param allowed_methods: -
        :param allowed_origins: -
        :param exposed_headers: -
        :param max_age_in_seconds: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "allowed_headers": allowed_headers,
            "allowed_methods": allowed_methods,
            "allowed_origins": allowed_origins,
            "exposed_headers": exposed_headers,
            "max_age_in_seconds": max_age_in_seconds,
        }

    @builtins.property
    def allowed_headers(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_headers")
        assert result is not None, "Required property 'allowed_headers' is missing"
        return result

    @builtins.property
    def allowed_methods(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_methods")
        assert result is not None, "Required property 'allowed_methods' is missing"
        return result

    @builtins.property
    def allowed_origins(self) -> typing.List[builtins.str]:
        result = self._values.get("allowed_origins")
        assert result is not None, "Required property 'allowed_origins' is missing"
        return result

    @builtins.property
    def exposed_headers(self) -> typing.List[builtins.str]:
        result = self._values.get("exposed_headers")
        assert result is not None, "Required property 'exposed_headers' is missing"
        return result

    @builtins.property
    def max_age_in_seconds(self) -> jsii.Number:
        result = self._values.get("max_age_in_seconds")
        assert result is not None, "Required property 'max_age_in_seconds' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountQueuePropertiesCorsRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountQueuePropertiesHourMetrics",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "version": "version",
        "include_apis": "includeApis",
        "retention_policy_days": "retentionPolicyDays",
    },
)
class StorageAccountQueuePropertiesHourMetrics:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        version: builtins.str,
        include_apis: typing.Optional[builtins.bool] = None,
        retention_policy_days: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param enabled: -
        :param version: -
        :param include_apis: -
        :param retention_policy_days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "version": version,
        }
        if include_apis is not None:
            self._values["include_apis"] = include_apis
        if retention_policy_days is not None:
            self._values["retention_policy_days"] = retention_policy_days

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def include_apis(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("include_apis")
        return result

    @builtins.property
    def retention_policy_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_policy_days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountQueuePropertiesHourMetrics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountQueuePropertiesLogging",
    jsii_struct_bases=[],
    name_mapping={
        "delete": "delete",
        "read": "read",
        "version": "version",
        "write": "write",
        "retention_policy_days": "retentionPolicyDays",
    },
)
class StorageAccountQueuePropertiesLogging:
    def __init__(
        self,
        *,
        delete: builtins.bool,
        read: builtins.bool,
        version: builtins.str,
        write: builtins.bool,
        retention_policy_days: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param delete: -
        :param read: -
        :param version: -
        :param write: -
        :param retention_policy_days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "delete": delete,
            "read": read,
            "version": version,
            "write": write,
        }
        if retention_policy_days is not None:
            self._values["retention_policy_days"] = retention_policy_days

    @builtins.property
    def delete(self) -> builtins.bool:
        result = self._values.get("delete")
        assert result is not None, "Required property 'delete' is missing"
        return result

    @builtins.property
    def read(self) -> builtins.bool:
        result = self._values.get("read")
        assert result is not None, "Required property 'read' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def write(self) -> builtins.bool:
        result = self._values.get("write")
        assert result is not None, "Required property 'write' is missing"
        return result

    @builtins.property
    def retention_policy_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_policy_days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountQueuePropertiesLogging(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountQueuePropertiesMinuteMetrics",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "version": "version",
        "include_apis": "includeApis",
        "retention_policy_days": "retentionPolicyDays",
    },
)
class StorageAccountQueuePropertiesMinuteMetrics:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        version: builtins.str,
        include_apis: typing.Optional[builtins.bool] = None,
        retention_policy_days: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param enabled: -
        :param version: -
        :param include_apis: -
        :param retention_policy_days: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "version": version,
        }
        if include_apis is not None:
            self._values["include_apis"] = include_apis
        if retention_policy_days is not None:
            self._values["retention_policy_days"] = retention_policy_days

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def include_apis(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("include_apis")
        return result

    @builtins.property
    def retention_policy_days(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("retention_policy_days")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountQueuePropertiesMinuteMetrics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountStaticWebsite",
    jsii_struct_bases=[],
    name_mapping={
        "error404_document": "error404Document",
        "index_document": "indexDocument",
    },
)
class StorageAccountStaticWebsite:
    def __init__(
        self,
        *,
        error404_document: typing.Optional[builtins.str] = None,
        index_document: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param error404_document: -
        :param index_document: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if error404_document is not None:
            self._values["error404_document"] = error404_document
        if index_document is not None:
            self._values["index_document"] = index_document

    @builtins.property
    def error404_document(self) -> typing.Optional[builtins.str]:
        result = self._values.get("error404_document")
        return result

    @builtins.property
    def index_document(self) -> typing.Optional[builtins.str]:
        result = self._values.get("index_document")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountStaticWebsite(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageAccountTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageAccountTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageAccountTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageBlob(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageBlob",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        type: builtins.str,
        access_tier: typing.Optional[builtins.str] = None,
        content_md5: typing.Optional[builtins.str] = None,
        content_type: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        parallelism: typing.Optional[jsii.Number] = None,
        size: typing.Optional[jsii.Number] = None,
        source: typing.Optional[builtins.str] = None,
        source_content: typing.Optional[builtins.str] = None,
        source_uri: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageBlobTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param type: -
        :param access_tier: -
        :param content_md5: -
        :param content_type: -
        :param metadata: -
        :param parallelism: -
        :param size: -
        :param source: -
        :param source_content: -
        :param source_uri: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBlobConfig(
            name=name,
            storage_account_name=storage_account_name,
            storage_container_name=storage_container_name,
            type=type,
            access_tier=access_tier,
            content_md5=content_md5,
            content_type=content_type,
            metadata=metadata,
            parallelism=parallelism,
            size=size,
            source=source,
            source_content=source_content,
            source_uri=source_uri,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageBlob, self, [scope, id, config])

    @jsii.member(jsii_name="resetAccessTier")
    def reset_access_tier(self) -> None:
        return jsii.invoke(self, "resetAccessTier", [])

    @jsii.member(jsii_name="resetContentMd5")
    def reset_content_md5(self) -> None:
        return jsii.invoke(self, "resetContentMd5", [])

    @jsii.member(jsii_name="resetContentType")
    def reset_content_type(self) -> None:
        return jsii.invoke(self, "resetContentType", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetParallelism")
    def reset_parallelism(self) -> None:
        return jsii.invoke(self, "resetParallelism", [])

    @jsii.member(jsii_name="resetSize")
    def reset_size(self) -> None:
        return jsii.invoke(self, "resetSize", [])

    @jsii.member(jsii_name="resetSource")
    def reset_source(self) -> None:
        return jsii.invoke(self, "resetSource", [])

    @jsii.member(jsii_name="resetSourceContent")
    def reset_source_content(self) -> None:
        return jsii.invoke(self, "resetSourceContent", [])

    @jsii.member(jsii_name="resetSourceUri")
    def reset_source_uri(self) -> None:
        return jsii.invoke(self, "resetSourceUri", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerNameInput")
    def storage_container_name_input(self) -> builtins.str:
        return jsii.get(self, "storageContainerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="url")
    def url(self) -> builtins.str:
        return jsii.get(self, "url")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessTierInput")
    def access_tier_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "accessTierInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentMd5Input")
    def content_md5_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentMd5Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypeInput")
    def content_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parallelismInput")
    def parallelism_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "parallelismInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInput")
    def size_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "sizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceContentInput")
    def source_content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceInput")
    def source_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUriInput")
    def source_uri_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceUriInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageBlobTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="accessTier")
    def access_tier(self) -> builtins.str:
        return jsii.get(self, "accessTier")

    @access_tier.setter # type: ignore
    def access_tier(self, value: builtins.str) -> None:
        jsii.set(self, "accessTier", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentMd5")
    def content_md5(self) -> builtins.str:
        return jsii.get(self, "contentMd5")

    @content_md5.setter # type: ignore
    def content_md5(self, value: builtins.str) -> None:
        jsii.set(self, "contentMd5", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")

    @content_type.setter # type: ignore
    def content_type(self, value: builtins.str) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parallelism")
    def parallelism(self) -> jsii.Number:
        return jsii.get(self, "parallelism")

    @parallelism.setter # type: ignore
    def parallelism(self, value: jsii.Number) -> None:
        jsii.set(self, "parallelism", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @size.setter # type: ignore
    def size(self, value: jsii.Number) -> None:
        jsii.set(self, "size", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="source")
    def source(self) -> builtins.str:
        return jsii.get(self, "source")

    @source.setter # type: ignore
    def source(self, value: builtins.str) -> None:
        jsii.set(self, "source", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceContent")
    def source_content(self) -> builtins.str:
        return jsii.get(self, "sourceContent")

    @source_content.setter # type: ignore
    def source_content(self, value: builtins.str) -> None:
        jsii.set(self, "sourceContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceUri")
    def source_uri(self) -> builtins.str:
        return jsii.get(self, "sourceUri")

    @source_uri.setter # type: ignore
    def source_uri(self, value: builtins.str) -> None:
        jsii.set(self, "sourceUri", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerName")
    def storage_container_name(self) -> builtins.str:
        return jsii.get(self, "storageContainerName")

    @storage_container_name.setter # type: ignore
    def storage_container_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageContainerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageBlobTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageBlobTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(
    jsii_type="azurerm.StorageBlobConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_name": "storageAccountName",
        "storage_container_name": "storageContainerName",
        "type": "type",
        "access_tier": "accessTier",
        "content_md5": "contentMd5",
        "content_type": "contentType",
        "metadata": "metadata",
        "parallelism": "parallelism",
        "size": "size",
        "source": "source",
        "source_content": "sourceContent",
        "source_uri": "sourceUri",
        "timeouts": "timeouts",
    },
)
class StorageBlobConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        type: builtins.str,
        access_tier: typing.Optional[builtins.str] = None,
        content_md5: typing.Optional[builtins.str] = None,
        content_type: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        parallelism: typing.Optional[jsii.Number] = None,
        size: typing.Optional[jsii.Number] = None,
        source: typing.Optional[builtins.str] = None,
        source_content: typing.Optional[builtins.str] = None,
        source_uri: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageBlobTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param type: -
        :param access_tier: -
        :param content_md5: -
        :param content_type: -
        :param metadata: -
        :param parallelism: -
        :param size: -
        :param source: -
        :param source_content: -
        :param source_uri: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageBlobTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_name": storage_account_name,
            "storage_container_name": storage_container_name,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if access_tier is not None:
            self._values["access_tier"] = access_tier
        if content_md5 is not None:
            self._values["content_md5"] = content_md5
        if content_type is not None:
            self._values["content_type"] = content_type
        if metadata is not None:
            self._values["metadata"] = metadata
        if parallelism is not None:
            self._values["parallelism"] = parallelism
        if size is not None:
            self._values["size"] = size
        if source is not None:
            self._values["source"] = source
        if source_content is not None:
            self._values["source_content"] = source_content
        if source_uri is not None:
            self._values["source_uri"] = source_uri
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def storage_container_name(self) -> builtins.str:
        result = self._values.get("storage_container_name")
        assert result is not None, "Required property 'storage_container_name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def access_tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("access_tier")
        return result

    @builtins.property
    def content_md5(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_md5")
        return result

    @builtins.property
    def content_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_type")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def parallelism(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("parallelism")
        return result

    @builtins.property
    def size(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("size")
        return result

    @builtins.property
    def source(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source")
        return result

    @builtins.property
    def source_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_content")
        return result

    @builtins.property
    def source_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_uri")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageBlobTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageBlobConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageBlobTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageBlobTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageBlobTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageContainer(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageContainer",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_name: builtins.str,
        container_access_type: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageContainerTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_name: -
        :param container_access_type: -
        :param metadata: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageContainerConfig(
            name=name,
            storage_account_name=storage_account_name,
            container_access_type=container_access_type,
            metadata=metadata,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageContainer, self, [scope, id, config])

    @jsii.member(jsii_name="resetContainerAccessType")
    def reset_container_access_type(self) -> None:
        return jsii.invoke(self, "resetContainerAccessType", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hasImmutabilityPolicy")
    def has_immutability_policy(self) -> builtins.bool:
        return jsii.get(self, "hasImmutabilityPolicy")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hasLegalHold")
    def has_legal_hold(self) -> builtins.bool:
        return jsii.get(self, "hasLegalHold")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceManagerId")
    def resource_manager_id(self) -> builtins.str:
        return jsii.get(self, "resourceManagerId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerAccessTypeInput")
    def container_access_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "containerAccessTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageContainerTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="containerAccessType")
    def container_access_type(self) -> builtins.str:
        return jsii.get(self, "containerAccessType")

    @container_access_type.setter # type: ignore
    def container_access_type(self, value: builtins.str) -> None:
        jsii.set(self, "containerAccessType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageContainerTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageContainerTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageContainerConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_name": "storageAccountName",
        "container_access_type": "containerAccessType",
        "metadata": "metadata",
        "timeouts": "timeouts",
    },
)
class StorageContainerConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_name: builtins.str,
        container_access_type: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageContainerTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_name: -
        :param container_access_type: -
        :param metadata: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageContainerTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if container_access_type is not None:
            self._values["container_access_type"] = container_access_type
        if metadata is not None:
            self._values["metadata"] = metadata
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def container_access_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("container_access_type")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageContainerTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageContainerConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageContainerTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageContainerTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageContainerTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageDataLakeGen2Filesystem(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageDataLakeGen2Filesystem",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_id: builtins.str,
        properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageDataLakeGen2FilesystemTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_id: -
        :param properties: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageDataLakeGen2FilesystemConfig(
            name=name,
            storage_account_id=storage_account_id,
            properties=properties,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageDataLakeGen2Filesystem, self, [scope, id, config])

    @jsii.member(jsii_name="resetProperties")
    def reset_properties(self) -> None:
        return jsii.invoke(self, "resetProperties", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="propertiesInput")
    def properties_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "propertiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StorageDataLakeGen2FilesystemTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="properties")
    def properties(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "properties")

    @properties.setter # type: ignore
    def properties(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "properties", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageDataLakeGen2FilesystemTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageDataLakeGen2FilesystemTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageDataLakeGen2FilesystemConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_id": "storageAccountId",
        "properties": "properties",
        "timeouts": "timeouts",
    },
)
class StorageDataLakeGen2FilesystemConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_id: builtins.str,
        properties: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageDataLakeGen2FilesystemTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_id: -
        :param properties: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageDataLakeGen2FilesystemTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if properties is not None:
            self._values["properties"] = properties
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("properties")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageDataLakeGen2FilesystemTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageDataLakeGen2FilesystemConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageDataLakeGen2FilesystemTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageDataLakeGen2FilesystemTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageDataLakeGen2FilesystemTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageDataLakeGen2Path(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageDataLakeGen2Path",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        filesystem_name: builtins.str,
        path: builtins.str,
        resource: builtins.str,
        storage_account_id: builtins.str,
        ace: typing.Optional[typing.List["StorageDataLakeGen2PathAce"]] = None,
        group: typing.Optional[builtins.str] = None,
        owner: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageDataLakeGen2PathTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param filesystem_name: -
        :param path: -
        :param resource: -
        :param storage_account_id: -
        :param ace: ace block.
        :param group: -
        :param owner: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageDataLakeGen2PathConfig(
            filesystem_name=filesystem_name,
            path=path,
            resource=resource,
            storage_account_id=storage_account_id,
            ace=ace,
            group=group,
            owner=owner,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageDataLakeGen2Path, self, [scope, id, config])

    @jsii.member(jsii_name="resetAce")
    def reset_ace(self) -> None:
        return jsii.invoke(self, "resetAce", [])

    @jsii.member(jsii_name="resetGroup")
    def reset_group(self) -> None:
        return jsii.invoke(self, "resetGroup", [])

    @jsii.member(jsii_name="resetOwner")
    def reset_owner(self) -> None:
        return jsii.invoke(self, "resetOwner", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filesystemNameInput")
    def filesystem_name_input(self) -> builtins.str:
        return jsii.get(self, "filesystemNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathInput")
    def path_input(self) -> builtins.str:
        return jsii.get(self, "pathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceInput")
    def resource_input(self) -> builtins.str:
        return jsii.get(self, "resourceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aceInput")
    def ace_input(self) -> typing.Optional[typing.List["StorageDataLakeGen2PathAce"]]:
        return jsii.get(self, "aceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="groupInput")
    def group_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "groupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ownerInput")
    def owner_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "ownerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageDataLakeGen2PathTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ace")
    def ace(self) -> typing.List["StorageDataLakeGen2PathAce"]:
        return jsii.get(self, "ace")

    @ace.setter # type: ignore
    def ace(self, value: typing.List["StorageDataLakeGen2PathAce"]) -> None:
        jsii.set(self, "ace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="filesystemName")
    def filesystem_name(self) -> builtins.str:
        return jsii.get(self, "filesystemName")

    @filesystem_name.setter # type: ignore
    def filesystem_name(self, value: builtins.str) -> None:
        jsii.set(self, "filesystemName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="group")
    def group(self) -> builtins.str:
        return jsii.get(self, "group")

    @group.setter # type: ignore
    def group(self, value: builtins.str) -> None:
        jsii.set(self, "group", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="owner")
    def owner(self) -> builtins.str:
        return jsii.get(self, "owner")

    @owner.setter # type: ignore
    def owner(self, value: builtins.str) -> None:
        jsii.set(self, "owner", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="path")
    def path(self) -> builtins.str:
        return jsii.get(self, "path")

    @path.setter # type: ignore
    def path(self, value: builtins.str) -> None:
        jsii.set(self, "path", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resource")
    def resource(self) -> builtins.str:
        return jsii.get(self, "resource")

    @resource.setter # type: ignore
    def resource(self, value: builtins.str) -> None:
        jsii.set(self, "resource", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageDataLakeGen2PathTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageDataLakeGen2PathTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageDataLakeGen2PathAce",
    jsii_struct_bases=[],
    name_mapping={
        "permissions": "permissions",
        "type": "type",
        "id": "id",
        "scope": "scope",
    },
)
class StorageDataLakeGen2PathAce:
    def __init__(
        self,
        *,
        permissions: builtins.str,
        type: builtins.str,
        id: typing.Optional[builtins.str] = None,
        scope: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param permissions: -
        :param type: -
        :param id: -
        :param scope: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "permissions": permissions,
            "type": type,
        }
        if id is not None:
            self._values["id"] = id
        if scope is not None:
            self._values["scope"] = scope

    @builtins.property
    def permissions(self) -> builtins.str:
        result = self._values.get("permissions")
        assert result is not None, "Required property 'permissions' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("id")
        return result

    @builtins.property
    def scope(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scope")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageDataLakeGen2PathAce(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageDataLakeGen2PathConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "filesystem_name": "filesystemName",
        "path": "path",
        "resource": "resource",
        "storage_account_id": "storageAccountId",
        "ace": "ace",
        "group": "group",
        "owner": "owner",
        "timeouts": "timeouts",
    },
)
class StorageDataLakeGen2PathConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        filesystem_name: builtins.str,
        path: builtins.str,
        resource: builtins.str,
        storage_account_id: builtins.str,
        ace: typing.Optional[typing.List[StorageDataLakeGen2PathAce]] = None,
        group: typing.Optional[builtins.str] = None,
        owner: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageDataLakeGen2PathTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filesystem_name: -
        :param path: -
        :param resource: -
        :param storage_account_id: -
        :param ace: ace block.
        :param group: -
        :param owner: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageDataLakeGen2PathTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "filesystem_name": filesystem_name,
            "path": path,
            "resource": resource,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if ace is not None:
            self._values["ace"] = ace
        if group is not None:
            self._values["group"] = group
        if owner is not None:
            self._values["owner"] = owner
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def filesystem_name(self) -> builtins.str:
        result = self._values.get("filesystem_name")
        assert result is not None, "Required property 'filesystem_name' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    @builtins.property
    def resource(self) -> builtins.str:
        result = self._values.get("resource")
        assert result is not None, "Required property 'resource' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def ace(self) -> typing.Optional[typing.List[StorageDataLakeGen2PathAce]]:
        """ace block."""
        result = self._values.get("ace")
        return result

    @builtins.property
    def group(self) -> typing.Optional[builtins.str]:
        result = self._values.get("group")
        return result

    @builtins.property
    def owner(self) -> typing.Optional[builtins.str]:
        result = self._values.get("owner")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageDataLakeGen2PathTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageDataLakeGen2PathConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageDataLakeGen2PathTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageDataLakeGen2PathTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageDataLakeGen2PathTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageEncryptionScope(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageEncryptionScope",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        source: builtins.str,
        storage_account_id: builtins.str,
        key_vault_key_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageEncryptionScopeTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param source: -
        :param storage_account_id: -
        :param key_vault_key_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageEncryptionScopeConfig(
            name=name,
            source=source,
            storage_account_id=storage_account_id,
            key_vault_key_id=key_vault_key_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageEncryptionScope, self, [scope, id, config])

    @jsii.member(jsii_name="resetKeyVaultKeyId")
    def reset_key_vault_key_id(self) -> None:
        return jsii.invoke(self, "resetKeyVaultKeyId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceInput")
    def source_input(self) -> builtins.str:
        return jsii.get(self, "sourceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyIdInput")
    def key_vault_key_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "keyVaultKeyIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageEncryptionScopeTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="keyVaultKeyId")
    def key_vault_key_id(self) -> builtins.str:
        return jsii.get(self, "keyVaultKeyId")

    @key_vault_key_id.setter # type: ignore
    def key_vault_key_id(self, value: builtins.str) -> None:
        jsii.set(self, "keyVaultKeyId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="source")
    def source(self) -> builtins.str:
        return jsii.get(self, "source")

    @source.setter # type: ignore
    def source(self, value: builtins.str) -> None:
        jsii.set(self, "source", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageEncryptionScopeTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageEncryptionScopeTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageEncryptionScopeConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "source": "source",
        "storage_account_id": "storageAccountId",
        "key_vault_key_id": "keyVaultKeyId",
        "timeouts": "timeouts",
    },
)
class StorageEncryptionScopeConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        source: builtins.str,
        storage_account_id: builtins.str,
        key_vault_key_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageEncryptionScopeTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param source: -
        :param storage_account_id: -
        :param key_vault_key_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageEncryptionScopeTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "source": source,
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if key_vault_key_id is not None:
            self._values["key_vault_key_id"] = key_vault_key_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def source(self) -> builtins.str:
        result = self._values.get("source")
        assert result is not None, "Required property 'source' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def key_vault_key_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_vault_key_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageEncryptionScopeTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageEncryptionScopeConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageEncryptionScopeTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageEncryptionScopeTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageEncryptionScopeTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageManagementPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageManagementPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        storage_account_id: builtins.str,
        rule: typing.Optional[typing.List["StorageManagementPolicyRule"]] = None,
        timeouts: typing.Optional["StorageManagementPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param storage_account_id: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageManagementPolicyConfig(
            storage_account_id=storage_account_id,
            rule=rule,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageManagementPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetRule")
    def reset_rule(self) -> None:
        return jsii.invoke(self, "resetRule", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ruleInput")
    def rule_input(self) -> typing.Optional[typing.List["StorageManagementPolicyRule"]]:
        return jsii.get(self, "ruleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageManagementPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rule")
    def rule(self) -> typing.List["StorageManagementPolicyRule"]:
        return jsii.get(self, "rule")

    @rule.setter # type: ignore
    def rule(self, value: typing.List["StorageManagementPolicyRule"]) -> None:
        jsii.set(self, "rule", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageManagementPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageManagementPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageManagementPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "storage_account_id": "storageAccountId",
        "rule": "rule",
        "timeouts": "timeouts",
    },
)
class StorageManagementPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        storage_account_id: builtins.str,
        rule: typing.Optional[typing.List["StorageManagementPolicyRule"]] = None,
        timeouts: typing.Optional["StorageManagementPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param storage_account_id: -
        :param rule: rule block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageManagementPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "storage_account_id": storage_account_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if rule is not None:
            self._values["rule"] = rule
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def rule(self) -> typing.Optional[typing.List["StorageManagementPolicyRule"]]:
        """rule block."""
        result = self._values.get("rule")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageManagementPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageManagementPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageManagementPolicyRule",
    jsii_struct_bases=[],
    name_mapping={
        "actions": "actions",
        "enabled": "enabled",
        "name": "name",
        "filters": "filters",
    },
)
class StorageManagementPolicyRule:
    def __init__(
        self,
        *,
        actions: typing.List["StorageManagementPolicyRuleActions"],
        enabled: builtins.bool,
        name: builtins.str,
        filters: typing.Optional[typing.List["StorageManagementPolicyRuleFilters"]] = None,
    ) -> None:
        """
        :param actions: actions block.
        :param enabled: -
        :param name: -
        :param filters: filters block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "actions": actions,
            "enabled": enabled,
            "name": name,
        }
        if filters is not None:
            self._values["filters"] = filters

    @builtins.property
    def actions(self) -> typing.List["StorageManagementPolicyRuleActions"]:
        """actions block."""
        result = self._values.get("actions")
        assert result is not None, "Required property 'actions' is missing"
        return result

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def filters(
        self,
    ) -> typing.Optional[typing.List["StorageManagementPolicyRuleFilters"]]:
        """filters block."""
        result = self._values.get("filters")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageManagementPolicyRule(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageManagementPolicyRuleActions",
    jsii_struct_bases=[],
    name_mapping={"base_blob": "baseBlob", "snapshot": "snapshot"},
)
class StorageManagementPolicyRuleActions:
    def __init__(
        self,
        *,
        base_blob: typing.Optional[typing.List["StorageManagementPolicyRuleActionsBaseBlob"]] = None,
        snapshot: typing.Optional[typing.List["StorageManagementPolicyRuleActionsSnapshot"]] = None,
    ) -> None:
        """
        :param base_blob: base_blob block.
        :param snapshot: snapshot block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if base_blob is not None:
            self._values["base_blob"] = base_blob
        if snapshot is not None:
            self._values["snapshot"] = snapshot

    @builtins.property
    def base_blob(
        self,
    ) -> typing.Optional[typing.List["StorageManagementPolicyRuleActionsBaseBlob"]]:
        """base_blob block."""
        result = self._values.get("base_blob")
        return result

    @builtins.property
    def snapshot(
        self,
    ) -> typing.Optional[typing.List["StorageManagementPolicyRuleActionsSnapshot"]]:
        """snapshot block."""
        result = self._values.get("snapshot")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageManagementPolicyRuleActions(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageManagementPolicyRuleActionsBaseBlob",
    jsii_struct_bases=[],
    name_mapping={
        "delete_after_days_since_modification_greater_than": "deleteAfterDaysSinceModificationGreaterThan",
        "tier_to_archive_after_days_since_modification_greater_than": "tierToArchiveAfterDaysSinceModificationGreaterThan",
        "tier_to_cool_after_days_since_modification_greater_than": "tierToCoolAfterDaysSinceModificationGreaterThan",
    },
)
class StorageManagementPolicyRuleActionsBaseBlob:
    def __init__(
        self,
        *,
        delete_after_days_since_modification_greater_than: typing.Optional[jsii.Number] = None,
        tier_to_archive_after_days_since_modification_greater_than: typing.Optional[jsii.Number] = None,
        tier_to_cool_after_days_since_modification_greater_than: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param delete_after_days_since_modification_greater_than: -
        :param tier_to_archive_after_days_since_modification_greater_than: -
        :param tier_to_cool_after_days_since_modification_greater_than: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if delete_after_days_since_modification_greater_than is not None:
            self._values["delete_after_days_since_modification_greater_than"] = delete_after_days_since_modification_greater_than
        if tier_to_archive_after_days_since_modification_greater_than is not None:
            self._values["tier_to_archive_after_days_since_modification_greater_than"] = tier_to_archive_after_days_since_modification_greater_than
        if tier_to_cool_after_days_since_modification_greater_than is not None:
            self._values["tier_to_cool_after_days_since_modification_greater_than"] = tier_to_cool_after_days_since_modification_greater_than

    @builtins.property
    def delete_after_days_since_modification_greater_than(
        self,
    ) -> typing.Optional[jsii.Number]:
        result = self._values.get("delete_after_days_since_modification_greater_than")
        return result

    @builtins.property
    def tier_to_archive_after_days_since_modification_greater_than(
        self,
    ) -> typing.Optional[jsii.Number]:
        result = self._values.get("tier_to_archive_after_days_since_modification_greater_than")
        return result

    @builtins.property
    def tier_to_cool_after_days_since_modification_greater_than(
        self,
    ) -> typing.Optional[jsii.Number]:
        result = self._values.get("tier_to_cool_after_days_since_modification_greater_than")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageManagementPolicyRuleActionsBaseBlob(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageManagementPolicyRuleActionsSnapshot",
    jsii_struct_bases=[],
    name_mapping={
        "delete_after_days_since_creation_greater_than": "deleteAfterDaysSinceCreationGreaterThan",
    },
)
class StorageManagementPolicyRuleActionsSnapshot:
    def __init__(
        self,
        *,
        delete_after_days_since_creation_greater_than: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param delete_after_days_since_creation_greater_than: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if delete_after_days_since_creation_greater_than is not None:
            self._values["delete_after_days_since_creation_greater_than"] = delete_after_days_since_creation_greater_than

    @builtins.property
    def delete_after_days_since_creation_greater_than(
        self,
    ) -> typing.Optional[jsii.Number]:
        result = self._values.get("delete_after_days_since_creation_greater_than")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageManagementPolicyRuleActionsSnapshot(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageManagementPolicyRuleFilters",
    jsii_struct_bases=[],
    name_mapping={"blob_types": "blobTypes", "prefix_match": "prefixMatch"},
)
class StorageManagementPolicyRuleFilters:
    def __init__(
        self,
        *,
        blob_types: typing.Optional[typing.List[builtins.str]] = None,
        prefix_match: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param blob_types: -
        :param prefix_match: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if blob_types is not None:
            self._values["blob_types"] = blob_types
        if prefix_match is not None:
            self._values["prefix_match"] = prefix_match

    @builtins.property
    def blob_types(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("blob_types")
        return result

    @builtins.property
    def prefix_match(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("prefix_match")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageManagementPolicyRuleFilters(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageManagementPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageManagementPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageManagementPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageQueue(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageQueue",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_name: builtins.str,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageQueueTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_name: -
        :param metadata: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageQueueConfig(
            name=name,
            storage_account_name=storage_account_name,
            metadata=metadata,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageQueue, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageQueueTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageQueueTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageQueueTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageQueueConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_name": "storageAccountName",
        "metadata": "metadata",
        "timeouts": "timeouts",
    },
)
class StorageQueueConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_name: builtins.str,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageQueueTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_name: -
        :param metadata: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageQueueTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metadata is not None:
            self._values["metadata"] = metadata
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageQueueTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageQueueConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageQueueTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageQueueTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageQueueTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageShare(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageShare",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_name: builtins.str,
        acl: typing.Optional[typing.List["StorageShareAcl"]] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        quota: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["StorageShareTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_name: -
        :param acl: acl block.
        :param metadata: -
        :param quota: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageShareConfig(
            name=name,
            storage_account_name=storage_account_name,
            acl=acl,
            metadata=metadata,
            quota=quota,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageShare, self, [scope, id, config])

    @jsii.member(jsii_name="resetAcl")
    def reset_acl(self) -> None:
        return jsii.invoke(self, "resetAcl", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetQuota")
    def reset_quota(self) -> None:
        return jsii.invoke(self, "resetQuota", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceManagerId")
    def resource_manager_id(self) -> builtins.str:
        return jsii.get(self, "resourceManagerId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="url")
    def url(self) -> builtins.str:
        return jsii.get(self, "url")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aclInput")
    def acl_input(self) -> typing.Optional[typing.List["StorageShareAcl"]]:
        return jsii.get(self, "aclInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="quotaInput")
    def quota_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "quotaInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageShareTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="acl")
    def acl(self) -> typing.List["StorageShareAcl"]:
        return jsii.get(self, "acl")

    @acl.setter # type: ignore
    def acl(self, value: typing.List["StorageShareAcl"]) -> None:
        jsii.set(self, "acl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="quota")
    def quota(self) -> jsii.Number:
        return jsii.get(self, "quota")

    @quota.setter # type: ignore
    def quota(self, value: jsii.Number) -> None:
        jsii.set(self, "quota", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageShareTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageShareTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageShareAcl",
    jsii_struct_bases=[],
    name_mapping={"id": "id", "access_policy": "accessPolicy"},
)
class StorageShareAcl:
    def __init__(
        self,
        *,
        id: builtins.str,
        access_policy: typing.Optional[typing.List["StorageShareAclAccessPolicy"]] = None,
    ) -> None:
        """
        :param id: -
        :param access_policy: access_policy block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
        }
        if access_policy is not None:
            self._values["access_policy"] = access_policy

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    @builtins.property
    def access_policy(
        self,
    ) -> typing.Optional[typing.List["StorageShareAclAccessPolicy"]]:
        """access_policy block."""
        result = self._values.get("access_policy")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareAcl(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageShareAclAccessPolicy",
    jsii_struct_bases=[],
    name_mapping={"permissions": "permissions", "expiry": "expiry", "start": "start"},
)
class StorageShareAclAccessPolicy:
    def __init__(
        self,
        *,
        permissions: builtins.str,
        expiry: typing.Optional[builtins.str] = None,
        start: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param permissions: -
        :param expiry: -
        :param start: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "permissions": permissions,
        }
        if expiry is not None:
            self._values["expiry"] = expiry
        if start is not None:
            self._values["start"] = start

    @builtins.property
    def permissions(self) -> builtins.str:
        result = self._values.get("permissions")
        assert result is not None, "Required property 'permissions' is missing"
        return result

    @builtins.property
    def expiry(self) -> typing.Optional[builtins.str]:
        result = self._values.get("expiry")
        return result

    @builtins.property
    def start(self) -> typing.Optional[builtins.str]:
        result = self._values.get("start")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareAclAccessPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageShareConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_name": "storageAccountName",
        "acl": "acl",
        "metadata": "metadata",
        "quota": "quota",
        "timeouts": "timeouts",
    },
)
class StorageShareConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_name: builtins.str,
        acl: typing.Optional[typing.List[StorageShareAcl]] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        quota: typing.Optional[jsii.Number] = None,
        timeouts: typing.Optional["StorageShareTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_name: -
        :param acl: acl block.
        :param metadata: -
        :param quota: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageShareTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if acl is not None:
            self._values["acl"] = acl
        if metadata is not None:
            self._values["metadata"] = metadata
        if quota is not None:
            self._values["quota"] = quota
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def acl(self) -> typing.Optional[typing.List[StorageShareAcl]]:
        """acl block."""
        result = self._values.get("acl")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def quota(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("quota")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageShareTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageShareDirectory(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageShareDirectory",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        share_name: builtins.str,
        storage_account_name: builtins.str,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageShareDirectoryTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param share_name: -
        :param storage_account_name: -
        :param metadata: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageShareDirectoryConfig(
            name=name,
            share_name=share_name,
            storage_account_name=storage_account_name,
            metadata=metadata,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageShareDirectory, self, [scope, id, config])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareNameInput")
    def share_name_input(self) -> builtins.str:
        return jsii.get(self, "shareNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageShareDirectoryTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="shareName")
    def share_name(self) -> builtins.str:
        return jsii.get(self, "shareName")

    @share_name.setter # type: ignore
    def share_name(self, value: builtins.str) -> None:
        jsii.set(self, "shareName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageShareDirectoryTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageShareDirectoryTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageShareDirectoryConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "share_name": "shareName",
        "storage_account_name": "storageAccountName",
        "metadata": "metadata",
        "timeouts": "timeouts",
    },
)
class StorageShareDirectoryConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        share_name: builtins.str,
        storage_account_name: builtins.str,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageShareDirectoryTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param share_name: -
        :param storage_account_name: -
        :param metadata: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageShareDirectoryTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "share_name": share_name,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if metadata is not None:
            self._values["metadata"] = metadata
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def share_name(self) -> builtins.str:
        result = self._values.get("share_name")
        assert result is not None, "Required property 'share_name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageShareDirectoryTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareDirectoryConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageShareDirectoryTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageShareDirectoryTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareDirectoryTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageShareFile(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageShareFile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_share_id: builtins.str,
        content_disposition: typing.Optional[builtins.str] = None,
        content_encoding: typing.Optional[builtins.str] = None,
        content_md5: typing.Optional[builtins.str] = None,
        content_type: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        path: typing.Optional[builtins.str] = None,
        source: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageShareFileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_share_id: -
        :param content_disposition: -
        :param content_encoding: -
        :param content_md5: -
        :param content_type: -
        :param metadata: -
        :param path: -
        :param source: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageShareFileConfig(
            name=name,
            storage_share_id=storage_share_id,
            content_disposition=content_disposition,
            content_encoding=content_encoding,
            content_md5=content_md5,
            content_type=content_type,
            metadata=metadata,
            path=path,
            source=source,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageShareFile, self, [scope, id, config])

    @jsii.member(jsii_name="resetContentDisposition")
    def reset_content_disposition(self) -> None:
        return jsii.invoke(self, "resetContentDisposition", [])

    @jsii.member(jsii_name="resetContentEncoding")
    def reset_content_encoding(self) -> None:
        return jsii.invoke(self, "resetContentEncoding", [])

    @jsii.member(jsii_name="resetContentMd5")
    def reset_content_md5(self) -> None:
        return jsii.invoke(self, "resetContentMd5", [])

    @jsii.member(jsii_name="resetContentType")
    def reset_content_type(self) -> None:
        return jsii.invoke(self, "resetContentType", [])

    @jsii.member(jsii_name="resetMetadata")
    def reset_metadata(self) -> None:
        return jsii.invoke(self, "resetMetadata", [])

    @jsii.member(jsii_name="resetPath")
    def reset_path(self) -> None:
        return jsii.invoke(self, "resetPath", [])

    @jsii.member(jsii_name="resetSource")
    def reset_source(self) -> None:
        return jsii.invoke(self, "resetSource", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageShareIdInput")
    def storage_share_id_input(self) -> builtins.str:
        return jsii.get(self, "storageShareIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentDispositionInput")
    def content_disposition_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentDispositionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEncodingInput")
    def content_encoding_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentEncodingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentMd5Input")
    def content_md5_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentMd5Input")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentTypeInput")
    def content_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "contentTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadataInput")
    def metadata_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "metadataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathInput")
    def path_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "pathInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceInput")
    def source_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageShareFileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentDisposition")
    def content_disposition(self) -> builtins.str:
        return jsii.get(self, "contentDisposition")

    @content_disposition.setter # type: ignore
    def content_disposition(self, value: builtins.str) -> None:
        jsii.set(self, "contentDisposition", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentEncoding")
    def content_encoding(self) -> builtins.str:
        return jsii.get(self, "contentEncoding")

    @content_encoding.setter # type: ignore
    def content_encoding(self, value: builtins.str) -> None:
        jsii.set(self, "contentEncoding", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentMd5")
    def content_md5(self) -> builtins.str:
        return jsii.get(self, "contentMd5")

    @content_md5.setter # type: ignore
    def content_md5(self, value: builtins.str) -> None:
        jsii.set(self, "contentMd5", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> builtins.str:
        return jsii.get(self, "contentType")

    @content_type.setter # type: ignore
    def content_type(self, value: builtins.str) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "metadata")

    @metadata.setter # type: ignore
    def metadata(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="path")
    def path(self) -> builtins.str:
        return jsii.get(self, "path")

    @path.setter # type: ignore
    def path(self, value: builtins.str) -> None:
        jsii.set(self, "path", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="source")
    def source(self) -> builtins.str:
        return jsii.get(self, "source")

    @source.setter # type: ignore
    def source(self, value: builtins.str) -> None:
        jsii.set(self, "source", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageShareId")
    def storage_share_id(self) -> builtins.str:
        return jsii.get(self, "storageShareId")

    @storage_share_id.setter # type: ignore
    def storage_share_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageShareId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageShareFileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageShareFileTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageShareFileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_share_id": "storageShareId",
        "content_disposition": "contentDisposition",
        "content_encoding": "contentEncoding",
        "content_md5": "contentMd5",
        "content_type": "contentType",
        "metadata": "metadata",
        "path": "path",
        "source": "source",
        "timeouts": "timeouts",
    },
)
class StorageShareFileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_share_id: builtins.str,
        content_disposition: typing.Optional[builtins.str] = None,
        content_encoding: typing.Optional[builtins.str] = None,
        content_md5: typing.Optional[builtins.str] = None,
        content_type: typing.Optional[builtins.str] = None,
        metadata: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        path: typing.Optional[builtins.str] = None,
        source: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageShareFileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_share_id: -
        :param content_disposition: -
        :param content_encoding: -
        :param content_md5: -
        :param content_type: -
        :param metadata: -
        :param path: -
        :param source: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageShareFileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_share_id": storage_share_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if content_disposition is not None:
            self._values["content_disposition"] = content_disposition
        if content_encoding is not None:
            self._values["content_encoding"] = content_encoding
        if content_md5 is not None:
            self._values["content_md5"] = content_md5
        if content_type is not None:
            self._values["content_type"] = content_type
        if metadata is not None:
            self._values["metadata"] = metadata
        if path is not None:
            self._values["path"] = path
        if source is not None:
            self._values["source"] = source
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_share_id(self) -> builtins.str:
        result = self._values.get("storage_share_id")
        assert result is not None, "Required property 'storage_share_id' is missing"
        return result

    @builtins.property
    def content_disposition(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_disposition")
        return result

    @builtins.property
    def content_encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_encoding")
        return result

    @builtins.property
    def content_md5(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_md5")
        return result

    @builtins.property
    def content_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("content_type")
        return result

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("metadata")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def source(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageShareFileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareFileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageShareFileTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageShareFileTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareFileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageShareTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageShareTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageShareTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageSync(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageSync",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        incoming_traffic_policy: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageSyncTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param incoming_traffic_policy: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageSyncConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            incoming_traffic_policy=incoming_traffic_policy,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageSync, self, [scope, id, config])

    @jsii.member(jsii_name="resetIncomingTrafficPolicy")
    def reset_incoming_traffic_policy(self) -> None:
        return jsii.invoke(self, "resetIncomingTrafficPolicy", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="incomingTrafficPolicyInput")
    def incoming_traffic_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "incomingTrafficPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageSyncTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="incomingTrafficPolicy")
    def incoming_traffic_policy(self) -> builtins.str:
        return jsii.get(self, "incomingTrafficPolicy")

    @incoming_traffic_policy.setter # type: ignore
    def incoming_traffic_policy(self, value: builtins.str) -> None:
        jsii.set(self, "incomingTrafficPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageSyncTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageSyncTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class StorageSyncCloudEndpoint(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageSyncCloudEndpoint",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        file_share_name: builtins.str,
        name: builtins.str,
        storage_account_id: builtins.str,
        storage_sync_group_id: builtins.str,
        storage_account_tenant_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageSyncCloudEndpointTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param file_share_name: -
        :param name: -
        :param storage_account_id: -
        :param storage_sync_group_id: -
        :param storage_account_tenant_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageSyncCloudEndpointConfig(
            file_share_name=file_share_name,
            name=name,
            storage_account_id=storage_account_id,
            storage_sync_group_id=storage_sync_group_id,
            storage_account_tenant_id=storage_account_tenant_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageSyncCloudEndpoint, self, [scope, id, config])

    @jsii.member(jsii_name="resetStorageAccountTenantId")
    def reset_storage_account_tenant_id(self) -> None:
        return jsii.invoke(self, "resetStorageAccountTenantId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileShareNameInput")
    def file_share_name_input(self) -> builtins.str:
        return jsii.get(self, "fileShareNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountIdInput")
    def storage_account_id_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageSyncGroupIdInput")
    def storage_sync_group_id_input(self) -> builtins.str:
        return jsii.get(self, "storageSyncGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountTenantIdInput")
    def storage_account_tenant_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "storageAccountTenantIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageSyncCloudEndpointTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fileShareName")
    def file_share_name(self) -> builtins.str:
        return jsii.get(self, "fileShareName")

    @file_share_name.setter # type: ignore
    def file_share_name(self, value: builtins.str) -> None:
        jsii.set(self, "fileShareName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountId")
    def storage_account_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountId")

    @storage_account_id.setter # type: ignore
    def storage_account_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountTenantId")
    def storage_account_tenant_id(self) -> builtins.str:
        return jsii.get(self, "storageAccountTenantId")

    @storage_account_tenant_id.setter # type: ignore
    def storage_account_tenant_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountTenantId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageSyncGroupId")
    def storage_sync_group_id(self) -> builtins.str:
        return jsii.get(self, "storageSyncGroupId")

    @storage_sync_group_id.setter # type: ignore
    def storage_sync_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageSyncGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageSyncCloudEndpointTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageSyncCloudEndpointTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageSyncCloudEndpointConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "file_share_name": "fileShareName",
        "name": "name",
        "storage_account_id": "storageAccountId",
        "storage_sync_group_id": "storageSyncGroupId",
        "storage_account_tenant_id": "storageAccountTenantId",
        "timeouts": "timeouts",
    },
)
class StorageSyncCloudEndpointConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        file_share_name: builtins.str,
        name: builtins.str,
        storage_account_id: builtins.str,
        storage_sync_group_id: builtins.str,
        storage_account_tenant_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["StorageSyncCloudEndpointTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param file_share_name: -
        :param name: -
        :param storage_account_id: -
        :param storage_sync_group_id: -
        :param storage_account_tenant_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageSyncCloudEndpointTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "file_share_name": file_share_name,
            "name": name,
            "storage_account_id": storage_account_id,
            "storage_sync_group_id": storage_sync_group_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if storage_account_tenant_id is not None:
            self._values["storage_account_tenant_id"] = storage_account_tenant_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def file_share_name(self) -> builtins.str:
        result = self._values.get("file_share_name")
        assert result is not None, "Required property 'file_share_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_id(self) -> builtins.str:
        result = self._values.get("storage_account_id")
        assert result is not None, "Required property 'storage_account_id' is missing"
        return result

    @builtins.property
    def storage_sync_group_id(self) -> builtins.str:
        result = self._values.get("storage_sync_group_id")
        assert result is not None, "Required property 'storage_sync_group_id' is missing"
        return result

    @builtins.property
    def storage_account_tenant_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_tenant_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageSyncCloudEndpointTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageSyncCloudEndpointConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageSyncCloudEndpointTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class StorageSyncCloudEndpointTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageSyncCloudEndpointTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageSyncConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "incoming_traffic_policy": "incomingTrafficPolicy",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class StorageSyncConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        incoming_traffic_policy: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StorageSyncTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param incoming_traffic_policy: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageSyncTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if incoming_traffic_policy is not None:
            self._values["incoming_traffic_policy"] = incoming_traffic_policy
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def incoming_traffic_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("incoming_traffic_policy")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageSyncTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageSyncConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageSyncGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageSyncGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_sync_id: builtins.str,
        timeouts: typing.Optional["StorageSyncGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_sync_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageSyncGroupConfig(
            name=name,
            storage_sync_id=storage_sync_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageSyncGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageSyncIdInput")
    def storage_sync_id_input(self) -> builtins.str:
        return jsii.get(self, "storageSyncIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageSyncGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageSyncId")
    def storage_sync_id(self) -> builtins.str:
        return jsii.get(self, "storageSyncId")

    @storage_sync_id.setter # type: ignore
    def storage_sync_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageSyncId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageSyncGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageSyncGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageSyncGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_sync_id": "storageSyncId",
        "timeouts": "timeouts",
    },
)
class StorageSyncGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_sync_id: builtins.str,
        timeouts: typing.Optional["StorageSyncGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_sync_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageSyncGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_sync_id": storage_sync_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_sync_id(self) -> builtins.str:
        result = self._values.get("storage_sync_id")
        assert result is not None, "Required property 'storage_sync_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageSyncGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageSyncGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageSyncGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class StorageSyncGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageSyncGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageSyncTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageSyncTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageSyncTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageTable(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageTable",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        storage_account_name: builtins.str,
        acl: typing.Optional[typing.List["StorageTableAcl"]] = None,
        timeouts: typing.Optional["StorageTableTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param storage_account_name: -
        :param acl: acl block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageTableConfig(
            name=name,
            storage_account_name=storage_account_name,
            acl=acl,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageTable, self, [scope, id, config])

    @jsii.member(jsii_name="resetAcl")
    def reset_acl(self) -> None:
        return jsii.invoke(self, "resetAcl", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aclInput")
    def acl_input(self) -> typing.Optional[typing.List["StorageTableAcl"]]:
        return jsii.get(self, "aclInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageTableTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="acl")
    def acl(self) -> typing.List["StorageTableAcl"]:
        return jsii.get(self, "acl")

    @acl.setter # type: ignore
    def acl(self, value: typing.List["StorageTableAcl"]) -> None:
        jsii.set(self, "acl", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageTableTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageTableTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageTableAcl",
    jsii_struct_bases=[],
    name_mapping={"id": "id", "access_policy": "accessPolicy"},
)
class StorageTableAcl:
    def __init__(
        self,
        *,
        id: builtins.str,
        access_policy: typing.Optional[typing.List["StorageTableAclAccessPolicy"]] = None,
    ) -> None:
        """
        :param id: -
        :param access_policy: access_policy block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "id": id,
        }
        if access_policy is not None:
            self._values["access_policy"] = access_policy

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    @builtins.property
    def access_policy(
        self,
    ) -> typing.Optional[typing.List["StorageTableAclAccessPolicy"]]:
        """access_policy block."""
        result = self._values.get("access_policy")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageTableAcl(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageTableAclAccessPolicy",
    jsii_struct_bases=[],
    name_mapping={"expiry": "expiry", "permissions": "permissions", "start": "start"},
)
class StorageTableAclAccessPolicy:
    def __init__(
        self,
        *,
        expiry: builtins.str,
        permissions: builtins.str,
        start: builtins.str,
    ) -> None:
        """
        :param expiry: -
        :param permissions: -
        :param start: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "expiry": expiry,
            "permissions": permissions,
            "start": start,
        }

    @builtins.property
    def expiry(self) -> builtins.str:
        result = self._values.get("expiry")
        assert result is not None, "Required property 'expiry' is missing"
        return result

    @builtins.property
    def permissions(self) -> builtins.str:
        result = self._values.get("permissions")
        assert result is not None, "Required property 'permissions' is missing"
        return result

    @builtins.property
    def start(self) -> builtins.str:
        result = self._values.get("start")
        assert result is not None, "Required property 'start' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageTableAclAccessPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageTableConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "storage_account_name": "storageAccountName",
        "acl": "acl",
        "timeouts": "timeouts",
    },
)
class StorageTableConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        storage_account_name: builtins.str,
        acl: typing.Optional[typing.List[StorageTableAcl]] = None,
        timeouts: typing.Optional["StorageTableTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param storage_account_name: -
        :param acl: acl block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageTableTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "storage_account_name": storage_account_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if acl is not None:
            self._values["acl"] = acl
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def acl(self) -> typing.Optional[typing.List[StorageTableAcl]]:
        """acl block."""
        result = self._values.get("acl")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageTableTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageTableConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StorageTableEntity(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StorageTableEntity",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        entity: typing.Mapping[builtins.str, builtins.str],
        partition_key: builtins.str,
        row_key: builtins.str,
        storage_account_name: builtins.str,
        table_name: builtins.str,
        timeouts: typing.Optional["StorageTableEntityTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param entity: -
        :param partition_key: -
        :param row_key: -
        :param storage_account_name: -
        :param table_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageTableEntityConfig(
            entity=entity,
            partition_key=partition_key,
            row_key=row_key,
            storage_account_name=storage_account_name,
            table_name=table_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StorageTableEntity, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="entityInput")
    def entity_input(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "entityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKeyInput")
    def partition_key_input(self) -> builtins.str:
        return jsii.get(self, "partitionKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rowKeyInput")
    def row_key_input(self) -> builtins.str:
        return jsii.get(self, "rowKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableNameInput")
    def table_name_input(self) -> builtins.str:
        return jsii.get(self, "tableNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StorageTableEntityTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="entity")
    def entity(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "entity")

    @entity.setter # type: ignore
    def entity(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "entity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="partitionKey")
    def partition_key(self) -> builtins.str:
        return jsii.get(self, "partitionKey")

    @partition_key.setter # type: ignore
    def partition_key(self, value: builtins.str) -> None:
        jsii.set(self, "partitionKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rowKey")
    def row_key(self) -> builtins.str:
        return jsii.get(self, "rowKey")

    @row_key.setter # type: ignore
    def row_key(self, value: builtins.str) -> None:
        jsii.set(self, "rowKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableName")
    def table_name(self) -> builtins.str:
        return jsii.get(self, "tableName")

    @table_name.setter # type: ignore
    def table_name(self, value: builtins.str) -> None:
        jsii.set(self, "tableName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StorageTableEntityTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StorageTableEntityTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StorageTableEntityConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "entity": "entity",
        "partition_key": "partitionKey",
        "row_key": "rowKey",
        "storage_account_name": "storageAccountName",
        "table_name": "tableName",
        "timeouts": "timeouts",
    },
)
class StorageTableEntityConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        entity: typing.Mapping[builtins.str, builtins.str],
        partition_key: builtins.str,
        row_key: builtins.str,
        storage_account_name: builtins.str,
        table_name: builtins.str,
        timeouts: typing.Optional["StorageTableEntityTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param entity: -
        :param partition_key: -
        :param row_key: -
        :param storage_account_name: -
        :param table_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StorageTableEntityTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "entity": entity,
            "partition_key": partition_key,
            "row_key": row_key,
            "storage_account_name": storage_account_name,
            "table_name": table_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def entity(self) -> typing.Mapping[builtins.str, builtins.str]:
        result = self._values.get("entity")
        assert result is not None, "Required property 'entity' is missing"
        return result

    @builtins.property
    def partition_key(self) -> builtins.str:
        result = self._values.get("partition_key")
        assert result is not None, "Required property 'partition_key' is missing"
        return result

    @builtins.property
    def row_key(self) -> builtins.str:
        result = self._values.get("row_key")
        assert result is not None, "Required property 'row_key' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def table_name(self) -> builtins.str:
        result = self._values.get("table_name")
        assert result is not None, "Required property 'table_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageTableEntityTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageTableEntityConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageTableEntityTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageTableEntityTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageTableEntityTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StorageTableTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StorageTableTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StorageTableTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsFunctionJavascriptUdf(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsFunctionJavascriptUdf",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        input: typing.List["StreamAnalyticsFunctionJavascriptUdfInput"],
        name: builtins.str,
        output: typing.List["StreamAnalyticsFunctionJavascriptUdfOutput"],
        resource_group_name: builtins.str,
        script: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsFunctionJavascriptUdfTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param input: input block.
        :param name: -
        :param output: output block.
        :param resource_group_name: -
        :param script: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsFunctionJavascriptUdfConfig(
            input=input,
            name=name,
            output=output,
            resource_group_name=resource_group_name,
            script=script,
            stream_analytics_job_name=stream_analytics_job_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsFunctionJavascriptUdf, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="inputInput")
    def input_input(self) -> typing.List["StreamAnalyticsFunctionJavascriptUdfInput"]:
        return jsii.get(self, "inputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputInput")
    def output_input(self) -> typing.List["StreamAnalyticsFunctionJavascriptUdfOutput"]:
        return jsii.get(self, "outputInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scriptInput")
    def script_input(self) -> builtins.str:
        return jsii.get(self, "scriptInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsFunctionJavascriptUdfTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="input")
    def input(self) -> typing.List["StreamAnalyticsFunctionJavascriptUdfInput"]:
        return jsii.get(self, "input")

    @input.setter # type: ignore
    def input(
        self,
        value: typing.List["StreamAnalyticsFunctionJavascriptUdfInput"],
    ) -> None:
        jsii.set(self, "input", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="output")
    def output(self) -> typing.List["StreamAnalyticsFunctionJavascriptUdfOutput"]:
        return jsii.get(self, "output")

    @output.setter # type: ignore
    def output(
        self,
        value: typing.List["StreamAnalyticsFunctionJavascriptUdfOutput"],
    ) -> None:
        jsii.set(self, "output", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="script")
    def script(self) -> builtins.str:
        return jsii.get(self, "script")

    @script.setter # type: ignore
    def script(self, value: builtins.str) -> None:
        jsii.set(self, "script", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsFunctionJavascriptUdfTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsFunctionJavascriptUdfTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsFunctionJavascriptUdfConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "input": "input",
        "name": "name",
        "output": "output",
        "resource_group_name": "resourceGroupName",
        "script": "script",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsFunctionJavascriptUdfConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        input: typing.List["StreamAnalyticsFunctionJavascriptUdfInput"],
        name: builtins.str,
        output: typing.List["StreamAnalyticsFunctionJavascriptUdfOutput"],
        resource_group_name: builtins.str,
        script: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsFunctionJavascriptUdfTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param input: input block.
        :param name: -
        :param output: output block.
        :param resource_group_name: -
        :param script: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsFunctionJavascriptUdfTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "input": input,
            "name": name,
            "output": output,
            "resource_group_name": resource_group_name,
            "script": script,
            "stream_analytics_job_name": stream_analytics_job_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def input(self) -> typing.List["StreamAnalyticsFunctionJavascriptUdfInput"]:
        """input block."""
        result = self._values.get("input")
        assert result is not None, "Required property 'input' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def output(self) -> typing.List["StreamAnalyticsFunctionJavascriptUdfOutput"]:
        """output block."""
        result = self._values.get("output")
        assert result is not None, "Required property 'output' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def script(self) -> builtins.str:
        result = self._values.get("script")
        assert result is not None, "Required property 'script' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["StreamAnalyticsFunctionJavascriptUdfTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsFunctionJavascriptUdfConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsFunctionJavascriptUdfInput",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class StreamAnalyticsFunctionJavascriptUdfInput:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsFunctionJavascriptUdfInput(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsFunctionJavascriptUdfOutput",
    jsii_struct_bases=[],
    name_mapping={"type": "type"},
)
class StreamAnalyticsFunctionJavascriptUdfOutput:
    def __init__(self, *, type: builtins.str) -> None:
        """
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsFunctionJavascriptUdfOutput(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsFunctionJavascriptUdfTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsFunctionJavascriptUdfTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsFunctionJavascriptUdfTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsJob(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsJob",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        streaming_units: jsii.Number,
        transformation_query: builtins.str,
        compatibility_level: typing.Optional[builtins.str] = None,
        data_locale: typing.Optional[builtins.str] = None,
        events_late_arrival_max_delay_in_seconds: typing.Optional[jsii.Number] = None,
        events_out_of_order_max_delay_in_seconds: typing.Optional[jsii.Number] = None,
        events_out_of_order_policy: typing.Optional[builtins.str] = None,
        output_error_policy: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StreamAnalyticsJobTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param streaming_units: -
        :param transformation_query: -
        :param compatibility_level: -
        :param data_locale: -
        :param events_late_arrival_max_delay_in_seconds: -
        :param events_out_of_order_max_delay_in_seconds: -
        :param events_out_of_order_policy: -
        :param output_error_policy: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsJobConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            streaming_units=streaming_units,
            transformation_query=transformation_query,
            compatibility_level=compatibility_level,
            data_locale=data_locale,
            events_late_arrival_max_delay_in_seconds=events_late_arrival_max_delay_in_seconds,
            events_out_of_order_max_delay_in_seconds=events_out_of_order_max_delay_in_seconds,
            events_out_of_order_policy=events_out_of_order_policy,
            output_error_policy=output_error_policy,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsJob, self, [scope, id, config])

    @jsii.member(jsii_name="resetCompatibilityLevel")
    def reset_compatibility_level(self) -> None:
        return jsii.invoke(self, "resetCompatibilityLevel", [])

    @jsii.member(jsii_name="resetDataLocale")
    def reset_data_locale(self) -> None:
        return jsii.invoke(self, "resetDataLocale", [])

    @jsii.member(jsii_name="resetEventsLateArrivalMaxDelayInSeconds")
    def reset_events_late_arrival_max_delay_in_seconds(self) -> None:
        return jsii.invoke(self, "resetEventsLateArrivalMaxDelayInSeconds", [])

    @jsii.member(jsii_name="resetEventsOutOfOrderMaxDelayInSeconds")
    def reset_events_out_of_order_max_delay_in_seconds(self) -> None:
        return jsii.invoke(self, "resetEventsOutOfOrderMaxDelayInSeconds", [])

    @jsii.member(jsii_name="resetEventsOutOfOrderPolicy")
    def reset_events_out_of_order_policy(self) -> None:
        return jsii.invoke(self, "resetEventsOutOfOrderPolicy", [])

    @jsii.member(jsii_name="resetOutputErrorPolicy")
    def reset_output_error_policy(self) -> None:
        return jsii.invoke(self, "resetOutputErrorPolicy", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="jobId")
    def job_id(self) -> builtins.str:
        return jsii.get(self, "jobId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamingUnitsInput")
    def streaming_units_input(self) -> jsii.Number:
        return jsii.get(self, "streamingUnitsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="transformationQueryInput")
    def transformation_query_input(self) -> builtins.str:
        return jsii.get(self, "transformationQueryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="compatibilityLevelInput")
    def compatibility_level_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "compatibilityLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataLocaleInput")
    def data_locale_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dataLocaleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsLateArrivalMaxDelayInSecondsInput")
    def events_late_arrival_max_delay_in_seconds_input(
        self,
    ) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "eventsLateArrivalMaxDelayInSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsOutOfOrderMaxDelayInSecondsInput")
    def events_out_of_order_max_delay_in_seconds_input(
        self,
    ) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "eventsOutOfOrderMaxDelayInSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsOutOfOrderPolicyInput")
    def events_out_of_order_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "eventsOutOfOrderPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputErrorPolicyInput")
    def output_error_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "outputErrorPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StreamAnalyticsJobTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="compatibilityLevel")
    def compatibility_level(self) -> builtins.str:
        return jsii.get(self, "compatibilityLevel")

    @compatibility_level.setter # type: ignore
    def compatibility_level(self, value: builtins.str) -> None:
        jsii.set(self, "compatibilityLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataLocale")
    def data_locale(self) -> builtins.str:
        return jsii.get(self, "dataLocale")

    @data_locale.setter # type: ignore
    def data_locale(self, value: builtins.str) -> None:
        jsii.set(self, "dataLocale", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsLateArrivalMaxDelayInSeconds")
    def events_late_arrival_max_delay_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "eventsLateArrivalMaxDelayInSeconds")

    @events_late_arrival_max_delay_in_seconds.setter # type: ignore
    def events_late_arrival_max_delay_in_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "eventsLateArrivalMaxDelayInSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsOutOfOrderMaxDelayInSeconds")
    def events_out_of_order_max_delay_in_seconds(self) -> jsii.Number:
        return jsii.get(self, "eventsOutOfOrderMaxDelayInSeconds")

    @events_out_of_order_max_delay_in_seconds.setter # type: ignore
    def events_out_of_order_max_delay_in_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "eventsOutOfOrderMaxDelayInSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventsOutOfOrderPolicy")
    def events_out_of_order_policy(self) -> builtins.str:
        return jsii.get(self, "eventsOutOfOrderPolicy")

    @events_out_of_order_policy.setter # type: ignore
    def events_out_of_order_policy(self, value: builtins.str) -> None:
        jsii.set(self, "eventsOutOfOrderPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputErrorPolicy")
    def output_error_policy(self) -> builtins.str:
        return jsii.get(self, "outputErrorPolicy")

    @output_error_policy.setter # type: ignore
    def output_error_policy(self, value: builtins.str) -> None:
        jsii.set(self, "outputErrorPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamingUnits")
    def streaming_units(self) -> jsii.Number:
        return jsii.get(self, "streamingUnits")

    @streaming_units.setter # type: ignore
    def streaming_units(self, value: jsii.Number) -> None:
        jsii.set(self, "streamingUnits", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsJobTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsJobTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="transformationQuery")
    def transformation_query(self) -> builtins.str:
        return jsii.get(self, "transformationQuery")

    @transformation_query.setter # type: ignore
    def transformation_query(self, value: builtins.str) -> None:
        jsii.set(self, "transformationQuery", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsJobConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "streaming_units": "streamingUnits",
        "transformation_query": "transformationQuery",
        "compatibility_level": "compatibilityLevel",
        "data_locale": "dataLocale",
        "events_late_arrival_max_delay_in_seconds": "eventsLateArrivalMaxDelayInSeconds",
        "events_out_of_order_max_delay_in_seconds": "eventsOutOfOrderMaxDelayInSeconds",
        "events_out_of_order_policy": "eventsOutOfOrderPolicy",
        "output_error_policy": "outputErrorPolicy",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsJobConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        streaming_units: jsii.Number,
        transformation_query: builtins.str,
        compatibility_level: typing.Optional[builtins.str] = None,
        data_locale: typing.Optional[builtins.str] = None,
        events_late_arrival_max_delay_in_seconds: typing.Optional[jsii.Number] = None,
        events_out_of_order_max_delay_in_seconds: typing.Optional[jsii.Number] = None,
        events_out_of_order_policy: typing.Optional[builtins.str] = None,
        output_error_policy: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["StreamAnalyticsJobTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param streaming_units: -
        :param transformation_query: -
        :param compatibility_level: -
        :param data_locale: -
        :param events_late_arrival_max_delay_in_seconds: -
        :param events_out_of_order_max_delay_in_seconds: -
        :param events_out_of_order_policy: -
        :param output_error_policy: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsJobTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "streaming_units": streaming_units,
            "transformation_query": transformation_query,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if compatibility_level is not None:
            self._values["compatibility_level"] = compatibility_level
        if data_locale is not None:
            self._values["data_locale"] = data_locale
        if events_late_arrival_max_delay_in_seconds is not None:
            self._values["events_late_arrival_max_delay_in_seconds"] = events_late_arrival_max_delay_in_seconds
        if events_out_of_order_max_delay_in_seconds is not None:
            self._values["events_out_of_order_max_delay_in_seconds"] = events_out_of_order_max_delay_in_seconds
        if events_out_of_order_policy is not None:
            self._values["events_out_of_order_policy"] = events_out_of_order_policy
        if output_error_policy is not None:
            self._values["output_error_policy"] = output_error_policy
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def streaming_units(self) -> jsii.Number:
        result = self._values.get("streaming_units")
        assert result is not None, "Required property 'streaming_units' is missing"
        return result

    @builtins.property
    def transformation_query(self) -> builtins.str:
        result = self._values.get("transformation_query")
        assert result is not None, "Required property 'transformation_query' is missing"
        return result

    @builtins.property
    def compatibility_level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("compatibility_level")
        return result

    @builtins.property
    def data_locale(self) -> typing.Optional[builtins.str]:
        result = self._values.get("data_locale")
        return result

    @builtins.property
    def events_late_arrival_max_delay_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("events_late_arrival_max_delay_in_seconds")
        return result

    @builtins.property
    def events_out_of_order_max_delay_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("events_out_of_order_max_delay_in_seconds")
        return result

    @builtins.property
    def events_out_of_order_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("events_out_of_order_policy")
        return result

    @builtins.property
    def output_error_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("output_error_policy")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsJobTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsJobConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsJobTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsJobTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsJobTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsOutputBlob(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsOutputBlob",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        date_format: builtins.str,
        name: builtins.str,
        path_pattern: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputBlobSerialization"],
        storage_account_key: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        time_format: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputBlobTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param date_format: -
        :param name: -
        :param path_pattern: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param storage_account_key: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param stream_analytics_job_name: -
        :param time_format: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsOutputBlobConfig(
            date_format=date_format,
            name=name,
            path_pattern=path_pattern,
            resource_group_name=resource_group_name,
            serialization=serialization,
            storage_account_key=storage_account_key,
            storage_account_name=storage_account_name,
            storage_container_name=storage_container_name,
            stream_analytics_job_name=stream_analytics_job_name,
            time_format=time_format,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsOutputBlob, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dateFormatInput")
    def date_format_input(self) -> builtins.str:
        return jsii.get(self, "dateFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathPatternInput")
    def path_pattern_input(self) -> builtins.str:
        return jsii.get(self, "pathPatternInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsOutputBlobSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKeyInput")
    def storage_account_key_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerNameInput")
    def storage_container_name_input(self) -> builtins.str:
        return jsii.get(self, "storageContainerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeFormatInput")
    def time_format_input(self) -> builtins.str:
        return jsii.get(self, "timeFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StreamAnalyticsOutputBlobTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dateFormat")
    def date_format(self) -> builtins.str:
        return jsii.get(self, "dateFormat")

    @date_format.setter # type: ignore
    def date_format(self, value: builtins.str) -> None:
        jsii.set(self, "dateFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathPattern")
    def path_pattern(self) -> builtins.str:
        return jsii.get(self, "pathPattern")

    @path_pattern.setter # type: ignore
    def path_pattern(self, value: builtins.str) -> None:
        jsii.set(self, "pathPattern", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(self) -> typing.List["StreamAnalyticsOutputBlobSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsOutputBlobSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKey")
    def storage_account_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountKey")

    @storage_account_key.setter # type: ignore
    def storage_account_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerName")
    def storage_container_name(self) -> builtins.str:
        return jsii.get(self, "storageContainerName")

    @storage_container_name.setter # type: ignore
    def storage_container_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageContainerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeFormat")
    def time_format(self) -> builtins.str:
        return jsii.get(self, "timeFormat")

    @time_format.setter # type: ignore
    def time_format(self, value: builtins.str) -> None:
        jsii.set(self, "timeFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsOutputBlobTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsOutputBlobTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputBlobConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "date_format": "dateFormat",
        "name": "name",
        "path_pattern": "pathPattern",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "storage_account_key": "storageAccountKey",
        "storage_account_name": "storageAccountName",
        "storage_container_name": "storageContainerName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "time_format": "timeFormat",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsOutputBlobConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        date_format: builtins.str,
        name: builtins.str,
        path_pattern: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputBlobSerialization"],
        storage_account_key: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        time_format: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputBlobTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param date_format: -
        :param name: -
        :param path_pattern: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param storage_account_key: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param stream_analytics_job_name: -
        :param time_format: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsOutputBlobTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "date_format": date_format,
            "name": name,
            "path_pattern": path_pattern,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "storage_account_key": storage_account_key,
            "storage_account_name": storage_account_name,
            "storage_container_name": storage_container_name,
            "stream_analytics_job_name": stream_analytics_job_name,
            "time_format": time_format,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def date_format(self) -> builtins.str:
        result = self._values.get("date_format")
        assert result is not None, "Required property 'date_format' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def path_pattern(self) -> builtins.str:
        result = self._values.get("path_pattern")
        assert result is not None, "Required property 'path_pattern' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(self) -> typing.List["StreamAnalyticsOutputBlobSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def storage_container_name(self) -> builtins.str:
        result = self._values.get("storage_container_name")
        assert result is not None, "Required property 'storage_container_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def time_format(self) -> builtins.str:
        result = self._values.get("time_format")
        assert result is not None, "Required property 'time_format' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsOutputBlobTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputBlobConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputBlobSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
        "format": "format",
    },
)
class StreamAnalyticsOutputBlobSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
        format: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        :param format: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter
        if format is not None:
            self._values["format"] = format

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    @builtins.property
    def format(self) -> typing.Optional[builtins.str]:
        result = self._values.get("format")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputBlobSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputBlobTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsOutputBlobTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputBlobTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsOutputEventhub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsOutputEventhub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        eventhub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputEventhubSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputEventhubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param eventhub_name: -
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsOutputEventhubConfig(
            eventhub_name=eventhub_name,
            name=name,
            resource_group_name=resource_group_name,
            serialization=serialization,
            servicebus_namespace=servicebus_namespace,
            shared_access_policy_key=shared_access_policy_key,
            shared_access_policy_name=shared_access_policy_name,
            stream_analytics_job_name=stream_analytics_job_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsOutputEventhub, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubNameInput")
    def eventhub_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsOutputEventhubSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespaceInput")
    def servicebus_namespace_input(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKeyInput")
    def shared_access_policy_key_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyNameInput")
    def shared_access_policy_name_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsOutputEventhubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubName")
    def eventhub_name(self) -> builtins.str:
        return jsii.get(self, "eventhubName")

    @eventhub_name.setter # type: ignore
    def eventhub_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsOutputEventhubSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsOutputEventhubSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespace")
    def servicebus_namespace(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespace")

    @servicebus_namespace.setter # type: ignore
    def servicebus_namespace(self, value: builtins.str) -> None:
        jsii.set(self, "servicebusNamespace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKey")
    def shared_access_policy_key(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKey")

    @shared_access_policy_key.setter # type: ignore
    def shared_access_policy_key(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyName")
    def shared_access_policy_name(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyName")

    @shared_access_policy_name.setter # type: ignore
    def shared_access_policy_name(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsOutputEventhubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsOutputEventhubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputEventhubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "eventhub_name": "eventhubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "servicebus_namespace": "servicebusNamespace",
        "shared_access_policy_key": "sharedAccessPolicyKey",
        "shared_access_policy_name": "sharedAccessPolicyName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsOutputEventhubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        eventhub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputEventhubSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputEventhubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param eventhub_name: -
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsOutputEventhubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "eventhub_name": eventhub_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "servicebus_namespace": servicebus_namespace,
            "shared_access_policy_key": shared_access_policy_key,
            "shared_access_policy_name": shared_access_policy_name,
            "stream_analytics_job_name": stream_analytics_job_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def eventhub_name(self) -> builtins.str:
        result = self._values.get("eventhub_name")
        assert result is not None, "Required property 'eventhub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsOutputEventhubSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def servicebus_namespace(self) -> builtins.str:
        result = self._values.get("servicebus_namespace")
        assert result is not None, "Required property 'servicebus_namespace' is missing"
        return result

    @builtins.property
    def shared_access_policy_key(self) -> builtins.str:
        result = self._values.get("shared_access_policy_key")
        assert result is not None, "Required property 'shared_access_policy_key' is missing"
        return result

    @builtins.property
    def shared_access_policy_name(self) -> builtins.str:
        result = self._values.get("shared_access_policy_name")
        assert result is not None, "Required property 'shared_access_policy_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsOutputEventhubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputEventhubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputEventhubSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
        "format": "format",
    },
)
class StreamAnalyticsOutputEventhubSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
        format: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        :param format: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter
        if format is not None:
            self._values["format"] = format

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    @builtins.property
    def format(self) -> typing.Optional[builtins.str]:
        result = self._values.get("format")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputEventhubSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputEventhubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsOutputEventhubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputEventhubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsOutputMssql(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsOutputMssql",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        database: builtins.str,
        name: builtins.str,
        password: builtins.str,
        resource_group_name: builtins.str,
        server: builtins.str,
        stream_analytics_job_name: builtins.str,
        table: builtins.str,
        user: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputMssqlTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param database: -
        :param name: -
        :param password: -
        :param resource_group_name: -
        :param server: -
        :param stream_analytics_job_name: -
        :param table: -
        :param user: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsOutputMssqlConfig(
            database=database,
            name=name,
            password=password,
            resource_group_name=resource_group_name,
            server=server,
            stream_analytics_job_name=stream_analytics_job_name,
            table=table,
            user=user,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsOutputMssql, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="databaseInput")
    def database_input(self) -> builtins.str:
        return jsii.get(self, "databaseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="passwordInput")
    def password_input(self) -> builtins.str:
        return jsii.get(self, "passwordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serverInput")
    def server_input(self) -> builtins.str:
        return jsii.get(self, "serverInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tableInput")
    def table_input(self) -> builtins.str:
        return jsii.get(self, "tableInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="userInput")
    def user_input(self) -> builtins.str:
        return jsii.get(self, "userInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["StreamAnalyticsOutputMssqlTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="database")
    def database(self) -> builtins.str:
        return jsii.get(self, "database")

    @database.setter # type: ignore
    def database(self, value: builtins.str) -> None:
        jsii.set(self, "database", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="password")
    def password(self) -> builtins.str:
        return jsii.get(self, "password")

    @password.setter # type: ignore
    def password(self, value: builtins.str) -> None:
        jsii.set(self, "password", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="server")
    def server(self) -> builtins.str:
        return jsii.get(self, "server")

    @server.setter # type: ignore
    def server(self, value: builtins.str) -> None:
        jsii.set(self, "server", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="table")
    def table(self) -> builtins.str:
        return jsii.get(self, "table")

    @table.setter # type: ignore
    def table(self, value: builtins.str) -> None:
        jsii.set(self, "table", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsOutputMssqlTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsOutputMssqlTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="user")
    def user(self) -> builtins.str:
        return jsii.get(self, "user")

    @user.setter # type: ignore
    def user(self, value: builtins.str) -> None:
        jsii.set(self, "user", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputMssqlConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "database": "database",
        "name": "name",
        "password": "password",
        "resource_group_name": "resourceGroupName",
        "server": "server",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "table": "table",
        "user": "user",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsOutputMssqlConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        database: builtins.str,
        name: builtins.str,
        password: builtins.str,
        resource_group_name: builtins.str,
        server: builtins.str,
        stream_analytics_job_name: builtins.str,
        table: builtins.str,
        user: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputMssqlTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param database: -
        :param name: -
        :param password: -
        :param resource_group_name: -
        :param server: -
        :param stream_analytics_job_name: -
        :param table: -
        :param user: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsOutputMssqlTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "database": database,
            "name": name,
            "password": password,
            "resource_group_name": resource_group_name,
            "server": server,
            "stream_analytics_job_name": stream_analytics_job_name,
            "table": table,
            "user": user,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def database(self) -> builtins.str:
        result = self._values.get("database")
        assert result is not None, "Required property 'database' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def password(self) -> builtins.str:
        result = self._values.get("password")
        assert result is not None, "Required property 'password' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def server(self) -> builtins.str:
        result = self._values.get("server")
        assert result is not None, "Required property 'server' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def table(self) -> builtins.str:
        result = self._values.get("table")
        assert result is not None, "Required property 'table' is missing"
        return result

    @builtins.property
    def user(self) -> builtins.str:
        result = self._values.get("user")
        assert result is not None, "Required property 'user' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsOutputMssqlTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputMssqlConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputMssqlTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsOutputMssqlTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputMssqlTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsOutputServicebusQueue(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsOutputServicebusQueue",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        queue_name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputServicebusQueueSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputServicebusQueueTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param queue_name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsOutputServicebusQueueConfig(
            name=name,
            queue_name=queue_name,
            resource_group_name=resource_group_name,
            serialization=serialization,
            servicebus_namespace=servicebus_namespace,
            shared_access_policy_key=shared_access_policy_key,
            shared_access_policy_name=shared_access_policy_name,
            stream_analytics_job_name=stream_analytics_job_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsOutputServicebusQueue, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queueNameInput")
    def queue_name_input(self) -> builtins.str:
        return jsii.get(self, "queueNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsOutputServicebusQueueSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespaceInput")
    def servicebus_namespace_input(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKeyInput")
    def shared_access_policy_key_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyNameInput")
    def shared_access_policy_name_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsOutputServicebusQueueTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="queueName")
    def queue_name(self) -> builtins.str:
        return jsii.get(self, "queueName")

    @queue_name.setter # type: ignore
    def queue_name(self, value: builtins.str) -> None:
        jsii.set(self, "queueName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsOutputServicebusQueueSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsOutputServicebusQueueSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespace")
    def servicebus_namespace(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespace")

    @servicebus_namespace.setter # type: ignore
    def servicebus_namespace(self, value: builtins.str) -> None:
        jsii.set(self, "servicebusNamespace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKey")
    def shared_access_policy_key(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKey")

    @shared_access_policy_key.setter # type: ignore
    def shared_access_policy_key(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyName")
    def shared_access_policy_name(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyName")

    @shared_access_policy_name.setter # type: ignore
    def shared_access_policy_name(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsOutputServicebusQueueTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsOutputServicebusQueueTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputServicebusQueueConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "queue_name": "queueName",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "servicebus_namespace": "servicebusNamespace",
        "shared_access_policy_key": "sharedAccessPolicyKey",
        "shared_access_policy_name": "sharedAccessPolicyName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsOutputServicebusQueueConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        queue_name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputServicebusQueueSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputServicebusQueueTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param queue_name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsOutputServicebusQueueTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "queue_name": queue_name,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "servicebus_namespace": servicebus_namespace,
            "shared_access_policy_key": shared_access_policy_key,
            "shared_access_policy_name": shared_access_policy_name,
            "stream_analytics_job_name": stream_analytics_job_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def queue_name(self) -> builtins.str:
        result = self._values.get("queue_name")
        assert result is not None, "Required property 'queue_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsOutputServicebusQueueSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def servicebus_namespace(self) -> builtins.str:
        result = self._values.get("servicebus_namespace")
        assert result is not None, "Required property 'servicebus_namespace' is missing"
        return result

    @builtins.property
    def shared_access_policy_key(self) -> builtins.str:
        result = self._values.get("shared_access_policy_key")
        assert result is not None, "Required property 'shared_access_policy_key' is missing"
        return result

    @builtins.property
    def shared_access_policy_name(self) -> builtins.str:
        result = self._values.get("shared_access_policy_name")
        assert result is not None, "Required property 'shared_access_policy_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["StreamAnalyticsOutputServicebusQueueTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputServicebusQueueConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputServicebusQueueSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
        "format": "format",
    },
)
class StreamAnalyticsOutputServicebusQueueSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
        format: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        :param format: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter
        if format is not None:
            self._values["format"] = format

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    @builtins.property
    def format(self) -> typing.Optional[builtins.str]:
        result = self._values.get("format")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputServicebusQueueSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputServicebusQueueTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsOutputServicebusQueueTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputServicebusQueueTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsOutputServicebusTopic(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsOutputServicebusTopic",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputServicebusTopicSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        topic_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputServicebusTopicTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param topic_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsOutputServicebusTopicConfig(
            name=name,
            resource_group_name=resource_group_name,
            serialization=serialization,
            servicebus_namespace=servicebus_namespace,
            shared_access_policy_key=shared_access_policy_key,
            shared_access_policy_name=shared_access_policy_name,
            stream_analytics_job_name=stream_analytics_job_name,
            topic_name=topic_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsOutputServicebusTopic, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsOutputServicebusTopicSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespaceInput")
    def servicebus_namespace_input(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKeyInput")
    def shared_access_policy_key_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyNameInput")
    def shared_access_policy_name_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicNameInput")
    def topic_name_input(self) -> builtins.str:
        return jsii.get(self, "topicNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsOutputServicebusTopicTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsOutputServicebusTopicSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsOutputServicebusTopicSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespace")
    def servicebus_namespace(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespace")

    @servicebus_namespace.setter # type: ignore
    def servicebus_namespace(self, value: builtins.str) -> None:
        jsii.set(self, "servicebusNamespace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKey")
    def shared_access_policy_key(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKey")

    @shared_access_policy_key.setter # type: ignore
    def shared_access_policy_key(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyName")
    def shared_access_policy_name(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyName")

    @shared_access_policy_name.setter # type: ignore
    def shared_access_policy_name(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsOutputServicebusTopicTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsOutputServicebusTopicTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="topicName")
    def topic_name(self) -> builtins.str:
        return jsii.get(self, "topicName")

    @topic_name.setter # type: ignore
    def topic_name(self, value: builtins.str) -> None:
        jsii.set(self, "topicName", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputServicebusTopicConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "servicebus_namespace": "servicebusNamespace",
        "shared_access_policy_key": "sharedAccessPolicyKey",
        "shared_access_policy_name": "sharedAccessPolicyName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "topic_name": "topicName",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsOutputServicebusTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsOutputServicebusTopicSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        topic_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsOutputServicebusTopicTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param topic_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsOutputServicebusTopicTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "servicebus_namespace": servicebus_namespace,
            "shared_access_policy_key": shared_access_policy_key,
            "shared_access_policy_name": shared_access_policy_name,
            "stream_analytics_job_name": stream_analytics_job_name,
            "topic_name": topic_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsOutputServicebusTopicSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def servicebus_namespace(self) -> builtins.str:
        result = self._values.get("servicebus_namespace")
        assert result is not None, "Required property 'servicebus_namespace' is missing"
        return result

    @builtins.property
    def shared_access_policy_key(self) -> builtins.str:
        result = self._values.get("shared_access_policy_key")
        assert result is not None, "Required property 'shared_access_policy_key' is missing"
        return result

    @builtins.property
    def shared_access_policy_name(self) -> builtins.str:
        result = self._values.get("shared_access_policy_name")
        assert result is not None, "Required property 'shared_access_policy_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def topic_name(self) -> builtins.str:
        result = self._values.get("topic_name")
        assert result is not None, "Required property 'topic_name' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["StreamAnalyticsOutputServicebusTopicTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputServicebusTopicConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputServicebusTopicSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
        "format": "format",
    },
)
class StreamAnalyticsOutputServicebusTopicSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
        format: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        :param format: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter
        if format is not None:
            self._values["format"] = format

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    @builtins.property
    def format(self) -> typing.Optional[builtins.str]:
        result = self._values.get("format")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputServicebusTopicSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsOutputServicebusTopicTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsOutputServicebusTopicTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsOutputServicebusTopicTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsReferenceInputBlob(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsReferenceInputBlob",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        date_format: builtins.str,
        name: builtins.str,
        path_pattern: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsReferenceInputBlobSerialization"],
        storage_account_key: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        time_format: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsReferenceInputBlobTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param date_format: -
        :param name: -
        :param path_pattern: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param storage_account_key: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param stream_analytics_job_name: -
        :param time_format: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsReferenceInputBlobConfig(
            date_format=date_format,
            name=name,
            path_pattern=path_pattern,
            resource_group_name=resource_group_name,
            serialization=serialization,
            storage_account_key=storage_account_key,
            storage_account_name=storage_account_name,
            storage_container_name=storage_container_name,
            stream_analytics_job_name=stream_analytics_job_name,
            time_format=time_format,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsReferenceInputBlob, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dateFormatInput")
    def date_format_input(self) -> builtins.str:
        return jsii.get(self, "dateFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathPatternInput")
    def path_pattern_input(self) -> builtins.str:
        return jsii.get(self, "pathPatternInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsReferenceInputBlobSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKeyInput")
    def storage_account_key_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerNameInput")
    def storage_container_name_input(self) -> builtins.str:
        return jsii.get(self, "storageContainerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeFormatInput")
    def time_format_input(self) -> builtins.str:
        return jsii.get(self, "timeFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsReferenceInputBlobTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dateFormat")
    def date_format(self) -> builtins.str:
        return jsii.get(self, "dateFormat")

    @date_format.setter # type: ignore
    def date_format(self, value: builtins.str) -> None:
        jsii.set(self, "dateFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathPattern")
    def path_pattern(self) -> builtins.str:
        return jsii.get(self, "pathPattern")

    @path_pattern.setter # type: ignore
    def path_pattern(self, value: builtins.str) -> None:
        jsii.set(self, "pathPattern", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsReferenceInputBlobSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsReferenceInputBlobSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKey")
    def storage_account_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountKey")

    @storage_account_key.setter # type: ignore
    def storage_account_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerName")
    def storage_container_name(self) -> builtins.str:
        return jsii.get(self, "storageContainerName")

    @storage_container_name.setter # type: ignore
    def storage_container_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageContainerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeFormat")
    def time_format(self) -> builtins.str:
        return jsii.get(self, "timeFormat")

    @time_format.setter # type: ignore
    def time_format(self, value: builtins.str) -> None:
        jsii.set(self, "timeFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsReferenceInputBlobTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsReferenceInputBlobTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsReferenceInputBlobConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "date_format": "dateFormat",
        "name": "name",
        "path_pattern": "pathPattern",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "storage_account_key": "storageAccountKey",
        "storage_account_name": "storageAccountName",
        "storage_container_name": "storageContainerName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "time_format": "timeFormat",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsReferenceInputBlobConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        date_format: builtins.str,
        name: builtins.str,
        path_pattern: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsReferenceInputBlobSerialization"],
        storage_account_key: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        time_format: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsReferenceInputBlobTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param date_format: -
        :param name: -
        :param path_pattern: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param storage_account_key: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param stream_analytics_job_name: -
        :param time_format: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsReferenceInputBlobTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "date_format": date_format,
            "name": name,
            "path_pattern": path_pattern,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "storage_account_key": storage_account_key,
            "storage_account_name": storage_account_name,
            "storage_container_name": storage_container_name,
            "stream_analytics_job_name": stream_analytics_job_name,
            "time_format": time_format,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def date_format(self) -> builtins.str:
        result = self._values.get("date_format")
        assert result is not None, "Required property 'date_format' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def path_pattern(self) -> builtins.str:
        result = self._values.get("path_pattern")
        assert result is not None, "Required property 'path_pattern' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsReferenceInputBlobSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def storage_container_name(self) -> builtins.str:
        result = self._values.get("storage_container_name")
        assert result is not None, "Required property 'storage_container_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def time_format(self) -> builtins.str:
        result = self._values.get("time_format")
        assert result is not None, "Required property 'time_format' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsReferenceInputBlobTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsReferenceInputBlobConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsReferenceInputBlobSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
    },
)
class StreamAnalyticsReferenceInputBlobSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsReferenceInputBlobSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsReferenceInputBlobTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsReferenceInputBlobTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsReferenceInputBlobTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsStreamInputBlob(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsStreamInputBlob",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        date_format: builtins.str,
        name: builtins.str,
        path_pattern: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsStreamInputBlobSerialization"],
        storage_account_key: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        time_format: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsStreamInputBlobTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param date_format: -
        :param name: -
        :param path_pattern: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param storage_account_key: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param stream_analytics_job_name: -
        :param time_format: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsStreamInputBlobConfig(
            date_format=date_format,
            name=name,
            path_pattern=path_pattern,
            resource_group_name=resource_group_name,
            serialization=serialization,
            storage_account_key=storage_account_key,
            storage_account_name=storage_account_name,
            storage_container_name=storage_container_name,
            stream_analytics_job_name=stream_analytics_job_name,
            time_format=time_format,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsStreamInputBlob, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dateFormatInput")
    def date_format_input(self) -> builtins.str:
        return jsii.get(self, "dateFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathPatternInput")
    def path_pattern_input(self) -> builtins.str:
        return jsii.get(self, "pathPatternInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputBlobSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKeyInput")
    def storage_account_key_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountNameInput")
    def storage_account_name_input(self) -> builtins.str:
        return jsii.get(self, "storageAccountNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerNameInput")
    def storage_container_name_input(self) -> builtins.str:
        return jsii.get(self, "storageContainerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeFormatInput")
    def time_format_input(self) -> builtins.str:
        return jsii.get(self, "timeFormatInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsStreamInputBlobTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dateFormat")
    def date_format(self) -> builtins.str:
        return jsii.get(self, "dateFormat")

    @date_format.setter # type: ignore
    def date_format(self, value: builtins.str) -> None:
        jsii.set(self, "dateFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="pathPattern")
    def path_pattern(self) -> builtins.str:
        return jsii.get(self, "pathPattern")

    @path_pattern.setter # type: ignore
    def path_pattern(self, value: builtins.str) -> None:
        jsii.set(self, "pathPattern", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputBlobSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsStreamInputBlobSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountKey")
    def storage_account_key(self) -> builtins.str:
        return jsii.get(self, "storageAccountKey")

    @storage_account_key.setter # type: ignore
    def storage_account_key(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageAccountName")
    def storage_account_name(self) -> builtins.str:
        return jsii.get(self, "storageAccountName")

    @storage_account_name.setter # type: ignore
    def storage_account_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageAccountName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageContainerName")
    def storage_container_name(self) -> builtins.str:
        return jsii.get(self, "storageContainerName")

    @storage_container_name.setter # type: ignore
    def storage_container_name(self, value: builtins.str) -> None:
        jsii.set(self, "storageContainerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeFormat")
    def time_format(self) -> builtins.str:
        return jsii.get(self, "timeFormat")

    @time_format.setter # type: ignore
    def time_format(self, value: builtins.str) -> None:
        jsii.set(self, "timeFormat", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsStreamInputBlobTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsStreamInputBlobTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputBlobConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "date_format": "dateFormat",
        "name": "name",
        "path_pattern": "pathPattern",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "storage_account_key": "storageAccountKey",
        "storage_account_name": "storageAccountName",
        "storage_container_name": "storageContainerName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "time_format": "timeFormat",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsStreamInputBlobConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        date_format: builtins.str,
        name: builtins.str,
        path_pattern: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsStreamInputBlobSerialization"],
        storage_account_key: builtins.str,
        storage_account_name: builtins.str,
        storage_container_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        time_format: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsStreamInputBlobTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param date_format: -
        :param name: -
        :param path_pattern: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param storage_account_key: -
        :param storage_account_name: -
        :param storage_container_name: -
        :param stream_analytics_job_name: -
        :param time_format: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsStreamInputBlobTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "date_format": date_format,
            "name": name,
            "path_pattern": path_pattern,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "storage_account_key": storage_account_key,
            "storage_account_name": storage_account_name,
            "storage_container_name": storage_container_name,
            "stream_analytics_job_name": stream_analytics_job_name,
            "time_format": time_format,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def date_format(self) -> builtins.str:
        result = self._values.get("date_format")
        assert result is not None, "Required property 'date_format' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def path_pattern(self) -> builtins.str:
        result = self._values.get("path_pattern")
        assert result is not None, "Required property 'path_pattern' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputBlobSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def storage_account_key(self) -> builtins.str:
        result = self._values.get("storage_account_key")
        assert result is not None, "Required property 'storage_account_key' is missing"
        return result

    @builtins.property
    def storage_account_name(self) -> builtins.str:
        result = self._values.get("storage_account_name")
        assert result is not None, "Required property 'storage_account_name' is missing"
        return result

    @builtins.property
    def storage_container_name(self) -> builtins.str:
        result = self._values.get("storage_container_name")
        assert result is not None, "Required property 'storage_container_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def time_format(self) -> builtins.str:
        result = self._values.get("time_format")
        assert result is not None, "Required property 'time_format' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsStreamInputBlobTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputBlobConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputBlobSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
    },
)
class StreamAnalyticsStreamInputBlobSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputBlobSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputBlobTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsStreamInputBlobTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputBlobTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsStreamInputEventhub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsStreamInputEventhub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        eventhub_consumer_group_name: builtins.str,
        eventhub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsStreamInputEventhubSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsStreamInputEventhubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param eventhub_consumer_group_name: -
        :param eventhub_name: -
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsStreamInputEventhubConfig(
            eventhub_consumer_group_name=eventhub_consumer_group_name,
            eventhub_name=eventhub_name,
            name=name,
            resource_group_name=resource_group_name,
            serialization=serialization,
            servicebus_namespace=servicebus_namespace,
            shared_access_policy_key=shared_access_policy_key,
            shared_access_policy_name=shared_access_policy_name,
            stream_analytics_job_name=stream_analytics_job_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsStreamInputEventhub, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubConsumerGroupNameInput")
    def eventhub_consumer_group_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubConsumerGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubNameInput")
    def eventhub_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputEventhubSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespaceInput")
    def servicebus_namespace_input(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKeyInput")
    def shared_access_policy_key_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyNameInput")
    def shared_access_policy_name_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsStreamInputEventhubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubConsumerGroupName")
    def eventhub_consumer_group_name(self) -> builtins.str:
        return jsii.get(self, "eventhubConsumerGroupName")

    @eventhub_consumer_group_name.setter # type: ignore
    def eventhub_consumer_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubConsumerGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubName")
    def eventhub_name(self) -> builtins.str:
        return jsii.get(self, "eventhubName")

    @eventhub_name.setter # type: ignore
    def eventhub_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputEventhubSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsStreamInputEventhubSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="servicebusNamespace")
    def servicebus_namespace(self) -> builtins.str:
        return jsii.get(self, "servicebusNamespace")

    @servicebus_namespace.setter # type: ignore
    def servicebus_namespace(self, value: builtins.str) -> None:
        jsii.set(self, "servicebusNamespace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKey")
    def shared_access_policy_key(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKey")

    @shared_access_policy_key.setter # type: ignore
    def shared_access_policy_key(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyName")
    def shared_access_policy_name(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyName")

    @shared_access_policy_name.setter # type: ignore
    def shared_access_policy_name(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsStreamInputEventhubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsStreamInputEventhubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputEventhubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "eventhub_consumer_group_name": "eventhubConsumerGroupName",
        "eventhub_name": "eventhubName",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "servicebus_namespace": "servicebusNamespace",
        "shared_access_policy_key": "sharedAccessPolicyKey",
        "shared_access_policy_name": "sharedAccessPolicyName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsStreamInputEventhubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        eventhub_consumer_group_name: builtins.str,
        eventhub_name: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsStreamInputEventhubSerialization"],
        servicebus_namespace: builtins.str,
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsStreamInputEventhubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param eventhub_consumer_group_name: -
        :param eventhub_name: -
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param servicebus_namespace: -
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsStreamInputEventhubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "eventhub_consumer_group_name": eventhub_consumer_group_name,
            "eventhub_name": eventhub_name,
            "name": name,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "servicebus_namespace": servicebus_namespace,
            "shared_access_policy_key": shared_access_policy_key,
            "shared_access_policy_name": shared_access_policy_name,
            "stream_analytics_job_name": stream_analytics_job_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def eventhub_consumer_group_name(self) -> builtins.str:
        result = self._values.get("eventhub_consumer_group_name")
        assert result is not None, "Required property 'eventhub_consumer_group_name' is missing"
        return result

    @builtins.property
    def eventhub_name(self) -> builtins.str:
        result = self._values.get("eventhub_name")
        assert result is not None, "Required property 'eventhub_name' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputEventhubSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def servicebus_namespace(self) -> builtins.str:
        result = self._values.get("servicebus_namespace")
        assert result is not None, "Required property 'servicebus_namespace' is missing"
        return result

    @builtins.property
    def shared_access_policy_key(self) -> builtins.str:
        result = self._values.get("shared_access_policy_key")
        assert result is not None, "Required property 'shared_access_policy_key' is missing"
        return result

    @builtins.property
    def shared_access_policy_name(self) -> builtins.str:
        result = self._values.get("shared_access_policy_name")
        assert result is not None, "Required property 'shared_access_policy_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsStreamInputEventhubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputEventhubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputEventhubSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
    },
)
class StreamAnalyticsStreamInputEventhubSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputEventhubSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputEventhubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsStreamInputEventhubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputEventhubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class StreamAnalyticsStreamInputIothub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.StreamAnalyticsStreamInputIothub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        endpoint: builtins.str,
        eventhub_consumer_group_name: builtins.str,
        iothub_namespace: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsStreamInputIothubSerialization"],
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsStreamInputIothubTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param endpoint: -
        :param eventhub_consumer_group_name: -
        :param iothub_namespace: -
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StreamAnalyticsStreamInputIothubConfig(
            endpoint=endpoint,
            eventhub_consumer_group_name=eventhub_consumer_group_name,
            iothub_namespace=iothub_namespace,
            name=name,
            resource_group_name=resource_group_name,
            serialization=serialization,
            shared_access_policy_key=shared_access_policy_key,
            shared_access_policy_name=shared_access_policy_name,
            stream_analytics_job_name=stream_analytics_job_name,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(StreamAnalyticsStreamInputIothub, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointInput")
    def endpoint_input(self) -> builtins.str:
        return jsii.get(self, "endpointInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubConsumerGroupNameInput")
    def eventhub_consumer_group_name_input(self) -> builtins.str:
        return jsii.get(self, "eventhubConsumerGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNamespaceInput")
    def iothub_namespace_input(self) -> builtins.str:
        return jsii.get(self, "iothubNamespaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serializationInput")
    def serialization_input(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputIothubSerialization"]:
        return jsii.get(self, "serializationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKeyInput")
    def shared_access_policy_key_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyNameInput")
    def shared_access_policy_name_input(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobNameInput")
    def stream_analytics_job_name_input(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["StreamAnalyticsStreamInputIothubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> builtins.str:
        return jsii.get(self, "endpoint")

    @endpoint.setter # type: ignore
    def endpoint(self, value: builtins.str) -> None:
        jsii.set(self, "endpoint", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="eventhubConsumerGroupName")
    def eventhub_consumer_group_name(self) -> builtins.str:
        return jsii.get(self, "eventhubConsumerGroupName")

    @eventhub_consumer_group_name.setter # type: ignore
    def eventhub_consumer_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "eventhubConsumerGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="iothubNamespace")
    def iothub_namespace(self) -> builtins.str:
        return jsii.get(self, "iothubNamespace")

    @iothub_namespace.setter # type: ignore
    def iothub_namespace(self, value: builtins.str) -> None:
        jsii.set(self, "iothubNamespace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serialization")
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputIothubSerialization"]:
        return jsii.get(self, "serialization")

    @serialization.setter # type: ignore
    def serialization(
        self,
        value: typing.List["StreamAnalyticsStreamInputIothubSerialization"],
    ) -> None:
        jsii.set(self, "serialization", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyKey")
    def shared_access_policy_key(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyKey")

    @shared_access_policy_key.setter # type: ignore
    def shared_access_policy_key(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedAccessPolicyName")
    def shared_access_policy_name(self) -> builtins.str:
        return jsii.get(self, "sharedAccessPolicyName")

    @shared_access_policy_name.setter # type: ignore
    def shared_access_policy_name(self, value: builtins.str) -> None:
        jsii.set(self, "sharedAccessPolicyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="streamAnalyticsJobName")
    def stream_analytics_job_name(self) -> builtins.str:
        return jsii.get(self, "streamAnalyticsJobName")

    @stream_analytics_job_name.setter # type: ignore
    def stream_analytics_job_name(self, value: builtins.str) -> None:
        jsii.set(self, "streamAnalyticsJobName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "StreamAnalyticsStreamInputIothubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "StreamAnalyticsStreamInputIothubTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputIothubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "endpoint": "endpoint",
        "eventhub_consumer_group_name": "eventhubConsumerGroupName",
        "iothub_namespace": "iothubNamespace",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "serialization": "serialization",
        "shared_access_policy_key": "sharedAccessPolicyKey",
        "shared_access_policy_name": "sharedAccessPolicyName",
        "stream_analytics_job_name": "streamAnalyticsJobName",
        "timeouts": "timeouts",
    },
)
class StreamAnalyticsStreamInputIothubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        endpoint: builtins.str,
        eventhub_consumer_group_name: builtins.str,
        iothub_namespace: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        serialization: typing.List["StreamAnalyticsStreamInputIothubSerialization"],
        shared_access_policy_key: builtins.str,
        shared_access_policy_name: builtins.str,
        stream_analytics_job_name: builtins.str,
        timeouts: typing.Optional["StreamAnalyticsStreamInputIothubTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param endpoint: -
        :param eventhub_consumer_group_name: -
        :param iothub_namespace: -
        :param name: -
        :param resource_group_name: -
        :param serialization: serialization block.
        :param shared_access_policy_key: -
        :param shared_access_policy_name: -
        :param stream_analytics_job_name: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = StreamAnalyticsStreamInputIothubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "endpoint": endpoint,
            "eventhub_consumer_group_name": eventhub_consumer_group_name,
            "iothub_namespace": iothub_namespace,
            "name": name,
            "resource_group_name": resource_group_name,
            "serialization": serialization,
            "shared_access_policy_key": shared_access_policy_key,
            "shared_access_policy_name": shared_access_policy_name,
            "stream_analytics_job_name": stream_analytics_job_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def endpoint(self) -> builtins.str:
        result = self._values.get("endpoint")
        assert result is not None, "Required property 'endpoint' is missing"
        return result

    @builtins.property
    def eventhub_consumer_group_name(self) -> builtins.str:
        result = self._values.get("eventhub_consumer_group_name")
        assert result is not None, "Required property 'eventhub_consumer_group_name' is missing"
        return result

    @builtins.property
    def iothub_namespace(self) -> builtins.str:
        result = self._values.get("iothub_namespace")
        assert result is not None, "Required property 'iothub_namespace' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def serialization(
        self,
    ) -> typing.List["StreamAnalyticsStreamInputIothubSerialization"]:
        """serialization block."""
        result = self._values.get("serialization")
        assert result is not None, "Required property 'serialization' is missing"
        return result

    @builtins.property
    def shared_access_policy_key(self) -> builtins.str:
        result = self._values.get("shared_access_policy_key")
        assert result is not None, "Required property 'shared_access_policy_key' is missing"
        return result

    @builtins.property
    def shared_access_policy_name(self) -> builtins.str:
        result = self._values.get("shared_access_policy_name")
        assert result is not None, "Required property 'shared_access_policy_name' is missing"
        return result

    @builtins.property
    def stream_analytics_job_name(self) -> builtins.str:
        result = self._values.get("stream_analytics_job_name")
        assert result is not None, "Required property 'stream_analytics_job_name' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["StreamAnalyticsStreamInputIothubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputIothubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputIothubSerialization",
    jsii_struct_bases=[],
    name_mapping={
        "type": "type",
        "encoding": "encoding",
        "field_delimiter": "fieldDelimiter",
    },
)
class StreamAnalyticsStreamInputIothubSerialization:
    def __init__(
        self,
        *,
        type: builtins.str,
        encoding: typing.Optional[builtins.str] = None,
        field_delimiter: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param type: -
        :param encoding: -
        :param field_delimiter: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if encoding is not None:
            self._values["encoding"] = encoding
        if field_delimiter is not None:
            self._values["field_delimiter"] = field_delimiter

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def encoding(self) -> typing.Optional[builtins.str]:
        result = self._values.get("encoding")
        return result

    @builtins.property
    def field_delimiter(self) -> typing.Optional[builtins.str]:
        result = self._values.get("field_delimiter")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputIothubSerialization(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.StreamAnalyticsStreamInputIothubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class StreamAnalyticsStreamInputIothubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "StreamAnalyticsStreamInputIothubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class Subnet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.Subnet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_name: builtins.str,
        address_prefix: typing.Optional[builtins.str] = None,
        address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        delegation: typing.Optional[typing.List["SubnetDelegation"]] = None,
        enforce_private_link_endpoint_network_policies: typing.Optional[builtins.bool] = None,
        enforce_private_link_service_network_policies: typing.Optional[builtins.bool] = None,
        service_endpoints: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["SubnetTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param resource_group_name: -
        :param virtual_network_name: -
        :param address_prefix: -
        :param address_prefixes: -
        :param delegation: delegation block.
        :param enforce_private_link_endpoint_network_policies: -
        :param enforce_private_link_service_network_policies: -
        :param service_endpoints: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SubnetConfig(
            name=name,
            resource_group_name=resource_group_name,
            virtual_network_name=virtual_network_name,
            address_prefix=address_prefix,
            address_prefixes=address_prefixes,
            delegation=delegation,
            enforce_private_link_endpoint_network_policies=enforce_private_link_endpoint_network_policies,
            enforce_private_link_service_network_policies=enforce_private_link_service_network_policies,
            service_endpoints=service_endpoints,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(Subnet, self, [scope, id, config])

    @jsii.member(jsii_name="resetAddressPrefix")
    def reset_address_prefix(self) -> None:
        return jsii.invoke(self, "resetAddressPrefix", [])

    @jsii.member(jsii_name="resetAddressPrefixes")
    def reset_address_prefixes(self) -> None:
        return jsii.invoke(self, "resetAddressPrefixes", [])

    @jsii.member(jsii_name="resetDelegation")
    def reset_delegation(self) -> None:
        return jsii.invoke(self, "resetDelegation", [])

    @jsii.member(jsii_name="resetEnforcePrivateLinkEndpointNetworkPolicies")
    def reset_enforce_private_link_endpoint_network_policies(self) -> None:
        return jsii.invoke(self, "resetEnforcePrivateLinkEndpointNetworkPolicies", [])

    @jsii.member(jsii_name="resetEnforcePrivateLinkServiceNetworkPolicies")
    def reset_enforce_private_link_service_network_policies(self) -> None:
        return jsii.invoke(self, "resetEnforcePrivateLinkServiceNetworkPolicies", [])

    @jsii.member(jsii_name="resetServiceEndpoints")
    def reset_service_endpoints(self) -> None:
        return jsii.invoke(self, "resetServiceEndpoints", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkNameInput")
    def virtual_network_name_input(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixesInput")
    def address_prefixes_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "addressPrefixesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixInput")
    def address_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "addressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="delegationInput")
    def delegation_input(self) -> typing.Optional[typing.List["SubnetDelegation"]]:
        return jsii.get(self, "delegationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcePrivateLinkEndpointNetworkPoliciesInput")
    def enforce_private_link_endpoint_network_policies_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enforcePrivateLinkEndpointNetworkPoliciesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcePrivateLinkServiceNetworkPoliciesInput")
    def enforce_private_link_service_network_policies_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enforcePrivateLinkServiceNetworkPoliciesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceEndpointsInput")
    def service_endpoints_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "serviceEndpointsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SubnetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefix")
    def address_prefix(self) -> builtins.str:
        return jsii.get(self, "addressPrefix")

    @address_prefix.setter # type: ignore
    def address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "addressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixes")
    def address_prefixes(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressPrefixes")

    @address_prefixes.setter # type: ignore
    def address_prefixes(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "addressPrefixes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="delegation")
    def delegation(self) -> typing.List["SubnetDelegation"]:
        return jsii.get(self, "delegation")

    @delegation.setter # type: ignore
    def delegation(self, value: typing.List["SubnetDelegation"]) -> None:
        jsii.set(self, "delegation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcePrivateLinkEndpointNetworkPolicies")
    def enforce_private_link_endpoint_network_policies(self) -> builtins.bool:
        return jsii.get(self, "enforcePrivateLinkEndpointNetworkPolicies")

    @enforce_private_link_endpoint_network_policies.setter # type: ignore
    def enforce_private_link_endpoint_network_policies(
        self,
        value: builtins.bool,
    ) -> None:
        jsii.set(self, "enforcePrivateLinkEndpointNetworkPolicies", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enforcePrivateLinkServiceNetworkPolicies")
    def enforce_private_link_service_network_policies(self) -> builtins.bool:
        return jsii.get(self, "enforcePrivateLinkServiceNetworkPolicies")

    @enforce_private_link_service_network_policies.setter # type: ignore
    def enforce_private_link_service_network_policies(
        self,
        value: builtins.bool,
    ) -> None:
        jsii.set(self, "enforcePrivateLinkServiceNetworkPolicies", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="serviceEndpoints")
    def service_endpoints(self) -> typing.List[builtins.str]:
        return jsii.get(self, "serviceEndpoints")

    @service_endpoints.setter # type: ignore
    def service_endpoints(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "serviceEndpoints", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SubnetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SubnetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkName")
    def virtual_network_name(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkName")

    @virtual_network_name.setter # type: ignore
    def virtual_network_name(self, value: builtins.str) -> None:
        jsii.set(self, "virtualNetworkName", value)


@jsii.data_type(
    jsii_type="azurerm.SubnetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "virtual_network_name": "virtualNetworkName",
        "address_prefix": "addressPrefix",
        "address_prefixes": "addressPrefixes",
        "delegation": "delegation",
        "enforce_private_link_endpoint_network_policies": "enforcePrivateLinkEndpointNetworkPolicies",
        "enforce_private_link_service_network_policies": "enforcePrivateLinkServiceNetworkPolicies",
        "service_endpoints": "serviceEndpoints",
        "timeouts": "timeouts",
    },
)
class SubnetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_name: builtins.str,
        address_prefix: typing.Optional[builtins.str] = None,
        address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        delegation: typing.Optional[typing.List["SubnetDelegation"]] = None,
        enforce_private_link_endpoint_network_policies: typing.Optional[builtins.bool] = None,
        enforce_private_link_service_network_policies: typing.Optional[builtins.bool] = None,
        service_endpoints: typing.Optional[typing.List[builtins.str]] = None,
        timeouts: typing.Optional["SubnetTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param resource_group_name: -
        :param virtual_network_name: -
        :param address_prefix: -
        :param address_prefixes: -
        :param delegation: delegation block.
        :param enforce_private_link_endpoint_network_policies: -
        :param enforce_private_link_service_network_policies: -
        :param service_endpoints: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SubnetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "resource_group_name": resource_group_name,
            "virtual_network_name": virtual_network_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if address_prefix is not None:
            self._values["address_prefix"] = address_prefix
        if address_prefixes is not None:
            self._values["address_prefixes"] = address_prefixes
        if delegation is not None:
            self._values["delegation"] = delegation
        if enforce_private_link_endpoint_network_policies is not None:
            self._values["enforce_private_link_endpoint_network_policies"] = enforce_private_link_endpoint_network_policies
        if enforce_private_link_service_network_policies is not None:
            self._values["enforce_private_link_service_network_policies"] = enforce_private_link_service_network_policies
        if service_endpoints is not None:
            self._values["service_endpoints"] = service_endpoints
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def virtual_network_name(self) -> builtins.str:
        result = self._values.get("virtual_network_name")
        assert result is not None, "Required property 'virtual_network_name' is missing"
        return result

    @builtins.property
    def address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("address_prefix")
        return result

    @builtins.property
    def address_prefixes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("address_prefixes")
        return result

    @builtins.property
    def delegation(self) -> typing.Optional[typing.List["SubnetDelegation"]]:
        """delegation block."""
        result = self._values.get("delegation")
        return result

    @builtins.property
    def enforce_private_link_endpoint_network_policies(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("enforce_private_link_endpoint_network_policies")
        return result

    @builtins.property
    def enforce_private_link_service_network_policies(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("enforce_private_link_service_network_policies")
        return result

    @builtins.property
    def service_endpoints(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("service_endpoints")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SubnetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SubnetDelegation",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "service_delegation": "serviceDelegation"},
)
class SubnetDelegation:
    def __init__(
        self,
        *,
        name: builtins.str,
        service_delegation: typing.List["SubnetDelegationServiceDelegation"],
    ) -> None:
        """
        :param name: -
        :param service_delegation: service_delegation block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "service_delegation": service_delegation,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def service_delegation(self) -> typing.List["SubnetDelegationServiceDelegation"]:
        """service_delegation block."""
        result = self._values.get("service_delegation")
        assert result is not None, "Required property 'service_delegation' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetDelegation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SubnetDelegationServiceDelegation",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "actions": "actions"},
)
class SubnetDelegationServiceDelegation:
    def __init__(
        self,
        *,
        name: builtins.str,
        actions: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param name: -
        :param actions: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if actions is not None:
            self._values["actions"] = actions

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def actions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("actions")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetDelegationServiceDelegation(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SubnetNatGatewayAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SubnetNatGatewayAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        nat_gateway_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["SubnetNatGatewayAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param nat_gateway_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SubnetNatGatewayAssociationConfig(
            nat_gateway_id=nat_gateway_id,
            subnet_id=subnet_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SubnetNatGatewayAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natGatewayIdInput")
    def nat_gateway_id_input(self) -> builtins.str:
        return jsii.get(self, "natGatewayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SubnetNatGatewayAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="natGatewayId")
    def nat_gateway_id(self) -> builtins.str:
        return jsii.get(self, "natGatewayId")

    @nat_gateway_id.setter # type: ignore
    def nat_gateway_id(self, value: builtins.str) -> None:
        jsii.set(self, "natGatewayId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SubnetNatGatewayAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SubnetNatGatewayAssociationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SubnetNatGatewayAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "nat_gateway_id": "natGatewayId",
        "subnet_id": "subnetId",
        "timeouts": "timeouts",
    },
)
class SubnetNatGatewayAssociationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        nat_gateway_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["SubnetNatGatewayAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param nat_gateway_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SubnetNatGatewayAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "nat_gateway_id": nat_gateway_id,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def nat_gateway_id(self) -> builtins.str:
        result = self._values.get("nat_gateway_id")
        assert result is not None, "Required property 'nat_gateway_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SubnetNatGatewayAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetNatGatewayAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SubnetNatGatewayAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SubnetNatGatewayAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetNatGatewayAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SubnetNetworkSecurityGroupAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SubnetNetworkSecurityGroupAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        network_security_group_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["SubnetNetworkSecurityGroupAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param network_security_group_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SubnetNetworkSecurityGroupAssociationConfig(
            network_security_group_id=network_security_group_id,
            subnet_id=subnet_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SubnetNetworkSecurityGroupAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupIdInput")
    def network_security_group_id_input(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SubnetNetworkSecurityGroupAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkSecurityGroupId")
    def network_security_group_id(self) -> builtins.str:
        return jsii.get(self, "networkSecurityGroupId")

    @network_security_group_id.setter # type: ignore
    def network_security_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "networkSecurityGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SubnetNetworkSecurityGroupAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SubnetNetworkSecurityGroupAssociationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SubnetNetworkSecurityGroupAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "network_security_group_id": "networkSecurityGroupId",
        "subnet_id": "subnetId",
        "timeouts": "timeouts",
    },
)
class SubnetNetworkSecurityGroupAssociationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        network_security_group_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["SubnetNetworkSecurityGroupAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param network_security_group_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SubnetNetworkSecurityGroupAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "network_security_group_id": network_security_group_id,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def network_security_group_id(self) -> builtins.str:
        result = self._values.get("network_security_group_id")
        assert result is not None, "Required property 'network_security_group_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["SubnetNetworkSecurityGroupAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetNetworkSecurityGroupAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SubnetNetworkSecurityGroupAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SubnetNetworkSecurityGroupAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetNetworkSecurityGroupAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SubnetRouteTableAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SubnetRouteTableAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        route_table_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["SubnetRouteTableAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param route_table_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SubnetRouteTableAssociationConfig(
            route_table_id=route_table_id,
            subnet_id=subnet_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SubnetRouteTableAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeTableIdInput")
    def route_table_id_input(self) -> builtins.str:
        return jsii.get(self, "routeTableIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SubnetRouteTableAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeTableId")
    def route_table_id(self) -> builtins.str:
        return jsii.get(self, "routeTableId")

    @route_table_id.setter # type: ignore
    def route_table_id(self, value: builtins.str) -> None:
        jsii.set(self, "routeTableId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SubnetRouteTableAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SubnetRouteTableAssociationTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SubnetRouteTableAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "route_table_id": "routeTableId",
        "subnet_id": "subnetId",
        "timeouts": "timeouts",
    },
)
class SubnetRouteTableAssociationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        route_table_id: builtins.str,
        subnet_id: builtins.str,
        timeouts: typing.Optional["SubnetRouteTableAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param route_table_id: -
        :param subnet_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SubnetRouteTableAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "route_table_id": route_table_id,
            "subnet_id": subnet_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def route_table_id(self) -> builtins.str:
        result = self._values.get("route_table_id")
        assert result is not None, "Required property 'route_table_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SubnetRouteTableAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetRouteTableAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SubnetRouteTableAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SubnetRouteTableAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetRouteTableAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SubnetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SubnetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubnetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SubscriptionTemplateDeployment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SubscriptionTemplateDeployment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        template_content: builtins.str,
        debug_level: typing.Optional[builtins.str] = None,
        parameters_content: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SubscriptionTemplateDeploymentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param template_content: -
        :param debug_level: -
        :param parameters_content: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SubscriptionTemplateDeploymentConfig(
            location=location,
            name=name,
            template_content=template_content,
            debug_level=debug_level,
            parameters_content=parameters_content,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SubscriptionTemplateDeployment, self, [scope, id, config])

    @jsii.member(jsii_name="resetDebugLevel")
    def reset_debug_level(self) -> None:
        return jsii.invoke(self, "resetDebugLevel", [])

    @jsii.member(jsii_name="resetParametersContent")
    def reset_parameters_content(self) -> None:
        return jsii.invoke(self, "resetParametersContent", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="outputContent")
    def output_content(self) -> builtins.str:
        return jsii.get(self, "outputContent")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateContentInput")
    def template_content_input(self) -> builtins.str:
        return jsii.get(self, "templateContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="debugLevelInput")
    def debug_level_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "debugLevelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersContentInput")
    def parameters_content_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parametersContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["SubscriptionTemplateDeploymentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="debugLevel")
    def debug_level(self) -> builtins.str:
        return jsii.get(self, "debugLevel")

    @debug_level.setter # type: ignore
    def debug_level(self, value: builtins.str) -> None:
        jsii.set(self, "debugLevel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersContent")
    def parameters_content(self) -> builtins.str:
        return jsii.get(self, "parametersContent")

    @parameters_content.setter # type: ignore
    def parameters_content(self, value: builtins.str) -> None:
        jsii.set(self, "parametersContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateContent")
    def template_content(self) -> builtins.str:
        return jsii.get(self, "templateContent")

    @template_content.setter # type: ignore
    def template_content(self, value: builtins.str) -> None:
        jsii.set(self, "templateContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SubscriptionTemplateDeploymentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SubscriptionTemplateDeploymentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SubscriptionTemplateDeploymentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "template_content": "templateContent",
        "debug_level": "debugLevel",
        "parameters_content": "parametersContent",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SubscriptionTemplateDeploymentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        template_content: builtins.str,
        debug_level: typing.Optional[builtins.str] = None,
        parameters_content: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SubscriptionTemplateDeploymentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param template_content: -
        :param debug_level: -
        :param parameters_content: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SubscriptionTemplateDeploymentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "template_content": template_content,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if debug_level is not None:
            self._values["debug_level"] = debug_level
        if parameters_content is not None:
            self._values["parameters_content"] = parameters_content
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def template_content(self) -> builtins.str:
        result = self._values.get("template_content")
        assert result is not None, "Required property 'template_content' is missing"
        return result

    @builtins.property
    def debug_level(self) -> typing.Optional[builtins.str]:
        result = self._values.get("debug_level")
        return result

    @builtins.property
    def parameters_content(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters_content")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SubscriptionTemplateDeploymentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubscriptionTemplateDeploymentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SubscriptionTemplateDeploymentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SubscriptionTemplateDeploymentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SubscriptionTemplateDeploymentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SynapseFirewallRule(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SynapseFirewallRule",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        end_ip_address: builtins.str,
        name: builtins.str,
        start_ip_address: builtins.str,
        synapse_workspace_id: builtins.str,
        timeouts: typing.Optional["SynapseFirewallRuleTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param end_ip_address: -
        :param name: -
        :param start_ip_address: -
        :param synapse_workspace_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SynapseFirewallRuleConfig(
            end_ip_address=end_ip_address,
            name=name,
            start_ip_address=start_ip_address,
            synapse_workspace_id=synapse_workspace_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SynapseFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddressInput")
    def end_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "endIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddressInput")
    def start_ip_address_input(self) -> builtins.str:
        return jsii.get(self, "startIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceIdInput")
    def synapse_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SynapseFirewallRuleTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endIpAddress")
    def end_ip_address(self) -> builtins.str:
        return jsii.get(self, "endIpAddress")

    @end_ip_address.setter # type: ignore
    def end_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "endIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="startIpAddress")
    def start_ip_address(self) -> builtins.str:
        return jsii.get(self, "startIpAddress")

    @start_ip_address.setter # type: ignore
    def start_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "startIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceId")
    def synapse_workspace_id(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceId")

    @synapse_workspace_id.setter # type: ignore
    def synapse_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "synapseWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SynapseFirewallRuleTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SynapseFirewallRuleTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SynapseFirewallRuleConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "end_ip_address": "endIpAddress",
        "name": "name",
        "start_ip_address": "startIpAddress",
        "synapse_workspace_id": "synapseWorkspaceId",
        "timeouts": "timeouts",
    },
)
class SynapseFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        end_ip_address: builtins.str,
        name: builtins.str,
        start_ip_address: builtins.str,
        synapse_workspace_id: builtins.str,
        timeouts: typing.Optional["SynapseFirewallRuleTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param end_ip_address: -
        :param name: -
        :param start_ip_address: -
        :param synapse_workspace_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SynapseFirewallRuleTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "end_ip_address": end_ip_address,
            "name": name,
            "start_ip_address": start_ip_address,
            "synapse_workspace_id": synapse_workspace_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def end_ip_address(self) -> builtins.str:
        result = self._values.get("end_ip_address")
        assert result is not None, "Required property 'end_ip_address' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def start_ip_address(self) -> builtins.str:
        result = self._values.get("start_ip_address")
        assert result is not None, "Required property 'start_ip_address' is missing"
        return result

    @builtins.property
    def synapse_workspace_id(self) -> builtins.str:
        result = self._values.get("synapse_workspace_id")
        assert result is not None, "Required property 'synapse_workspace_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SynapseFirewallRuleTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseFirewallRuleConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseFirewallRuleTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SynapseFirewallRuleTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseFirewallRuleTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SynapseRoleAssignment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SynapseRoleAssignment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        principal_id: builtins.str,
        role_name: builtins.str,
        synapse_workspace_id: builtins.str,
        timeouts: typing.Optional["SynapseRoleAssignmentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param principal_id: -
        :param role_name: -
        :param synapse_workspace_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SynapseRoleAssignmentConfig(
            principal_id=principal_id,
            role_name=role_name,
            synapse_workspace_id=synapse_workspace_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SynapseRoleAssignment, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalIdInput")
    def principal_id_input(self) -> builtins.str:
        return jsii.get(self, "principalIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleNameInput")
    def role_name_input(self) -> builtins.str:
        return jsii.get(self, "roleNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceIdInput")
    def synapse_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SynapseRoleAssignmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @principal_id.setter # type: ignore
    def principal_id(self, value: builtins.str) -> None:
        jsii.set(self, "principalId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="roleName")
    def role_name(self) -> builtins.str:
        return jsii.get(self, "roleName")

    @role_name.setter # type: ignore
    def role_name(self, value: builtins.str) -> None:
        jsii.set(self, "roleName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceId")
    def synapse_workspace_id(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceId")

    @synapse_workspace_id.setter # type: ignore
    def synapse_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "synapseWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SynapseRoleAssignmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SynapseRoleAssignmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SynapseRoleAssignmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "principal_id": "principalId",
        "role_name": "roleName",
        "synapse_workspace_id": "synapseWorkspaceId",
        "timeouts": "timeouts",
    },
)
class SynapseRoleAssignmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        principal_id: builtins.str,
        role_name: builtins.str,
        synapse_workspace_id: builtins.str,
        timeouts: typing.Optional["SynapseRoleAssignmentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param principal_id: -
        :param role_name: -
        :param synapse_workspace_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SynapseRoleAssignmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "principal_id": principal_id,
            "role_name": role_name,
            "synapse_workspace_id": synapse_workspace_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def principal_id(self) -> builtins.str:
        result = self._values.get("principal_id")
        assert result is not None, "Required property 'principal_id' is missing"
        return result

    @builtins.property
    def role_name(self) -> builtins.str:
        result = self._values.get("role_name")
        assert result is not None, "Required property 'role_name' is missing"
        return result

    @builtins.property
    def synapse_workspace_id(self) -> builtins.str:
        result = self._values.get("synapse_workspace_id")
        assert result is not None, "Required property 'synapse_workspace_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SynapseRoleAssignmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseRoleAssignmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseRoleAssignmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class SynapseRoleAssignmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseRoleAssignmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SynapseSparkPool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SynapseSparkPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        node_size: builtins.str,
        node_size_family: builtins.str,
        synapse_workspace_id: builtins.str,
        auto_pause: typing.Optional[typing.List["SynapseSparkPoolAutoPause"]] = None,
        auto_scale: typing.Optional[typing.List["SynapseSparkPoolAutoScale"]] = None,
        library_requirement: typing.Optional[typing.List["SynapseSparkPoolLibraryRequirement"]] = None,
        node_count: typing.Optional[jsii.Number] = None,
        spark_events_folder: typing.Optional[builtins.str] = None,
        spark_log_folder: typing.Optional[builtins.str] = None,
        spark_version: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SynapseSparkPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param node_size: -
        :param node_size_family: -
        :param synapse_workspace_id: -
        :param auto_pause: auto_pause block.
        :param auto_scale: auto_scale block.
        :param library_requirement: library_requirement block.
        :param node_count: -
        :param spark_events_folder: -
        :param spark_log_folder: -
        :param spark_version: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SynapseSparkPoolConfig(
            name=name,
            node_size=node_size,
            node_size_family=node_size_family,
            synapse_workspace_id=synapse_workspace_id,
            auto_pause=auto_pause,
            auto_scale=auto_scale,
            library_requirement=library_requirement,
            node_count=node_count,
            spark_events_folder=spark_events_folder,
            spark_log_folder=spark_log_folder,
            spark_version=spark_version,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SynapseSparkPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoPause")
    def reset_auto_pause(self) -> None:
        return jsii.invoke(self, "resetAutoPause", [])

    @jsii.member(jsii_name="resetAutoScale")
    def reset_auto_scale(self) -> None:
        return jsii.invoke(self, "resetAutoScale", [])

    @jsii.member(jsii_name="resetLibraryRequirement")
    def reset_library_requirement(self) -> None:
        return jsii.invoke(self, "resetLibraryRequirement", [])

    @jsii.member(jsii_name="resetNodeCount")
    def reset_node_count(self) -> None:
        return jsii.invoke(self, "resetNodeCount", [])

    @jsii.member(jsii_name="resetSparkEventsFolder")
    def reset_spark_events_folder(self) -> None:
        return jsii.invoke(self, "resetSparkEventsFolder", [])

    @jsii.member(jsii_name="resetSparkLogFolder")
    def reset_spark_log_folder(self) -> None:
        return jsii.invoke(self, "resetSparkLogFolder", [])

    @jsii.member(jsii_name="resetSparkVersion")
    def reset_spark_version(self) -> None:
        return jsii.invoke(self, "resetSparkVersion", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeSizeFamilyInput")
    def node_size_family_input(self) -> builtins.str:
        return jsii.get(self, "nodeSizeFamilyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeSizeInput")
    def node_size_input(self) -> builtins.str:
        return jsii.get(self, "nodeSizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceIdInput")
    def synapse_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoPauseInput")
    def auto_pause_input(
        self,
    ) -> typing.Optional[typing.List["SynapseSparkPoolAutoPause"]]:
        return jsii.get(self, "autoPauseInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoScaleInput")
    def auto_scale_input(
        self,
    ) -> typing.Optional[typing.List["SynapseSparkPoolAutoScale"]]:
        return jsii.get(self, "autoScaleInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="libraryRequirementInput")
    def library_requirement_input(
        self,
    ) -> typing.Optional[typing.List["SynapseSparkPoolLibraryRequirement"]]:
        return jsii.get(self, "libraryRequirementInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeCountInput")
    def node_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "nodeCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sparkEventsFolderInput")
    def spark_events_folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sparkEventsFolderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sparkLogFolderInput")
    def spark_log_folder_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sparkLogFolderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sparkVersionInput")
    def spark_version_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sparkVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SynapseSparkPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoPause")
    def auto_pause(self) -> typing.List["SynapseSparkPoolAutoPause"]:
        return jsii.get(self, "autoPause")

    @auto_pause.setter # type: ignore
    def auto_pause(self, value: typing.List["SynapseSparkPoolAutoPause"]) -> None:
        jsii.set(self, "autoPause", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoScale")
    def auto_scale(self) -> typing.List["SynapseSparkPoolAutoScale"]:
        return jsii.get(self, "autoScale")

    @auto_scale.setter # type: ignore
    def auto_scale(self, value: typing.List["SynapseSparkPoolAutoScale"]) -> None:
        jsii.set(self, "autoScale", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="libraryRequirement")
    def library_requirement(self) -> typing.List["SynapseSparkPoolLibraryRequirement"]:
        return jsii.get(self, "libraryRequirement")

    @library_requirement.setter # type: ignore
    def library_requirement(
        self,
        value: typing.List["SynapseSparkPoolLibraryRequirement"],
    ) -> None:
        jsii.set(self, "libraryRequirement", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeCount")
    def node_count(self) -> jsii.Number:
        return jsii.get(self, "nodeCount")

    @node_count.setter # type: ignore
    def node_count(self, value: jsii.Number) -> None:
        jsii.set(self, "nodeCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeSize")
    def node_size(self) -> builtins.str:
        return jsii.get(self, "nodeSize")

    @node_size.setter # type: ignore
    def node_size(self, value: builtins.str) -> None:
        jsii.set(self, "nodeSize", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nodeSizeFamily")
    def node_size_family(self) -> builtins.str:
        return jsii.get(self, "nodeSizeFamily")

    @node_size_family.setter # type: ignore
    def node_size_family(self, value: builtins.str) -> None:
        jsii.set(self, "nodeSizeFamily", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sparkEventsFolder")
    def spark_events_folder(self) -> builtins.str:
        return jsii.get(self, "sparkEventsFolder")

    @spark_events_folder.setter # type: ignore
    def spark_events_folder(self, value: builtins.str) -> None:
        jsii.set(self, "sparkEventsFolder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sparkLogFolder")
    def spark_log_folder(self) -> builtins.str:
        return jsii.get(self, "sparkLogFolder")

    @spark_log_folder.setter # type: ignore
    def spark_log_folder(self, value: builtins.str) -> None:
        jsii.set(self, "sparkLogFolder", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sparkVersion")
    def spark_version(self) -> builtins.str:
        return jsii.get(self, "sparkVersion")

    @spark_version.setter # type: ignore
    def spark_version(self, value: builtins.str) -> None:
        jsii.set(self, "sparkVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceId")
    def synapse_workspace_id(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceId")

    @synapse_workspace_id.setter # type: ignore
    def synapse_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "synapseWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SynapseSparkPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SynapseSparkPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SynapseSparkPoolAutoPause",
    jsii_struct_bases=[],
    name_mapping={"delay_in_minutes": "delayInMinutes"},
)
class SynapseSparkPoolAutoPause:
    def __init__(self, *, delay_in_minutes: jsii.Number) -> None:
        """
        :param delay_in_minutes: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "delay_in_minutes": delay_in_minutes,
        }

    @builtins.property
    def delay_in_minutes(self) -> jsii.Number:
        result = self._values.get("delay_in_minutes")
        assert result is not None, "Required property 'delay_in_minutes' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSparkPoolAutoPause(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseSparkPoolAutoScale",
    jsii_struct_bases=[],
    name_mapping={"max_node_count": "maxNodeCount", "min_node_count": "minNodeCount"},
)
class SynapseSparkPoolAutoScale:
    def __init__(
        self,
        *,
        max_node_count: jsii.Number,
        min_node_count: jsii.Number,
    ) -> None:
        """
        :param max_node_count: -
        :param min_node_count: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "max_node_count": max_node_count,
            "min_node_count": min_node_count,
        }

    @builtins.property
    def max_node_count(self) -> jsii.Number:
        result = self._values.get("max_node_count")
        assert result is not None, "Required property 'max_node_count' is missing"
        return result

    @builtins.property
    def min_node_count(self) -> jsii.Number:
        result = self._values.get("min_node_count")
        assert result is not None, "Required property 'min_node_count' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSparkPoolAutoScale(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseSparkPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "node_size": "nodeSize",
        "node_size_family": "nodeSizeFamily",
        "synapse_workspace_id": "synapseWorkspaceId",
        "auto_pause": "autoPause",
        "auto_scale": "autoScale",
        "library_requirement": "libraryRequirement",
        "node_count": "nodeCount",
        "spark_events_folder": "sparkEventsFolder",
        "spark_log_folder": "sparkLogFolder",
        "spark_version": "sparkVersion",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SynapseSparkPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        node_size: builtins.str,
        node_size_family: builtins.str,
        synapse_workspace_id: builtins.str,
        auto_pause: typing.Optional[typing.List[SynapseSparkPoolAutoPause]] = None,
        auto_scale: typing.Optional[typing.List[SynapseSparkPoolAutoScale]] = None,
        library_requirement: typing.Optional[typing.List["SynapseSparkPoolLibraryRequirement"]] = None,
        node_count: typing.Optional[jsii.Number] = None,
        spark_events_folder: typing.Optional[builtins.str] = None,
        spark_log_folder: typing.Optional[builtins.str] = None,
        spark_version: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SynapseSparkPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param node_size: -
        :param node_size_family: -
        :param synapse_workspace_id: -
        :param auto_pause: auto_pause block.
        :param auto_scale: auto_scale block.
        :param library_requirement: library_requirement block.
        :param node_count: -
        :param spark_events_folder: -
        :param spark_log_folder: -
        :param spark_version: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SynapseSparkPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "node_size": node_size,
            "node_size_family": node_size_family,
            "synapse_workspace_id": synapse_workspace_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_pause is not None:
            self._values["auto_pause"] = auto_pause
        if auto_scale is not None:
            self._values["auto_scale"] = auto_scale
        if library_requirement is not None:
            self._values["library_requirement"] = library_requirement
        if node_count is not None:
            self._values["node_count"] = node_count
        if spark_events_folder is not None:
            self._values["spark_events_folder"] = spark_events_folder
        if spark_log_folder is not None:
            self._values["spark_log_folder"] = spark_log_folder
        if spark_version is not None:
            self._values["spark_version"] = spark_version
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def node_size(self) -> builtins.str:
        result = self._values.get("node_size")
        assert result is not None, "Required property 'node_size' is missing"
        return result

    @builtins.property
    def node_size_family(self) -> builtins.str:
        result = self._values.get("node_size_family")
        assert result is not None, "Required property 'node_size_family' is missing"
        return result

    @builtins.property
    def synapse_workspace_id(self) -> builtins.str:
        result = self._values.get("synapse_workspace_id")
        assert result is not None, "Required property 'synapse_workspace_id' is missing"
        return result

    @builtins.property
    def auto_pause(self) -> typing.Optional[typing.List[SynapseSparkPoolAutoPause]]:
        """auto_pause block."""
        result = self._values.get("auto_pause")
        return result

    @builtins.property
    def auto_scale(self) -> typing.Optional[typing.List[SynapseSparkPoolAutoScale]]:
        """auto_scale block."""
        result = self._values.get("auto_scale")
        return result

    @builtins.property
    def library_requirement(
        self,
    ) -> typing.Optional[typing.List["SynapseSparkPoolLibraryRequirement"]]:
        """library_requirement block."""
        result = self._values.get("library_requirement")
        return result

    @builtins.property
    def node_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("node_count")
        return result

    @builtins.property
    def spark_events_folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("spark_events_folder")
        return result

    @builtins.property
    def spark_log_folder(self) -> typing.Optional[builtins.str]:
        result = self._values.get("spark_log_folder")
        return result

    @builtins.property
    def spark_version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("spark_version")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SynapseSparkPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSparkPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseSparkPoolLibraryRequirement",
    jsii_struct_bases=[],
    name_mapping={"content": "content", "filename": "filename"},
)
class SynapseSparkPoolLibraryRequirement:
    def __init__(self, *, content: builtins.str, filename: builtins.str) -> None:
        """
        :param content: -
        :param filename: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "content": content,
            "filename": filename,
        }

    @builtins.property
    def content(self) -> builtins.str:
        result = self._values.get("content")
        assert result is not None, "Required property 'content' is missing"
        return result

    @builtins.property
    def filename(self) -> builtins.str:
        result = self._values.get("filename")
        assert result is not None, "Required property 'filename' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSparkPoolLibraryRequirement(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseSparkPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SynapseSparkPoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSparkPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SynapseSqlPool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SynapseSqlPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        sku_name: builtins.str,
        synapse_workspace_id: builtins.str,
        collation: typing.Optional[builtins.str] = None,
        create_mode: typing.Optional[builtins.str] = None,
        data_encrypted: typing.Optional[builtins.bool] = None,
        recovery_database_id: typing.Optional[builtins.str] = None,
        restore: typing.Optional[typing.List["SynapseSqlPoolRestore"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SynapseSqlPoolTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param sku_name: -
        :param synapse_workspace_id: -
        :param collation: -
        :param create_mode: -
        :param data_encrypted: -
        :param recovery_database_id: -
        :param restore: restore block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SynapseSqlPoolConfig(
            name=name,
            sku_name=sku_name,
            synapse_workspace_id=synapse_workspace_id,
            collation=collation,
            create_mode=create_mode,
            data_encrypted=data_encrypted,
            recovery_database_id=recovery_database_id,
            restore=restore,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SynapseSqlPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetCollation")
    def reset_collation(self) -> None:
        return jsii.invoke(self, "resetCollation", [])

    @jsii.member(jsii_name="resetCreateMode")
    def reset_create_mode(self) -> None:
        return jsii.invoke(self, "resetCreateMode", [])

    @jsii.member(jsii_name="resetDataEncrypted")
    def reset_data_encrypted(self) -> None:
        return jsii.invoke(self, "resetDataEncrypted", [])

    @jsii.member(jsii_name="resetRecoveryDatabaseId")
    def reset_recovery_database_id(self) -> None:
        return jsii.invoke(self, "resetRecoveryDatabaseId", [])

    @jsii.member(jsii_name="resetRestore")
    def reset_restore(self) -> None:
        return jsii.invoke(self, "resetRestore", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuNameInput")
    def sku_name_input(self) -> builtins.str:
        return jsii.get(self, "skuNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceIdInput")
    def synapse_workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collationInput")
    def collation_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "collationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createModeInput")
    def create_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataEncryptedInput")
    def data_encrypted_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "dataEncryptedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryDatabaseIdInput")
    def recovery_database_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "recoveryDatabaseIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restoreInput")
    def restore_input(self) -> typing.Optional[typing.List["SynapseSqlPoolRestore"]]:
        return jsii.get(self, "restoreInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SynapseSqlPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="collation")
    def collation(self) -> builtins.str:
        return jsii.get(self, "collation")

    @collation.setter # type: ignore
    def collation(self, value: builtins.str) -> None:
        jsii.set(self, "collation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createMode")
    def create_mode(self) -> builtins.str:
        return jsii.get(self, "createMode")

    @create_mode.setter # type: ignore
    def create_mode(self, value: builtins.str) -> None:
        jsii.set(self, "createMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataEncrypted")
    def data_encrypted(self) -> builtins.bool:
        return jsii.get(self, "dataEncrypted")

    @data_encrypted.setter # type: ignore
    def data_encrypted(self, value: builtins.bool) -> None:
        jsii.set(self, "dataEncrypted", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="recoveryDatabaseId")
    def recovery_database_id(self) -> builtins.str:
        return jsii.get(self, "recoveryDatabaseId")

    @recovery_database_id.setter # type: ignore
    def recovery_database_id(self, value: builtins.str) -> None:
        jsii.set(self, "recoveryDatabaseId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="restore")
    def restore(self) -> typing.List["SynapseSqlPoolRestore"]:
        return jsii.get(self, "restore")

    @restore.setter # type: ignore
    def restore(self, value: typing.List["SynapseSqlPoolRestore"]) -> None:
        jsii.set(self, "restore", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuName")
    def sku_name(self) -> builtins.str:
        return jsii.get(self, "skuName")

    @sku_name.setter # type: ignore
    def sku_name(self, value: builtins.str) -> None:
        jsii.set(self, "skuName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="synapseWorkspaceId")
    def synapse_workspace_id(self) -> builtins.str:
        return jsii.get(self, "synapseWorkspaceId")

    @synapse_workspace_id.setter # type: ignore
    def synapse_workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "synapseWorkspaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SynapseSqlPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SynapseSqlPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SynapseSqlPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "sku_name": "skuName",
        "synapse_workspace_id": "synapseWorkspaceId",
        "collation": "collation",
        "create_mode": "createMode",
        "data_encrypted": "dataEncrypted",
        "recovery_database_id": "recoveryDatabaseId",
        "restore": "restore",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SynapseSqlPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        sku_name: builtins.str,
        synapse_workspace_id: builtins.str,
        collation: typing.Optional[builtins.str] = None,
        create_mode: typing.Optional[builtins.str] = None,
        data_encrypted: typing.Optional[builtins.bool] = None,
        recovery_database_id: typing.Optional[builtins.str] = None,
        restore: typing.Optional[typing.List["SynapseSqlPoolRestore"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SynapseSqlPoolTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param sku_name: -
        :param synapse_workspace_id: -
        :param collation: -
        :param create_mode: -
        :param data_encrypted: -
        :param recovery_database_id: -
        :param restore: restore block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SynapseSqlPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "sku_name": sku_name,
            "synapse_workspace_id": synapse_workspace_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if collation is not None:
            self._values["collation"] = collation
        if create_mode is not None:
            self._values["create_mode"] = create_mode
        if data_encrypted is not None:
            self._values["data_encrypted"] = data_encrypted
        if recovery_database_id is not None:
            self._values["recovery_database_id"] = recovery_database_id
        if restore is not None:
            self._values["restore"] = restore
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def sku_name(self) -> builtins.str:
        result = self._values.get("sku_name")
        assert result is not None, "Required property 'sku_name' is missing"
        return result

    @builtins.property
    def synapse_workspace_id(self) -> builtins.str:
        result = self._values.get("synapse_workspace_id")
        assert result is not None, "Required property 'synapse_workspace_id' is missing"
        return result

    @builtins.property
    def collation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("collation")
        return result

    @builtins.property
    def create_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_mode")
        return result

    @builtins.property
    def data_encrypted(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("data_encrypted")
        return result

    @builtins.property
    def recovery_database_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("recovery_database_id")
        return result

    @builtins.property
    def restore(self) -> typing.Optional[typing.List["SynapseSqlPoolRestore"]]:
        """restore block."""
        result = self._values.get("restore")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SynapseSqlPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSqlPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseSqlPoolRestore",
    jsii_struct_bases=[],
    name_mapping={
        "point_in_time": "pointInTime",
        "source_database_id": "sourceDatabaseId",
    },
)
class SynapseSqlPoolRestore:
    def __init__(
        self,
        *,
        point_in_time: builtins.str,
        source_database_id: builtins.str,
    ) -> None:
        """
        :param point_in_time: -
        :param source_database_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "point_in_time": point_in_time,
            "source_database_id": source_database_id,
        }

    @builtins.property
    def point_in_time(self) -> builtins.str:
        result = self._values.get("point_in_time")
        assert result is not None, "Required property 'point_in_time' is missing"
        return result

    @builtins.property
    def source_database_id(self) -> builtins.str:
        result = self._values.get("source_database_id")
        assert result is not None, "Required property 'source_database_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSqlPoolRestore(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseSqlPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SynapseSqlPoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseSqlPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SynapseWorkspace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SynapseWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sql_administrator_login: builtins.str,
        sql_administrator_login_password: builtins.str,
        storage_data_lake_gen2_filesystem_id: builtins.str,
        aad_admin: typing.Optional[typing.List["SynapseWorkspaceAadAdmin"]] = None,
        managed_virtual_network_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SynapseWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sql_administrator_login: -
        :param sql_administrator_login_password: -
        :param storage_data_lake_gen2_filesystem_id: -
        :param aad_admin: -
        :param managed_virtual_network_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SynapseWorkspaceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sql_administrator_login=sql_administrator_login,
            sql_administrator_login_password=sql_administrator_login_password,
            storage_data_lake_gen2_filesystem_id=storage_data_lake_gen2_filesystem_id,
            aad_admin=aad_admin,
            managed_virtual_network_enabled=managed_virtual_network_enabled,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(SynapseWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="connectivityEndpoints")
    def connectivity_endpoints(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "connectivityEndpoints", [key])

    @jsii.member(jsii_name="identity")
    def identity(self, index: builtins.str) -> "SynapseWorkspaceIdentity":
        """
        :param index: -
        """
        return jsii.invoke(self, "identity", [index])

    @jsii.member(jsii_name="resetAadAdmin")
    def reset_aad_admin(self) -> None:
        return jsii.invoke(self, "resetAadAdmin", [])

    @jsii.member(jsii_name="resetManagedVirtualNetworkEnabled")
    def reset_managed_virtual_network_enabled(self) -> None:
        return jsii.invoke(self, "resetManagedVirtualNetworkEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedResourceGroupName")
    def managed_resource_group_name(self) -> builtins.str:
        return jsii.get(self, "managedResourceGroupName")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlAdministratorLoginInput")
    def sql_administrator_login_input(self) -> builtins.str:
        return jsii.get(self, "sqlAdministratorLoginInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlAdministratorLoginPasswordInput")
    def sql_administrator_login_password_input(self) -> builtins.str:
        return jsii.get(self, "sqlAdministratorLoginPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageDataLakeGen2FilesystemIdInput")
    def storage_data_lake_gen2_filesystem_id_input(self) -> builtins.str:
        return jsii.get(self, "storageDataLakeGen2FilesystemIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aadAdminInput")
    def aad_admin_input(
        self,
    ) -> typing.Optional[typing.List["SynapseWorkspaceAadAdmin"]]:
        return jsii.get(self, "aadAdminInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedVirtualNetworkEnabledInput")
    def managed_virtual_network_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "managedVirtualNetworkEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["SynapseWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="aadAdmin")
    def aad_admin(self) -> typing.List["SynapseWorkspaceAadAdmin"]:
        return jsii.get(self, "aadAdmin")

    @aad_admin.setter # type: ignore
    def aad_admin(self, value: typing.List["SynapseWorkspaceAadAdmin"]) -> None:
        jsii.set(self, "aadAdmin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedVirtualNetworkEnabled")
    def managed_virtual_network_enabled(self) -> builtins.bool:
        return jsii.get(self, "managedVirtualNetworkEnabled")

    @managed_virtual_network_enabled.setter # type: ignore
    def managed_virtual_network_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "managedVirtualNetworkEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlAdministratorLogin")
    def sql_administrator_login(self) -> builtins.str:
        return jsii.get(self, "sqlAdministratorLogin")

    @sql_administrator_login.setter # type: ignore
    def sql_administrator_login(self, value: builtins.str) -> None:
        jsii.set(self, "sqlAdministratorLogin", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sqlAdministratorLoginPassword")
    def sql_administrator_login_password(self) -> builtins.str:
        return jsii.get(self, "sqlAdministratorLoginPassword")

    @sql_administrator_login_password.setter # type: ignore
    def sql_administrator_login_password(self, value: builtins.str) -> None:
        jsii.set(self, "sqlAdministratorLoginPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageDataLakeGen2FilesystemId")
    def storage_data_lake_gen2_filesystem_id(self) -> builtins.str:
        return jsii.get(self, "storageDataLakeGen2FilesystemId")

    @storage_data_lake_gen2_filesystem_id.setter # type: ignore
    def storage_data_lake_gen2_filesystem_id(self, value: builtins.str) -> None:
        jsii.set(self, "storageDataLakeGen2FilesystemId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "SynapseWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "SynapseWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.SynapseWorkspaceAadAdmin",
    jsii_struct_bases=[],
    name_mapping={"login": "login", "object_id": "objectId", "tenant_id": "tenantId"},
)
class SynapseWorkspaceAadAdmin:
    def __init__(
        self,
        *,
        login: typing.Optional[builtins.str] = None,
        object_id: typing.Optional[builtins.str] = None,
        tenant_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param login: -
        :param object_id: -
        :param tenant_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if login is not None:
            self._values["login"] = login
        if object_id is not None:
            self._values["object_id"] = object_id
        if tenant_id is not None:
            self._values["tenant_id"] = tenant_id

    @builtins.property
    def login(self) -> typing.Optional[builtins.str]:
        result = self._values.get("login")
        return result

    @builtins.property
    def object_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("object_id")
        return result

    @builtins.property
    def tenant_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tenant_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseWorkspaceAadAdmin(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.SynapseWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sql_administrator_login": "sqlAdministratorLogin",
        "sql_administrator_login_password": "sqlAdministratorLoginPassword",
        "storage_data_lake_gen2_filesystem_id": "storageDataLakeGen2FilesystemId",
        "aad_admin": "aadAdmin",
        "managed_virtual_network_enabled": "managedVirtualNetworkEnabled",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class SynapseWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sql_administrator_login: builtins.str,
        sql_administrator_login_password: builtins.str,
        storage_data_lake_gen2_filesystem_id: builtins.str,
        aad_admin: typing.Optional[typing.List[SynapseWorkspaceAadAdmin]] = None,
        managed_virtual_network_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["SynapseWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sql_administrator_login: -
        :param sql_administrator_login_password: -
        :param storage_data_lake_gen2_filesystem_id: -
        :param aad_admin: -
        :param managed_virtual_network_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = SynapseWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sql_administrator_login": sql_administrator_login,
            "sql_administrator_login_password": sql_administrator_login_password,
            "storage_data_lake_gen2_filesystem_id": storage_data_lake_gen2_filesystem_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if aad_admin is not None:
            self._values["aad_admin"] = aad_admin
        if managed_virtual_network_enabled is not None:
            self._values["managed_virtual_network_enabled"] = managed_virtual_network_enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sql_administrator_login(self) -> builtins.str:
        result = self._values.get("sql_administrator_login")
        assert result is not None, "Required property 'sql_administrator_login' is missing"
        return result

    @builtins.property
    def sql_administrator_login_password(self) -> builtins.str:
        result = self._values.get("sql_administrator_login_password")
        assert result is not None, "Required property 'sql_administrator_login_password' is missing"
        return result

    @builtins.property
    def storage_data_lake_gen2_filesystem_id(self) -> builtins.str:
        result = self._values.get("storage_data_lake_gen2_filesystem_id")
        assert result is not None, "Required property 'storage_data_lake_gen2_filesystem_id' is missing"
        return result

    @builtins.property
    def aad_admin(self) -> typing.Optional[typing.List[SynapseWorkspaceAadAdmin]]:
        result = self._values.get("aad_admin")
        return result

    @builtins.property
    def managed_virtual_network_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("managed_virtual_network_enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["SynapseWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class SynapseWorkspaceIdentity(
    cdktf.ComplexComputedList,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.SynapseWorkspaceIdentity",
):
    def __init__(
        self,
        terraform_resource: cdktf.ITerraformResource,
        terraform_attribute: builtins.str,
        index: builtins.str,
    ) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        :stability: experimental
        """
        jsii.create(SynapseWorkspaceIdentity, self, [terraform_resource, terraform_attribute, index])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tenantId")
    def tenant_id(self) -> builtins.str:
        return jsii.get(self, "tenantId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")


@jsii.data_type(
    jsii_type="azurerm.SynapseWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class SynapseWorkspaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "SynapseWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class TemplateDeployment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.TemplateDeployment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        deployment_mode: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        parameters_body: typing.Optional[builtins.str] = None,
        template_body: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["TemplateDeploymentTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param deployment_mode: -
        :param name: -
        :param resource_group_name: -
        :param parameters: -
        :param parameters_body: -
        :param template_body: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = TemplateDeploymentConfig(
            deployment_mode=deployment_mode,
            name=name,
            resource_group_name=resource_group_name,
            parameters=parameters,
            parameters_body=parameters_body,
            template_body=template_body,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(TemplateDeployment, self, [scope, id, config])

    @jsii.member(jsii_name="outputs")
    def outputs(self, key: builtins.str) -> builtins.str:
        """
        :param key: -
        """
        return jsii.invoke(self, "outputs", [key])

    @jsii.member(jsii_name="resetParameters")
    def reset_parameters(self) -> None:
        return jsii.invoke(self, "resetParameters", [])

    @jsii.member(jsii_name="resetParametersBody")
    def reset_parameters_body(self) -> None:
        return jsii.invoke(self, "resetParametersBody", [])

    @jsii.member(jsii_name="resetTemplateBody")
    def reset_template_body(self) -> None:
        return jsii.invoke(self, "resetTemplateBody", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deploymentModeInput")
    def deployment_mode_input(self) -> builtins.str:
        return jsii.get(self, "deploymentModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersBodyInput")
    def parameters_body_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "parametersBodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersInput")
    def parameters_input(
        self,
    ) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "parametersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateBodyInput")
    def template_body_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "templateBodyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["TemplateDeploymentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deploymentMode")
    def deployment_mode(self) -> builtins.str:
        return jsii.get(self, "deploymentMode")

    @deployment_mode.setter # type: ignore
    def deployment_mode(self, value: builtins.str) -> None:
        jsii.set(self, "deploymentMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "parameters")

    @parameters.setter # type: ignore
    def parameters(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="parametersBody")
    def parameters_body(self) -> builtins.str:
        return jsii.get(self, "parametersBody")

    @parameters_body.setter # type: ignore
    def parameters_body(self, value: builtins.str) -> None:
        jsii.set(self, "parametersBody", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="templateBody")
    def template_body(self) -> builtins.str:
        return jsii.get(self, "templateBody")

    @template_body.setter # type: ignore
    def template_body(self, value: builtins.str) -> None:
        jsii.set(self, "templateBody", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "TemplateDeploymentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "TemplateDeploymentTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.TemplateDeploymentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "deployment_mode": "deploymentMode",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "parameters": "parameters",
        "parameters_body": "parametersBody",
        "template_body": "templateBody",
        "timeouts": "timeouts",
    },
)
class TemplateDeploymentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        deployment_mode: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        parameters: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        parameters_body: typing.Optional[builtins.str] = None,
        template_body: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["TemplateDeploymentTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param deployment_mode: -
        :param name: -
        :param resource_group_name: -
        :param parameters: -
        :param parameters_body: -
        :param template_body: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = TemplateDeploymentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "deployment_mode": deployment_mode,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if parameters is not None:
            self._values["parameters"] = parameters
        if parameters_body is not None:
            self._values["parameters_body"] = parameters_body
        if template_body is not None:
            self._values["template_body"] = template_body
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def deployment_mode(self) -> builtins.str:
        result = self._values.get("deployment_mode")
        assert result is not None, "Required property 'deployment_mode' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("parameters")
        return result

    @builtins.property
    def parameters_body(self) -> typing.Optional[builtins.str]:
        result = self._values.get("parameters_body")
        return result

    @builtins.property
    def template_body(self) -> typing.Optional[builtins.str]:
        result = self._values.get("template_body")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["TemplateDeploymentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TemplateDeploymentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TemplateDeploymentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class TemplateDeploymentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TemplateDeploymentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class TrafficManagerEndpoint(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.TrafficManagerEndpoint",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        profile_name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        custom_header: typing.Optional[typing.List["TrafficManagerEndpointCustomHeader"]] = None,
        endpoint_location: typing.Optional[builtins.str] = None,
        endpoint_status: typing.Optional[builtins.str] = None,
        geo_mappings: typing.Optional[typing.List[builtins.str]] = None,
        min_child_endpoints: typing.Optional[jsii.Number] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet: typing.Optional[typing.List["TrafficManagerEndpointSubnet"]] = None,
        target: typing.Optional[builtins.str] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["TrafficManagerEndpointTimeouts"] = None,
        weight: typing.Optional[jsii.Number] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param profile_name: -
        :param resource_group_name: -
        :param type: -
        :param custom_header: custom_header block.
        :param endpoint_location: -
        :param endpoint_status: -
        :param geo_mappings: -
        :param min_child_endpoints: -
        :param priority: -
        :param subnet: subnet block.
        :param target: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        :param weight: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = TrafficManagerEndpointConfig(
            name=name,
            profile_name=profile_name,
            resource_group_name=resource_group_name,
            type=type,
            custom_header=custom_header,
            endpoint_location=endpoint_location,
            endpoint_status=endpoint_status,
            geo_mappings=geo_mappings,
            min_child_endpoints=min_child_endpoints,
            priority=priority,
            subnet=subnet,
            target=target,
            target_resource_id=target_resource_id,
            timeouts=timeouts,
            weight=weight,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(TrafficManagerEndpoint, self, [scope, id, config])

    @jsii.member(jsii_name="resetCustomHeader")
    def reset_custom_header(self) -> None:
        return jsii.invoke(self, "resetCustomHeader", [])

    @jsii.member(jsii_name="resetEndpointLocation")
    def reset_endpoint_location(self) -> None:
        return jsii.invoke(self, "resetEndpointLocation", [])

    @jsii.member(jsii_name="resetEndpointStatus")
    def reset_endpoint_status(self) -> None:
        return jsii.invoke(self, "resetEndpointStatus", [])

    @jsii.member(jsii_name="resetGeoMappings")
    def reset_geo_mappings(self) -> None:
        return jsii.invoke(self, "resetGeoMappings", [])

    @jsii.member(jsii_name="resetMinChildEndpoints")
    def reset_min_child_endpoints(self) -> None:
        return jsii.invoke(self, "resetMinChildEndpoints", [])

    @jsii.member(jsii_name="resetPriority")
    def reset_priority(self) -> None:
        return jsii.invoke(self, "resetPriority", [])

    @jsii.member(jsii_name="resetSubnet")
    def reset_subnet(self) -> None:
        return jsii.invoke(self, "resetSubnet", [])

    @jsii.member(jsii_name="resetTarget")
    def reset_target(self) -> None:
        return jsii.invoke(self, "resetTarget", [])

    @jsii.member(jsii_name="resetTargetResourceId")
    def reset_target_resource_id(self) -> None:
        return jsii.invoke(self, "resetTargetResourceId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWeight")
    def reset_weight(self) -> None:
        return jsii.invoke(self, "resetWeight", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointMonitorStatus")
    def endpoint_monitor_status(self) -> builtins.str:
        return jsii.get(self, "endpointMonitorStatus")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileNameInput")
    def profile_name_input(self) -> builtins.str:
        return jsii.get(self, "profileNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHeaderInput")
    def custom_header_input(
        self,
    ) -> typing.Optional[typing.List["TrafficManagerEndpointCustomHeader"]]:
        return jsii.get(self, "customHeaderInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointLocationInput")
    def endpoint_location_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "endpointLocationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointStatusInput")
    def endpoint_status_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "endpointStatusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoMappingsInput")
    def geo_mappings_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "geoMappingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minChildEndpointsInput")
    def min_child_endpoints_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "minChildEndpointsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetInput")
    def subnet_input(
        self,
    ) -> typing.Optional[typing.List["TrafficManagerEndpointSubnet"]]:
        return jsii.get(self, "subnetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetInput")
    def target_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceIdInput")
    def target_resource_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "targetResourceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["TrafficManagerEndpointTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="weightInput")
    def weight_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "weightInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customHeader")
    def custom_header(self) -> typing.List["TrafficManagerEndpointCustomHeader"]:
        return jsii.get(self, "customHeader")

    @custom_header.setter # type: ignore
    def custom_header(
        self,
        value: typing.List["TrafficManagerEndpointCustomHeader"],
    ) -> None:
        jsii.set(self, "customHeader", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointLocation")
    def endpoint_location(self) -> builtins.str:
        return jsii.get(self, "endpointLocation")

    @endpoint_location.setter # type: ignore
    def endpoint_location(self, value: builtins.str) -> None:
        jsii.set(self, "endpointLocation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="endpointStatus")
    def endpoint_status(self) -> builtins.str:
        return jsii.get(self, "endpointStatus")

    @endpoint_status.setter # type: ignore
    def endpoint_status(self, value: builtins.str) -> None:
        jsii.set(self, "endpointStatus", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="geoMappings")
    def geo_mappings(self) -> typing.List[builtins.str]:
        return jsii.get(self, "geoMappings")

    @geo_mappings.setter # type: ignore
    def geo_mappings(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "geoMappings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="minChildEndpoints")
    def min_child_endpoints(self) -> jsii.Number:
        return jsii.get(self, "minChildEndpoints")

    @min_child_endpoints.setter # type: ignore
    def min_child_endpoints(self, value: jsii.Number) -> None:
        jsii.set(self, "minChildEndpoints", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> jsii.Number:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: jsii.Number) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileName")
    def profile_name(self) -> builtins.str:
        return jsii.get(self, "profileName")

    @profile_name.setter # type: ignore
    def profile_name(self, value: builtins.str) -> None:
        jsii.set(self, "profileName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnet")
    def subnet(self) -> typing.List["TrafficManagerEndpointSubnet"]:
        return jsii.get(self, "subnet")

    @subnet.setter # type: ignore
    def subnet(self, value: typing.List["TrafficManagerEndpointSubnet"]) -> None:
        jsii.set(self, "subnet", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="target")
    def target(self) -> builtins.str:
        return jsii.get(self, "target")

    @target.setter # type: ignore
    def target(self, value: builtins.str) -> None:
        jsii.set(self, "target", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="targetResourceId")
    def target_resource_id(self) -> builtins.str:
        return jsii.get(self, "targetResourceId")

    @target_resource_id.setter # type: ignore
    def target_resource_id(self, value: builtins.str) -> None:
        jsii.set(self, "targetResourceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "TrafficManagerEndpointTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "TrafficManagerEndpointTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="weight")
    def weight(self) -> jsii.Number:
        return jsii.get(self, "weight")

    @weight.setter # type: ignore
    def weight(self, value: jsii.Number) -> None:
        jsii.set(self, "weight", value)


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerEndpointConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "profile_name": "profileName",
        "resource_group_name": "resourceGroupName",
        "type": "type",
        "custom_header": "customHeader",
        "endpoint_location": "endpointLocation",
        "endpoint_status": "endpointStatus",
        "geo_mappings": "geoMappings",
        "min_child_endpoints": "minChildEndpoints",
        "priority": "priority",
        "subnet": "subnet",
        "target": "target",
        "target_resource_id": "targetResourceId",
        "timeouts": "timeouts",
        "weight": "weight",
    },
)
class TrafficManagerEndpointConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        profile_name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        custom_header: typing.Optional[typing.List["TrafficManagerEndpointCustomHeader"]] = None,
        endpoint_location: typing.Optional[builtins.str] = None,
        endpoint_status: typing.Optional[builtins.str] = None,
        geo_mappings: typing.Optional[typing.List[builtins.str]] = None,
        min_child_endpoints: typing.Optional[jsii.Number] = None,
        priority: typing.Optional[jsii.Number] = None,
        subnet: typing.Optional[typing.List["TrafficManagerEndpointSubnet"]] = None,
        target: typing.Optional[builtins.str] = None,
        target_resource_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["TrafficManagerEndpointTimeouts"] = None,
        weight: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param profile_name: -
        :param resource_group_name: -
        :param type: -
        :param custom_header: custom_header block.
        :param endpoint_location: -
        :param endpoint_status: -
        :param geo_mappings: -
        :param min_child_endpoints: -
        :param priority: -
        :param subnet: subnet block.
        :param target: -
        :param target_resource_id: -
        :param timeouts: timeouts block.
        :param weight: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = TrafficManagerEndpointTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "profile_name": profile_name,
            "resource_group_name": resource_group_name,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if custom_header is not None:
            self._values["custom_header"] = custom_header
        if endpoint_location is not None:
            self._values["endpoint_location"] = endpoint_location
        if endpoint_status is not None:
            self._values["endpoint_status"] = endpoint_status
        if geo_mappings is not None:
            self._values["geo_mappings"] = geo_mappings
        if min_child_endpoints is not None:
            self._values["min_child_endpoints"] = min_child_endpoints
        if priority is not None:
            self._values["priority"] = priority
        if subnet is not None:
            self._values["subnet"] = subnet
        if target is not None:
            self._values["target"] = target
        if target_resource_id is not None:
            self._values["target_resource_id"] = target_resource_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if weight is not None:
            self._values["weight"] = weight

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def profile_name(self) -> builtins.str:
        result = self._values.get("profile_name")
        assert result is not None, "Required property 'profile_name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def custom_header(
        self,
    ) -> typing.Optional[typing.List["TrafficManagerEndpointCustomHeader"]]:
        """custom_header block."""
        result = self._values.get("custom_header")
        return result

    @builtins.property
    def endpoint_location(self) -> typing.Optional[builtins.str]:
        result = self._values.get("endpoint_location")
        return result

    @builtins.property
    def endpoint_status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("endpoint_status")
        return result

    @builtins.property
    def geo_mappings(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("geo_mappings")
        return result

    @builtins.property
    def min_child_endpoints(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("min_child_endpoints")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def subnet(self) -> typing.Optional[typing.List["TrafficManagerEndpointSubnet"]]:
        """subnet block."""
        result = self._values.get("subnet")
        return result

    @builtins.property
    def target(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target")
        return result

    @builtins.property
    def target_resource_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("target_resource_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["TrafficManagerEndpointTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def weight(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("weight")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerEndpointConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerEndpointCustomHeader",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "value": "value"},
)
class TrafficManagerEndpointCustomHeader:
    def __init__(self, *, name: builtins.str, value: builtins.str) -> None:
        """
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerEndpointCustomHeader(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerEndpointSubnet",
    jsii_struct_bases=[],
    name_mapping={"first": "first", "last": "last", "scope": "scope"},
)
class TrafficManagerEndpointSubnet:
    def __init__(
        self,
        *,
        first: builtins.str,
        last: typing.Optional[builtins.str] = None,
        scope: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param first: -
        :param last: -
        :param scope: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "first": first,
        }
        if last is not None:
            self._values["last"] = last
        if scope is not None:
            self._values["scope"] = scope

    @builtins.property
    def first(self) -> builtins.str:
        result = self._values.get("first")
        assert result is not None, "Required property 'first' is missing"
        return result

    @builtins.property
    def last(self) -> typing.Optional[builtins.str]:
        result = self._values.get("last")
        return result

    @builtins.property
    def scope(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("scope")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerEndpointSubnet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerEndpointTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class TrafficManagerEndpointTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerEndpointTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class TrafficManagerProfile(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.TrafficManagerProfile",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        dns_config: typing.List["TrafficManagerProfileDnsConfig"],
        monitor_config: typing.List["TrafficManagerProfileMonitorConfig"],
        name: builtins.str,
        resource_group_name: builtins.str,
        traffic_routing_method: builtins.str,
        profile_status: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["TrafficManagerProfileTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param dns_config: dns_config block.
        :param monitor_config: monitor_config block.
        :param name: -
        :param resource_group_name: -
        :param traffic_routing_method: -
        :param profile_status: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = TrafficManagerProfileConfig(
            dns_config=dns_config,
            monitor_config=monitor_config,
            name=name,
            resource_group_name=resource_group_name,
            traffic_routing_method=traffic_routing_method,
            profile_status=profile_status,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(TrafficManagerProfile, self, [scope, id, config])

    @jsii.member(jsii_name="resetProfileStatus")
    def reset_profile_status(self) -> None:
        return jsii.invoke(self, "resetProfileStatus", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsConfigInput")
    def dns_config_input(self) -> typing.List["TrafficManagerProfileDnsConfig"]:
        return jsii.get(self, "dnsConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> builtins.str:
        return jsii.get(self, "fqdn")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorConfigInput")
    def monitor_config_input(self) -> typing.List["TrafficManagerProfileMonitorConfig"]:
        return jsii.get(self, "monitorConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trafficRoutingMethodInput")
    def traffic_routing_method_input(self) -> builtins.str:
        return jsii.get(self, "trafficRoutingMethodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileStatusInput")
    def profile_status_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "profileStatusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["TrafficManagerProfileTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsConfig")
    def dns_config(self) -> typing.List["TrafficManagerProfileDnsConfig"]:
        return jsii.get(self, "dnsConfig")

    @dns_config.setter # type: ignore
    def dns_config(self, value: typing.List["TrafficManagerProfileDnsConfig"]) -> None:
        jsii.set(self, "dnsConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="monitorConfig")
    def monitor_config(self) -> typing.List["TrafficManagerProfileMonitorConfig"]:
        return jsii.get(self, "monitorConfig")

    @monitor_config.setter # type: ignore
    def monitor_config(
        self,
        value: typing.List["TrafficManagerProfileMonitorConfig"],
    ) -> None:
        jsii.set(self, "monitorConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="profileStatus")
    def profile_status(self) -> builtins.str:
        return jsii.get(self, "profileStatus")

    @profile_status.setter # type: ignore
    def profile_status(self, value: builtins.str) -> None:
        jsii.set(self, "profileStatus", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "TrafficManagerProfileTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "TrafficManagerProfileTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trafficRoutingMethod")
    def traffic_routing_method(self) -> builtins.str:
        return jsii.get(self, "trafficRoutingMethod")

    @traffic_routing_method.setter # type: ignore
    def traffic_routing_method(self, value: builtins.str) -> None:
        jsii.set(self, "trafficRoutingMethod", value)


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerProfileConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "dns_config": "dnsConfig",
        "monitor_config": "monitorConfig",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "traffic_routing_method": "trafficRoutingMethod",
        "profile_status": "profileStatus",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class TrafficManagerProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        dns_config: typing.List["TrafficManagerProfileDnsConfig"],
        monitor_config: typing.List["TrafficManagerProfileMonitorConfig"],
        name: builtins.str,
        resource_group_name: builtins.str,
        traffic_routing_method: builtins.str,
        profile_status: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["TrafficManagerProfileTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dns_config: dns_config block.
        :param monitor_config: monitor_config block.
        :param name: -
        :param resource_group_name: -
        :param traffic_routing_method: -
        :param profile_status: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = TrafficManagerProfileTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "dns_config": dns_config,
            "monitor_config": monitor_config,
            "name": name,
            "resource_group_name": resource_group_name,
            "traffic_routing_method": traffic_routing_method,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if profile_status is not None:
            self._values["profile_status"] = profile_status
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def dns_config(self) -> typing.List["TrafficManagerProfileDnsConfig"]:
        """dns_config block."""
        result = self._values.get("dns_config")
        assert result is not None, "Required property 'dns_config' is missing"
        return result

    @builtins.property
    def monitor_config(self) -> typing.List["TrafficManagerProfileMonitorConfig"]:
        """monitor_config block."""
        result = self._values.get("monitor_config")
        assert result is not None, "Required property 'monitor_config' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def traffic_routing_method(self) -> builtins.str:
        result = self._values.get("traffic_routing_method")
        assert result is not None, "Required property 'traffic_routing_method' is missing"
        return result

    @builtins.property
    def profile_status(self) -> typing.Optional[builtins.str]:
        result = self._values.get("profile_status")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["TrafficManagerProfileTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerProfileConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerProfileDnsConfig",
    jsii_struct_bases=[],
    name_mapping={"relative_name": "relativeName", "ttl": "ttl"},
)
class TrafficManagerProfileDnsConfig:
    def __init__(self, *, relative_name: builtins.str, ttl: jsii.Number) -> None:
        """
        :param relative_name: -
        :param ttl: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "relative_name": relative_name,
            "ttl": ttl,
        }

    @builtins.property
    def relative_name(self) -> builtins.str:
        result = self._values.get("relative_name")
        assert result is not None, "Required property 'relative_name' is missing"
        return result

    @builtins.property
    def ttl(self) -> jsii.Number:
        result = self._values.get("ttl")
        assert result is not None, "Required property 'ttl' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerProfileDnsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerProfileMonitorConfig",
    jsii_struct_bases=[],
    name_mapping={
        "port": "port",
        "protocol": "protocol",
        "custom_header": "customHeader",
        "expected_status_code_ranges": "expectedStatusCodeRanges",
        "interval_in_seconds": "intervalInSeconds",
        "path": "path",
        "timeout_in_seconds": "timeoutInSeconds",
        "tolerated_number_of_failures": "toleratedNumberOfFailures",
    },
)
class TrafficManagerProfileMonitorConfig:
    def __init__(
        self,
        *,
        port: jsii.Number,
        protocol: builtins.str,
        custom_header: typing.Optional[typing.List["TrafficManagerProfileMonitorConfigCustomHeader"]] = None,
        expected_status_code_ranges: typing.Optional[typing.List[builtins.str]] = None,
        interval_in_seconds: typing.Optional[jsii.Number] = None,
        path: typing.Optional[builtins.str] = None,
        timeout_in_seconds: typing.Optional[jsii.Number] = None,
        tolerated_number_of_failures: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param port: -
        :param protocol: -
        :param custom_header: custom_header block.
        :param expected_status_code_ranges: -
        :param interval_in_seconds: -
        :param path: -
        :param timeout_in_seconds: -
        :param tolerated_number_of_failures: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "port": port,
            "protocol": protocol,
        }
        if custom_header is not None:
            self._values["custom_header"] = custom_header
        if expected_status_code_ranges is not None:
            self._values["expected_status_code_ranges"] = expected_status_code_ranges
        if interval_in_seconds is not None:
            self._values["interval_in_seconds"] = interval_in_seconds
        if path is not None:
            self._values["path"] = path
        if timeout_in_seconds is not None:
            self._values["timeout_in_seconds"] = timeout_in_seconds
        if tolerated_number_of_failures is not None:
            self._values["tolerated_number_of_failures"] = tolerated_number_of_failures

    @builtins.property
    def port(self) -> jsii.Number:
        result = self._values.get("port")
        assert result is not None, "Required property 'port' is missing"
        return result

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def custom_header(
        self,
    ) -> typing.Optional[typing.List["TrafficManagerProfileMonitorConfigCustomHeader"]]:
        """custom_header block."""
        result = self._values.get("custom_header")
        return result

    @builtins.property
    def expected_status_code_ranges(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("expected_status_code_ranges")
        return result

    @builtins.property
    def interval_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("interval_in_seconds")
        return result

    @builtins.property
    def path(self) -> typing.Optional[builtins.str]:
        result = self._values.get("path")
        return result

    @builtins.property
    def timeout_in_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("timeout_in_seconds")
        return result

    @builtins.property
    def tolerated_number_of_failures(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("tolerated_number_of_failures")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerProfileMonitorConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerProfileMonitorConfigCustomHeader",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "value": "value"},
)
class TrafficManagerProfileMonitorConfigCustomHeader:
    def __init__(self, *, name: builtins.str, value: builtins.str) -> None:
        """
        :param name: -
        :param value: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "value": value,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def value(self) -> builtins.str:
        result = self._values.get("value")
        assert result is not None, "Required property 'value' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerProfileMonitorConfigCustomHeader(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.TrafficManagerProfileTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class TrafficManagerProfileTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "TrafficManagerProfileTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class UserAssignedIdentity(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.UserAssignedIdentity",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["UserAssignedIdentityTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = UserAssignedIdentityConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(UserAssignedIdentity, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> builtins.str:
        return jsii.get(self, "clientId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="principalId")
    def principal_id(self) -> builtins.str:
        return jsii.get(self, "principalId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["UserAssignedIdentityTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "UserAssignedIdentityTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "UserAssignedIdentityTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.UserAssignedIdentityConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class UserAssignedIdentityConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["UserAssignedIdentityTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = UserAssignedIdentityTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["UserAssignedIdentityTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "UserAssignedIdentityConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.UserAssignedIdentityTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class UserAssignedIdentityTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "UserAssignedIdentityTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualDesktopApplicationGroup(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualDesktopApplicationGroup",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        host_pool_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualDesktopApplicationGroupTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param host_pool_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param description: -
        :param friendly_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualDesktopApplicationGroupConfig(
            host_pool_id=host_pool_id,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            type=type,
            description=description,
            friendly_name=friendly_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualDesktopApplicationGroup, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFriendlyName")
    def reset_friendly_name(self) -> None:
        return jsii.invoke(self, "resetFriendlyName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostPoolIdInput")
    def host_pool_id_input(self) -> builtins.str:
        return jsii.get(self, "hostPoolIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyNameInput")
    def friendly_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "friendlyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["VirtualDesktopApplicationGroupTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @friendly_name.setter # type: ignore
    def friendly_name(self, value: builtins.str) -> None:
        jsii.set(self, "friendlyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hostPoolId")
    def host_pool_id(self) -> builtins.str:
        return jsii.get(self, "hostPoolId")

    @host_pool_id.setter # type: ignore
    def host_pool_id(self, value: builtins.str) -> None:
        jsii.set(self, "hostPoolId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualDesktopApplicationGroupTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualDesktopApplicationGroupTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopApplicationGroupConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "host_pool_id": "hostPoolId",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "type": "type",
        "description": "description",
        "friendly_name": "friendlyName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class VirtualDesktopApplicationGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        host_pool_id: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualDesktopApplicationGroupTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param host_pool_id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param description: -
        :param friendly_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualDesktopApplicationGroupTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "host_pool_id": host_pool_id,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if friendly_name is not None:
            self._values["friendly_name"] = friendly_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def host_pool_id(self) -> builtins.str:
        result = self._values.get("host_pool_id")
        assert result is not None, "Required property 'host_pool_id' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def friendly_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("friendly_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualDesktopApplicationGroupTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopApplicationGroupConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopApplicationGroupTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualDesktopApplicationGroupTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopApplicationGroupTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualDesktopHostPool(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualDesktopHostPool",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        load_balancer_type: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        maximum_sessions_allowed: typing.Optional[jsii.Number] = None,
        personal_desktop_assignment_type: typing.Optional[builtins.str] = None,
        preferred_app_group_type: typing.Optional[builtins.str] = None,
        registration_info: typing.Optional[typing.List["VirtualDesktopHostPoolRegistrationInfo"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualDesktopHostPoolTimeouts"] = None,
        validate_environment: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param load_balancer_type: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param description: -
        :param friendly_name: -
        :param maximum_sessions_allowed: -
        :param personal_desktop_assignment_type: -
        :param preferred_app_group_type: Preferred App Group type to display.
        :param registration_info: registration_info block.
        :param tags: -
        :param timeouts: timeouts block.
        :param validate_environment: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualDesktopHostPoolConfig(
            load_balancer_type=load_balancer_type,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            type=type,
            description=description,
            friendly_name=friendly_name,
            maximum_sessions_allowed=maximum_sessions_allowed,
            personal_desktop_assignment_type=personal_desktop_assignment_type,
            preferred_app_group_type=preferred_app_group_type,
            registration_info=registration_info,
            tags=tags,
            timeouts=timeouts,
            validate_environment=validate_environment,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualDesktopHostPool, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFriendlyName")
    def reset_friendly_name(self) -> None:
        return jsii.invoke(self, "resetFriendlyName", [])

    @jsii.member(jsii_name="resetMaximumSessionsAllowed")
    def reset_maximum_sessions_allowed(self) -> None:
        return jsii.invoke(self, "resetMaximumSessionsAllowed", [])

    @jsii.member(jsii_name="resetPersonalDesktopAssignmentType")
    def reset_personal_desktop_assignment_type(self) -> None:
        return jsii.invoke(self, "resetPersonalDesktopAssignmentType", [])

    @jsii.member(jsii_name="resetPreferredAppGroupType")
    def reset_preferred_app_group_type(self) -> None:
        return jsii.invoke(self, "resetPreferredAppGroupType", [])

    @jsii.member(jsii_name="resetRegistrationInfo")
    def reset_registration_info(self) -> None:
        return jsii.invoke(self, "resetRegistrationInfo", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetValidateEnvironment")
    def reset_validate_environment(self) -> None:
        return jsii.invoke(self, "resetValidateEnvironment", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerTypeInput")
    def load_balancer_type_input(self) -> builtins.str:
        return jsii.get(self, "loadBalancerTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyNameInput")
    def friendly_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "friendlyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumSessionsAllowedInput")
    def maximum_sessions_allowed_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maximumSessionsAllowedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="personalDesktopAssignmentTypeInput")
    def personal_desktop_assignment_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "personalDesktopAssignmentTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="preferredAppGroupTypeInput")
    def preferred_app_group_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "preferredAppGroupTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationInfoInput")
    def registration_info_input(
        self,
    ) -> typing.Optional[typing.List["VirtualDesktopHostPoolRegistrationInfo"]]:
        return jsii.get(self, "registrationInfoInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualDesktopHostPoolTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validateEnvironmentInput")
    def validate_environment_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "validateEnvironmentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @friendly_name.setter # type: ignore
    def friendly_name(self, value: builtins.str) -> None:
        jsii.set(self, "friendlyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="loadBalancerType")
    def load_balancer_type(self) -> builtins.str:
        return jsii.get(self, "loadBalancerType")

    @load_balancer_type.setter # type: ignore
    def load_balancer_type(self, value: builtins.str) -> None:
        jsii.set(self, "loadBalancerType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maximumSessionsAllowed")
    def maximum_sessions_allowed(self) -> jsii.Number:
        return jsii.get(self, "maximumSessionsAllowed")

    @maximum_sessions_allowed.setter # type: ignore
    def maximum_sessions_allowed(self, value: jsii.Number) -> None:
        jsii.set(self, "maximumSessionsAllowed", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="personalDesktopAssignmentType")
    def personal_desktop_assignment_type(self) -> builtins.str:
        return jsii.get(self, "personalDesktopAssignmentType")

    @personal_desktop_assignment_type.setter # type: ignore
    def personal_desktop_assignment_type(self, value: builtins.str) -> None:
        jsii.set(self, "personalDesktopAssignmentType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="preferredAppGroupType")
    def preferred_app_group_type(self) -> builtins.str:
        return jsii.get(self, "preferredAppGroupType")

    @preferred_app_group_type.setter # type: ignore
    def preferred_app_group_type(self, value: builtins.str) -> None:
        jsii.set(self, "preferredAppGroupType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="registrationInfo")
    def registration_info(
        self,
    ) -> typing.List["VirtualDesktopHostPoolRegistrationInfo"]:
        return jsii.get(self, "registrationInfo")

    @registration_info.setter # type: ignore
    def registration_info(
        self,
        value: typing.List["VirtualDesktopHostPoolRegistrationInfo"],
    ) -> None:
        jsii.set(self, "registrationInfo", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualDesktopHostPoolTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualDesktopHostPoolTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="validateEnvironment")
    def validate_environment(self) -> builtins.bool:
        return jsii.get(self, "validateEnvironment")

    @validate_environment.setter # type: ignore
    def validate_environment(self, value: builtins.bool) -> None:
        jsii.set(self, "validateEnvironment", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopHostPoolConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "load_balancer_type": "loadBalancerType",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "type": "type",
        "description": "description",
        "friendly_name": "friendlyName",
        "maximum_sessions_allowed": "maximumSessionsAllowed",
        "personal_desktop_assignment_type": "personalDesktopAssignmentType",
        "preferred_app_group_type": "preferredAppGroupType",
        "registration_info": "registrationInfo",
        "tags": "tags",
        "timeouts": "timeouts",
        "validate_environment": "validateEnvironment",
    },
)
class VirtualDesktopHostPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        load_balancer_type: builtins.str,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        maximum_sessions_allowed: typing.Optional[jsii.Number] = None,
        personal_desktop_assignment_type: typing.Optional[builtins.str] = None,
        preferred_app_group_type: typing.Optional[builtins.str] = None,
        registration_info: typing.Optional[typing.List["VirtualDesktopHostPoolRegistrationInfo"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualDesktopHostPoolTimeouts"] = None,
        validate_environment: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param load_balancer_type: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param description: -
        :param friendly_name: -
        :param maximum_sessions_allowed: -
        :param personal_desktop_assignment_type: -
        :param preferred_app_group_type: Preferred App Group type to display.
        :param registration_info: registration_info block.
        :param tags: -
        :param timeouts: timeouts block.
        :param validate_environment: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualDesktopHostPoolTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "load_balancer_type": load_balancer_type,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if friendly_name is not None:
            self._values["friendly_name"] = friendly_name
        if maximum_sessions_allowed is not None:
            self._values["maximum_sessions_allowed"] = maximum_sessions_allowed
        if personal_desktop_assignment_type is not None:
            self._values["personal_desktop_assignment_type"] = personal_desktop_assignment_type
        if preferred_app_group_type is not None:
            self._values["preferred_app_group_type"] = preferred_app_group_type
        if registration_info is not None:
            self._values["registration_info"] = registration_info
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if validate_environment is not None:
            self._values["validate_environment"] = validate_environment

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def load_balancer_type(self) -> builtins.str:
        result = self._values.get("load_balancer_type")
        assert result is not None, "Required property 'load_balancer_type' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def friendly_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("friendly_name")
        return result

    @builtins.property
    def maximum_sessions_allowed(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("maximum_sessions_allowed")
        return result

    @builtins.property
    def personal_desktop_assignment_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("personal_desktop_assignment_type")
        return result

    @builtins.property
    def preferred_app_group_type(self) -> typing.Optional[builtins.str]:
        """Preferred App Group type to display."""
        result = self._values.get("preferred_app_group_type")
        return result

    @builtins.property
    def registration_info(
        self,
    ) -> typing.Optional[typing.List["VirtualDesktopHostPoolRegistrationInfo"]]:
        """registration_info block."""
        result = self._values.get("registration_info")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualDesktopHostPoolTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def validate_environment(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("validate_environment")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopHostPoolConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopHostPoolRegistrationInfo",
    jsii_struct_bases=[],
    name_mapping={"expiration_date": "expirationDate"},
)
class VirtualDesktopHostPoolRegistrationInfo:
    def __init__(self, *, expiration_date: builtins.str) -> None:
        """
        :param expiration_date: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "expiration_date": expiration_date,
        }

    @builtins.property
    def expiration_date(self) -> builtins.str:
        result = self._values.get("expiration_date")
        assert result is not None, "Required property 'expiration_date' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopHostPoolRegistrationInfo(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopHostPoolTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualDesktopHostPoolTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopHostPoolTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualDesktopWorkspace(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualDesktopWorkspace",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualDesktopWorkspaceTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param friendly_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualDesktopWorkspaceConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            description=description,
            friendly_name=friendly_name,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualDesktopWorkspace, self, [scope, id, config])

    @jsii.member(jsii_name="resetDescription")
    def reset_description(self) -> None:
        return jsii.invoke(self, "resetDescription", [])

    @jsii.member(jsii_name="resetFriendlyName")
    def reset_friendly_name(self) -> None:
        return jsii.invoke(self, "resetFriendlyName", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="descriptionInput")
    def description_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "descriptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyNameInput")
    def friendly_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "friendlyNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualDesktopWorkspaceTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="description")
    def description(self) -> builtins.str:
        return jsii.get(self, "description")

    @description.setter # type: ignore
    def description(self, value: builtins.str) -> None:
        jsii.set(self, "description", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> builtins.str:
        return jsii.get(self, "friendlyName")

    @friendly_name.setter # type: ignore
    def friendly_name(self, value: builtins.str) -> None:
        jsii.set(self, "friendlyName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualDesktopWorkspaceTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualDesktopWorkspaceTimeouts") -> None:
        jsii.set(self, "timeouts", value)


class VirtualDesktopWorkspaceApplicationGroupAssociation(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualDesktopWorkspaceApplicationGroupAssociation",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        application_group_id: builtins.str,
        workspace_id: builtins.str,
        timeouts: typing.Optional["VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param application_group_id: -
        :param workspace_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualDesktopWorkspaceApplicationGroupAssociationConfig(
            application_group_id=application_group_id,
            workspace_id=workspace_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualDesktopWorkspaceApplicationGroupAssociation, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationGroupIdInput")
    def application_group_id_input(self) -> builtins.str:
        return jsii.get(self, "applicationGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceIdInput")
    def workspace_id_input(self) -> builtins.str:
        return jsii.get(self, "workspaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="applicationGroupId")
    def application_group_id(self) -> builtins.str:
        return jsii.get(self, "applicationGroupId")

    @application_group_id.setter # type: ignore
    def application_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "applicationGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(
        self,
        value: "VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts",
    ) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="workspaceId")
    def workspace_id(self) -> builtins.str:
        return jsii.get(self, "workspaceId")

    @workspace_id.setter # type: ignore
    def workspace_id(self, value: builtins.str) -> None:
        jsii.set(self, "workspaceId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopWorkspaceApplicationGroupAssociationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "application_group_id": "applicationGroupId",
        "workspace_id": "workspaceId",
        "timeouts": "timeouts",
    },
)
class VirtualDesktopWorkspaceApplicationGroupAssociationConfig(
    cdktf.TerraformMetaArguments,
):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        application_group_id: builtins.str,
        workspace_id: builtins.str,
        timeouts: typing.Optional["VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_group_id: -
        :param workspace_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "application_group_id": application_group_id,
            "workspace_id": workspace_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def application_group_id(self) -> builtins.str:
        result = self._values.get("application_group_id")
        assert result is not None, "Required property 'application_group_id' is missing"
        return result

    @builtins.property
    def workspace_id(self) -> builtins.str:
        result = self._values.get("workspace_id")
        assert result is not None, "Required property 'workspace_id' is missing"
        return result

    @builtins.property
    def timeouts(
        self,
    ) -> typing.Optional["VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopWorkspaceApplicationGroupAssociationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopWorkspaceConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "description": "description",
        "friendly_name": "friendlyName",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class VirtualDesktopWorkspaceConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        description: typing.Optional[builtins.str] = None,
        friendly_name: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualDesktopWorkspaceTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param description: -
        :param friendly_name: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualDesktopWorkspaceTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if description is not None:
            self._values["description"] = description
        if friendly_name is not None:
            self._values["friendly_name"] = friendly_name
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def description(self) -> typing.Optional[builtins.str]:
        result = self._values.get("description")
        return result

    @builtins.property
    def friendly_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("friendly_name")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualDesktopWorkspaceTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopWorkspaceConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualDesktopWorkspaceTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualDesktopWorkspaceTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualDesktopWorkspaceTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualHub(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualHub",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        address_prefix: typing.Optional[builtins.str] = None,
        route: typing.Optional[typing.List["VirtualHubRoute"]] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualHubTimeouts"] = None,
        virtual_wan_id: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param address_prefix: -
        :param route: route block.
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_wan_id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualHubConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            address_prefix=address_prefix,
            route=route,
            sku=sku,
            tags=tags,
            timeouts=timeouts,
            virtual_wan_id=virtual_wan_id,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualHub, self, [scope, id, config])

    @jsii.member(jsii_name="resetAddressPrefix")
    def reset_address_prefix(self) -> None:
        return jsii.invoke(self, "resetAddressPrefix", [])

    @jsii.member(jsii_name="resetRoute")
    def reset_route(self) -> None:
        return jsii.invoke(self, "resetRoute", [])

    @jsii.member(jsii_name="resetSku")
    def reset_sku(self) -> None:
        return jsii.invoke(self, "resetSku", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVirtualWanId")
    def reset_virtual_wan_id(self) -> None:
        return jsii.invoke(self, "resetVirtualWanId", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefixInput")
    def address_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "addressPrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeInput")
    def route_input(self) -> typing.Optional[typing.List["VirtualHubRoute"]]:
        return jsii.get(self, "routeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualHubTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualWanIdInput")
    def virtual_wan_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "virtualWanIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressPrefix")
    def address_prefix(self) -> builtins.str:
        return jsii.get(self, "addressPrefix")

    @address_prefix.setter # type: ignore
    def address_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "addressPrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="route")
    def route(self) -> typing.List["VirtualHubRoute"]:
        return jsii.get(self, "route")

    @route.setter # type: ignore
    def route(self, value: typing.List["VirtualHubRoute"]) -> None:
        jsii.set(self, "route", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualHubTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualHubTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualWanId")
    def virtual_wan_id(self) -> builtins.str:
        return jsii.get(self, "virtualWanId")

    @virtual_wan_id.setter # type: ignore
    def virtual_wan_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualWanId", value)


class VirtualHubBgpConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualHubBgpConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        peer_asn: jsii.Number,
        peer_ip: builtins.str,
        virtual_hub_id: builtins.str,
        timeouts: typing.Optional["VirtualHubBgpConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param peer_asn: -
        :param peer_ip: -
        :param virtual_hub_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualHubBgpConnectionConfig(
            name=name,
            peer_asn=peer_asn,
            peer_ip=peer_ip,
            virtual_hub_id=virtual_hub_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualHubBgpConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerAsnInput")
    def peer_asn_input(self) -> jsii.Number:
        return jsii.get(self, "peerAsnInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerIpInput")
    def peer_ip_input(self) -> builtins.str:
        return jsii.get(self, "peerIpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualHubBgpConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerAsn")
    def peer_asn(self) -> jsii.Number:
        return jsii.get(self, "peerAsn")

    @peer_asn.setter # type: ignore
    def peer_asn(self, value: jsii.Number) -> None:
        jsii.set(self, "peerAsn", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerIp")
    def peer_ip(self) -> builtins.str:
        return jsii.get(self, "peerIp")

    @peer_ip.setter # type: ignore
    def peer_ip(self, value: builtins.str) -> None:
        jsii.set(self, "peerIp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualHubBgpConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualHubBgpConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualHubBgpConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "peer_asn": "peerAsn",
        "peer_ip": "peerIp",
        "virtual_hub_id": "virtualHubId",
        "timeouts": "timeouts",
    },
)
class VirtualHubBgpConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        peer_asn: jsii.Number,
        peer_ip: builtins.str,
        virtual_hub_id: builtins.str,
        timeouts: typing.Optional["VirtualHubBgpConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param peer_asn: -
        :param peer_ip: -
        :param virtual_hub_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualHubBgpConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "peer_asn": peer_asn,
            "peer_ip": peer_ip,
            "virtual_hub_id": virtual_hub_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def peer_asn(self) -> jsii.Number:
        result = self._values.get("peer_asn")
        assert result is not None, "Required property 'peer_asn' is missing"
        return result

    @builtins.property
    def peer_ip(self) -> builtins.str:
        result = self._values.get("peer_ip")
        assert result is not None, "Required property 'peer_ip' is missing"
        return result

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualHubBgpConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubBgpConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubBgpConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={"create": "create", "delete": "delete", "read": "read"},
)
class VirtualHubBgpConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubBgpConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "address_prefix": "addressPrefix",
        "route": "route",
        "sku": "sku",
        "tags": "tags",
        "timeouts": "timeouts",
        "virtual_wan_id": "virtualWanId",
    },
)
class VirtualHubConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        address_prefix: typing.Optional[builtins.str] = None,
        route: typing.Optional[typing.List["VirtualHubRoute"]] = None,
        sku: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualHubTimeouts"] = None,
        virtual_wan_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param address_prefix: -
        :param route: route block.
        :param sku: -
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_wan_id: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualHubTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if address_prefix is not None:
            self._values["address_prefix"] = address_prefix
        if route is not None:
            self._values["route"] = route
        if sku is not None:
            self._values["sku"] = sku
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if virtual_wan_id is not None:
            self._values["virtual_wan_id"] = virtual_wan_id

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("address_prefix")
        return result

    @builtins.property
    def route(self) -> typing.Optional[typing.List["VirtualHubRoute"]]:
        """route block."""
        result = self._values.get("route")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualHubTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def virtual_wan_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_wan_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualHubConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualHubConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        remote_virtual_network_id: builtins.str,
        virtual_hub_id: builtins.str,
        hub_to_vitual_network_traffic_allowed: typing.Optional[builtins.bool] = None,
        internet_security_enabled: typing.Optional[builtins.bool] = None,
        routing: typing.Optional[typing.List["VirtualHubConnectionRouting"]] = None,
        timeouts: typing.Optional["VirtualHubConnectionTimeouts"] = None,
        vitual_network_to_hub_gateways_traffic_allowed: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param remote_virtual_network_id: -
        :param virtual_hub_id: -
        :param hub_to_vitual_network_traffic_allowed: -
        :param internet_security_enabled: -
        :param routing: routing block.
        :param timeouts: timeouts block.
        :param vitual_network_to_hub_gateways_traffic_allowed: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualHubConnectionConfig(
            name=name,
            remote_virtual_network_id=remote_virtual_network_id,
            virtual_hub_id=virtual_hub_id,
            hub_to_vitual_network_traffic_allowed=hub_to_vitual_network_traffic_allowed,
            internet_security_enabled=internet_security_enabled,
            routing=routing,
            timeouts=timeouts,
            vitual_network_to_hub_gateways_traffic_allowed=vitual_network_to_hub_gateways_traffic_allowed,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualHubConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetHubToVitualNetworkTrafficAllowed")
    def reset_hub_to_vitual_network_traffic_allowed(self) -> None:
        return jsii.invoke(self, "resetHubToVitualNetworkTrafficAllowed", [])

    @jsii.member(jsii_name="resetInternetSecurityEnabled")
    def reset_internet_security_enabled(self) -> None:
        return jsii.invoke(self, "resetInternetSecurityEnabled", [])

    @jsii.member(jsii_name="resetRouting")
    def reset_routing(self) -> None:
        return jsii.invoke(self, "resetRouting", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVitualNetworkToHubGatewaysTrafficAllowed")
    def reset_vitual_network_to_hub_gateways_traffic_allowed(self) -> None:
        return jsii.invoke(self, "resetVitualNetworkToHubGatewaysTrafficAllowed", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteVirtualNetworkIdInput")
    def remote_virtual_network_id_input(self) -> builtins.str:
        return jsii.get(self, "remoteVirtualNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hubToVitualNetworkTrafficAllowedInput")
    def hub_to_vitual_network_traffic_allowed_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "hubToVitualNetworkTrafficAllowedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetSecurityEnabledInput")
    def internet_security_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "internetSecurityEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routingInput")
    def routing_input(
        self,
    ) -> typing.Optional[typing.List["VirtualHubConnectionRouting"]]:
        return jsii.get(self, "routingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualHubConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vitualNetworkToHubGatewaysTrafficAllowedInput")
    def vitual_network_to_hub_gateways_traffic_allowed_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "vitualNetworkToHubGatewaysTrafficAllowedInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="hubToVitualNetworkTrafficAllowed")
    def hub_to_vitual_network_traffic_allowed(self) -> builtins.bool:
        return jsii.get(self, "hubToVitualNetworkTrafficAllowed")

    @hub_to_vitual_network_traffic_allowed.setter # type: ignore
    def hub_to_vitual_network_traffic_allowed(self, value: builtins.bool) -> None:
        jsii.set(self, "hubToVitualNetworkTrafficAllowed", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetSecurityEnabled")
    def internet_security_enabled(self) -> builtins.bool:
        return jsii.get(self, "internetSecurityEnabled")

    @internet_security_enabled.setter # type: ignore
    def internet_security_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "internetSecurityEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteVirtualNetworkId")
    def remote_virtual_network_id(self) -> builtins.str:
        return jsii.get(self, "remoteVirtualNetworkId")

    @remote_virtual_network_id.setter # type: ignore
    def remote_virtual_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "remoteVirtualNetworkId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routing")
    def routing(self) -> typing.List["VirtualHubConnectionRouting"]:
        return jsii.get(self, "routing")

    @routing.setter # type: ignore
    def routing(self, value: typing.List["VirtualHubConnectionRouting"]) -> None:
        jsii.set(self, "routing", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualHubConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualHubConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vitualNetworkToHubGatewaysTrafficAllowed")
    def vitual_network_to_hub_gateways_traffic_allowed(self) -> builtins.bool:
        return jsii.get(self, "vitualNetworkToHubGatewaysTrafficAllowed")

    @vitual_network_to_hub_gateways_traffic_allowed.setter # type: ignore
    def vitual_network_to_hub_gateways_traffic_allowed(
        self,
        value: builtins.bool,
    ) -> None:
        jsii.set(self, "vitualNetworkToHubGatewaysTrafficAllowed", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualHubConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "remote_virtual_network_id": "remoteVirtualNetworkId",
        "virtual_hub_id": "virtualHubId",
        "hub_to_vitual_network_traffic_allowed": "hubToVitualNetworkTrafficAllowed",
        "internet_security_enabled": "internetSecurityEnabled",
        "routing": "routing",
        "timeouts": "timeouts",
        "vitual_network_to_hub_gateways_traffic_allowed": "vitualNetworkToHubGatewaysTrafficAllowed",
    },
)
class VirtualHubConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        remote_virtual_network_id: builtins.str,
        virtual_hub_id: builtins.str,
        hub_to_vitual_network_traffic_allowed: typing.Optional[builtins.bool] = None,
        internet_security_enabled: typing.Optional[builtins.bool] = None,
        routing: typing.Optional[typing.List["VirtualHubConnectionRouting"]] = None,
        timeouts: typing.Optional["VirtualHubConnectionTimeouts"] = None,
        vitual_network_to_hub_gateways_traffic_allowed: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param remote_virtual_network_id: -
        :param virtual_hub_id: -
        :param hub_to_vitual_network_traffic_allowed: -
        :param internet_security_enabled: -
        :param routing: routing block.
        :param timeouts: timeouts block.
        :param vitual_network_to_hub_gateways_traffic_allowed: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualHubConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "remote_virtual_network_id": remote_virtual_network_id,
            "virtual_hub_id": virtual_hub_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if hub_to_vitual_network_traffic_allowed is not None:
            self._values["hub_to_vitual_network_traffic_allowed"] = hub_to_vitual_network_traffic_allowed
        if internet_security_enabled is not None:
            self._values["internet_security_enabled"] = internet_security_enabled
        if routing is not None:
            self._values["routing"] = routing
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if vitual_network_to_hub_gateways_traffic_allowed is not None:
            self._values["vitual_network_to_hub_gateways_traffic_allowed"] = vitual_network_to_hub_gateways_traffic_allowed

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def remote_virtual_network_id(self) -> builtins.str:
        result = self._values.get("remote_virtual_network_id")
        assert result is not None, "Required property 'remote_virtual_network_id' is missing"
        return result

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def hub_to_vitual_network_traffic_allowed(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("hub_to_vitual_network_traffic_allowed")
        return result

    @builtins.property
    def internet_security_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("internet_security_enabled")
        return result

    @builtins.property
    def routing(self) -> typing.Optional[typing.List["VirtualHubConnectionRouting"]]:
        """routing block."""
        result = self._values.get("routing")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualHubConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def vitual_network_to_hub_gateways_traffic_allowed(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("vitual_network_to_hub_gateways_traffic_allowed")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubConnectionRouting",
    jsii_struct_bases=[],
    name_mapping={
        "associated_route_table_id": "associatedRouteTableId",
        "propagated_route_table": "propagatedRouteTable",
        "static_vnet_route": "staticVnetRoute",
    },
)
class VirtualHubConnectionRouting:
    def __init__(
        self,
        *,
        associated_route_table_id: typing.Optional[builtins.str] = None,
        propagated_route_table: typing.Optional[typing.List["VirtualHubConnectionRoutingPropagatedRouteTable"]] = None,
        static_vnet_route: typing.Optional[typing.List["VirtualHubConnectionRoutingStaticVnetRoute"]] = None,
    ) -> None:
        """
        :param associated_route_table_id: -
        :param propagated_route_table: propagated_route_table block.
        :param static_vnet_route: static_vnet_route block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if associated_route_table_id is not None:
            self._values["associated_route_table_id"] = associated_route_table_id
        if propagated_route_table is not None:
            self._values["propagated_route_table"] = propagated_route_table
        if static_vnet_route is not None:
            self._values["static_vnet_route"] = static_vnet_route

    @builtins.property
    def associated_route_table_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("associated_route_table_id")
        return result

    @builtins.property
    def propagated_route_table(
        self,
    ) -> typing.Optional[typing.List["VirtualHubConnectionRoutingPropagatedRouteTable"]]:
        """propagated_route_table block."""
        result = self._values.get("propagated_route_table")
        return result

    @builtins.property
    def static_vnet_route(
        self,
    ) -> typing.Optional[typing.List["VirtualHubConnectionRoutingStaticVnetRoute"]]:
        """static_vnet_route block."""
        result = self._values.get("static_vnet_route")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubConnectionRouting(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubConnectionRoutingPropagatedRouteTable",
    jsii_struct_bases=[],
    name_mapping={"labels": "labels", "route_table_ids": "routeTableIds"},
)
class VirtualHubConnectionRoutingPropagatedRouteTable:
    def __init__(
        self,
        *,
        labels: typing.Optional[typing.List[builtins.str]] = None,
        route_table_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param labels: -
        :param route_table_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if labels is not None:
            self._values["labels"] = labels
        if route_table_ids is not None:
            self._values["route_table_ids"] = route_table_ids

    @builtins.property
    def labels(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("labels")
        return result

    @builtins.property
    def route_table_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("route_table_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubConnectionRoutingPropagatedRouteTable(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubConnectionRoutingStaticVnetRoute",
    jsii_struct_bases=[],
    name_mapping={
        "address_prefixes": "addressPrefixes",
        "name": "name",
        "next_hop_ip_address": "nextHopIpAddress",
    },
)
class VirtualHubConnectionRoutingStaticVnetRoute:
    def __init__(
        self,
        *,
        address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
        name: typing.Optional[builtins.str] = None,
        next_hop_ip_address: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param address_prefixes: -
        :param name: -
        :param next_hop_ip_address: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if address_prefixes is not None:
            self._values["address_prefixes"] = address_prefixes
        if name is not None:
            self._values["name"] = name
        if next_hop_ip_address is not None:
            self._values["next_hop_ip_address"] = next_hop_ip_address

    @builtins.property
    def address_prefixes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("address_prefixes")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def next_hop_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("next_hop_ip_address")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubConnectionRoutingStaticVnetRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualHubConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualHubIp(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualHubIp",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        subnet_id: builtins.str,
        virtual_hub_id: builtins.str,
        private_ip_address: typing.Optional[builtins.str] = None,
        private_ip_allocation_method: typing.Optional[builtins.str] = None,
        public_ip_address_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["VirtualHubIpTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param subnet_id: -
        :param virtual_hub_id: -
        :param private_ip_address: -
        :param private_ip_allocation_method: -
        :param public_ip_address_id: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualHubIpConfig(
            name=name,
            subnet_id=subnet_id,
            virtual_hub_id=virtual_hub_id,
            private_ip_address=private_ip_address,
            private_ip_allocation_method=private_ip_allocation_method,
            public_ip_address_id=public_ip_address_id,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualHubIp, self, [scope, id, config])

    @jsii.member(jsii_name="resetPrivateIpAddress")
    def reset_private_ip_address(self) -> None:
        return jsii.invoke(self, "resetPrivateIpAddress", [])

    @jsii.member(jsii_name="resetPrivateIpAllocationMethod")
    def reset_private_ip_allocation_method(self) -> None:
        return jsii.invoke(self, "resetPrivateIpAllocationMethod", [])

    @jsii.member(jsii_name="resetPublicIpAddressId")
    def reset_public_ip_address_id(self) -> None:
        return jsii.invoke(self, "resetPublicIpAddressId", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetIdInput")
    def subnet_id_input(self) -> builtins.str:
        return jsii.get(self, "subnetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressInput")
    def private_ip_address_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "privateIpAddressInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAllocationMethodInput")
    def private_ip_allocation_method_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "privateIpAllocationMethodInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressIdInput")
    def public_ip_address_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "publicIpAddressIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualHubIpTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @private_ip_address.setter # type: ignore
    def private_ip_address(self, value: builtins.str) -> None:
        jsii.set(self, "privateIpAddress", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAllocationMethod")
    def private_ip_allocation_method(self) -> builtins.str:
        return jsii.get(self, "privateIpAllocationMethod")

    @private_ip_allocation_method.setter # type: ignore
    def private_ip_allocation_method(self, value: builtins.str) -> None:
        jsii.set(self, "privateIpAllocationMethod", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddressId")
    def public_ip_address_id(self) -> builtins.str:
        return jsii.get(self, "publicIpAddressId")

    @public_ip_address_id.setter # type: ignore
    def public_ip_address_id(self, value: builtins.str) -> None:
        jsii.set(self, "publicIpAddressId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetId")
    def subnet_id(self) -> builtins.str:
        return jsii.get(self, "subnetId")

    @subnet_id.setter # type: ignore
    def subnet_id(self, value: builtins.str) -> None:
        jsii.set(self, "subnetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualHubIpTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualHubIpTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualHubIpConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "subnet_id": "subnetId",
        "virtual_hub_id": "virtualHubId",
        "private_ip_address": "privateIpAddress",
        "private_ip_allocation_method": "privateIpAllocationMethod",
        "public_ip_address_id": "publicIpAddressId",
        "timeouts": "timeouts",
    },
)
class VirtualHubIpConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        subnet_id: builtins.str,
        virtual_hub_id: builtins.str,
        private_ip_address: typing.Optional[builtins.str] = None,
        private_ip_allocation_method: typing.Optional[builtins.str] = None,
        public_ip_address_id: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["VirtualHubIpTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param subnet_id: -
        :param virtual_hub_id: -
        :param private_ip_address: -
        :param private_ip_allocation_method: -
        :param public_ip_address_id: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualHubIpTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "subnet_id": subnet_id,
            "virtual_hub_id": virtual_hub_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if private_ip_address is not None:
            self._values["private_ip_address"] = private_ip_address
        if private_ip_allocation_method is not None:
            self._values["private_ip_allocation_method"] = private_ip_allocation_method
        if public_ip_address_id is not None:
            self._values["public_ip_address_id"] = public_ip_address_id
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def private_ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address")
        return result

    @builtins.property
    def private_ip_allocation_method(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_allocation_method")
        return result

    @builtins.property
    def public_ip_address_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_address_id")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualHubIpTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubIpConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubIpTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualHubIpTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubIpTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubRoute",
    jsii_struct_bases=[],
    name_mapping={
        "address_prefixes": "addressPrefixes",
        "next_hop_ip_address": "nextHopIpAddress",
    },
)
class VirtualHubRoute:
    def __init__(
        self,
        *,
        address_prefixes: typing.List[builtins.str],
        next_hop_ip_address: builtins.str,
    ) -> None:
        """
        :param address_prefixes: -
        :param next_hop_ip_address: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "address_prefixes": address_prefixes,
            "next_hop_ip_address": next_hop_ip_address,
        }

    @builtins.property
    def address_prefixes(self) -> typing.List[builtins.str]:
        result = self._values.get("address_prefixes")
        assert result is not None, "Required property 'address_prefixes' is missing"
        return result

    @builtins.property
    def next_hop_ip_address(self) -> builtins.str:
        result = self._values.get("next_hop_ip_address")
        assert result is not None, "Required property 'next_hop_ip_address' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualHubRouteTable(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualHubRouteTable",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        virtual_hub_id: builtins.str,
        labels: typing.Optional[typing.List[builtins.str]] = None,
        route: typing.Optional[typing.List["VirtualHubRouteTableRoute"]] = None,
        timeouts: typing.Optional["VirtualHubRouteTableTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param virtual_hub_id: -
        :param labels: -
        :param route: route block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualHubRouteTableConfig(
            name=name,
            virtual_hub_id=virtual_hub_id,
            labels=labels,
            route=route,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualHubRouteTable, self, [scope, id, config])

    @jsii.member(jsii_name="resetLabels")
    def reset_labels(self) -> None:
        return jsii.invoke(self, "resetLabels", [])

    @jsii.member(jsii_name="resetRoute")
    def reset_route(self) -> None:
        return jsii.invoke(self, "resetRoute", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labelsInput")
    def labels_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "labelsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routeInput")
    def route_input(self) -> typing.Optional[typing.List["VirtualHubRouteTableRoute"]]:
        return jsii.get(self, "routeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualHubRouteTableTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.List[builtins.str]:
        return jsii.get(self, "labels")

    @labels.setter # type: ignore
    def labels(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="route")
    def route(self) -> typing.List["VirtualHubRouteTableRoute"]:
        return jsii.get(self, "route")

    @route.setter # type: ignore
    def route(self, value: typing.List["VirtualHubRouteTableRoute"]) -> None:
        jsii.set(self, "route", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualHubRouteTableTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualHubRouteTableTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualHubRouteTableConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "virtual_hub_id": "virtualHubId",
        "labels": "labels",
        "route": "route",
        "timeouts": "timeouts",
    },
)
class VirtualHubRouteTableConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        virtual_hub_id: builtins.str,
        labels: typing.Optional[typing.List[builtins.str]] = None,
        route: typing.Optional[typing.List["VirtualHubRouteTableRoute"]] = None,
        timeouts: typing.Optional["VirtualHubRouteTableTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param virtual_hub_id: -
        :param labels: -
        :param route: route block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualHubRouteTableTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "virtual_hub_id": virtual_hub_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if labels is not None:
            self._values["labels"] = labels
        if route is not None:
            self._values["route"] = route
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def labels(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("labels")
        return result

    @builtins.property
    def route(self) -> typing.Optional[typing.List["VirtualHubRouteTableRoute"]]:
        """route block."""
        result = self._values.get("route")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualHubRouteTableTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubRouteTableConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubRouteTableRoute",
    jsii_struct_bases=[],
    name_mapping={
        "destinations": "destinations",
        "destinations_type": "destinationsType",
        "name": "name",
        "next_hop": "nextHop",
        "next_hop_type": "nextHopType",
    },
)
class VirtualHubRouteTableRoute:
    def __init__(
        self,
        *,
        destinations: typing.List[builtins.str],
        destinations_type: builtins.str,
        name: builtins.str,
        next_hop: builtins.str,
        next_hop_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param destinations: -
        :param destinations_type: -
        :param name: -
        :param next_hop: -
        :param next_hop_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "destinations": destinations,
            "destinations_type": destinations_type,
            "name": name,
            "next_hop": next_hop,
        }
        if next_hop_type is not None:
            self._values["next_hop_type"] = next_hop_type

    @builtins.property
    def destinations(self) -> typing.List[builtins.str]:
        result = self._values.get("destinations")
        assert result is not None, "Required property 'destinations' is missing"
        return result

    @builtins.property
    def destinations_type(self) -> builtins.str:
        result = self._values.get("destinations_type")
        assert result is not None, "Required property 'destinations_type' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def next_hop(self) -> builtins.str:
        result = self._values.get("next_hop")
        assert result is not None, "Required property 'next_hop' is missing"
        return result

    @builtins.property
    def next_hop_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("next_hop_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubRouteTableRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubRouteTableTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualHubRouteTableTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubRouteTableTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualHubSecurityPartnerProvider(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualHubSecurityPartnerProvider",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        security_provider_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualHubSecurityPartnerProviderTimeouts"] = None,
        virtual_hub_id: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param security_provider_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_hub_id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualHubSecurityPartnerProviderConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            security_provider_name=security_provider_name,
            tags=tags,
            timeouts=timeouts,
            virtual_hub_id=virtual_hub_id,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualHubSecurityPartnerProvider, self, [scope, id, config])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVirtualHubId")
    def reset_virtual_hub_id(self) -> None:
        return jsii.invoke(self, "resetVirtualHubId", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="securityProviderNameInput")
    def security_provider_name_input(self) -> builtins.str:
        return jsii.get(self, "securityProviderNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["VirtualHubSecurityPartnerProviderTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="securityProviderName")
    def security_provider_name(self) -> builtins.str:
        return jsii.get(self, "securityProviderName")

    @security_provider_name.setter # type: ignore
    def security_provider_name(self, value: builtins.str) -> None:
        jsii.set(self, "securityProviderName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualHubSecurityPartnerProviderTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualHubSecurityPartnerProviderTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualHubSecurityPartnerProviderConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "security_provider_name": "securityProviderName",
        "tags": "tags",
        "timeouts": "timeouts",
        "virtual_hub_id": "virtualHubId",
    },
)
class VirtualHubSecurityPartnerProviderConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        security_provider_name: builtins.str,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualHubSecurityPartnerProviderTimeouts"] = None,
        virtual_hub_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param security_provider_name: -
        :param tags: -
        :param timeouts: timeouts block.
        :param virtual_hub_id: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualHubSecurityPartnerProviderTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "security_provider_name": security_provider_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if virtual_hub_id is not None:
            self._values["virtual_hub_id"] = virtual_hub_id

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def security_provider_name(self) -> builtins.str:
        result = self._values.get("security_provider_name")
        assert result is not None, "Required property 'security_provider_name' is missing"
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualHubSecurityPartnerProviderTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def virtual_hub_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_hub_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubSecurityPartnerProviderConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubSecurityPartnerProviderTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualHubSecurityPartnerProviderTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubSecurityPartnerProviderTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualHubTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualHubTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualHubTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualMachine(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        network_interface_ids: typing.List[builtins.str],
        resource_group_name: builtins.str,
        storage_os_disk: typing.List["VirtualMachineStorageOsDisk"],
        vm_size: builtins.str,
        additional_capabilities: typing.Optional[typing.List["VirtualMachineAdditionalCapabilities"]] = None,
        availability_set_id: typing.Optional[builtins.str] = None,
        boot_diagnostics: typing.Optional[typing.List["VirtualMachineBootDiagnostics"]] = None,
        delete_data_disks_on_termination: typing.Optional[builtins.bool] = None,
        delete_os_disk_on_termination: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["VirtualMachineIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        os_profile: typing.Optional[typing.List["VirtualMachineOsProfile"]] = None,
        os_profile_linux_config: typing.Optional[typing.List["VirtualMachineOsProfileLinuxConfig"]] = None,
        os_profile_secrets: typing.Optional[typing.List["VirtualMachineOsProfileSecrets"]] = None,
        os_profile_windows_config: typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfig"]] = None,
        plan: typing.Optional[typing.List["VirtualMachinePlan"]] = None,
        primary_network_interface_id: typing.Optional[builtins.str] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        storage_data_disk: typing.Optional[typing.List["VirtualMachineStorageDataDisk"]] = None,
        storage_image_reference: typing.Optional[typing.List["VirtualMachineStorageImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualMachineTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param network_interface_ids: -
        :param resource_group_name: -
        :param storage_os_disk: storage_os_disk block.
        :param vm_size: -
        :param additional_capabilities: additional_capabilities block.
        :param availability_set_id: -
        :param boot_diagnostics: boot_diagnostics block.
        :param delete_data_disks_on_termination: -
        :param delete_os_disk_on_termination: -
        :param identity: identity block.
        :param license_type: -
        :param os_profile: os_profile block.
        :param os_profile_linux_config: os_profile_linux_config block.
        :param os_profile_secrets: os_profile_secrets block.
        :param os_profile_windows_config: os_profile_windows_config block.
        :param plan: plan block.
        :param primary_network_interface_id: -
        :param proximity_placement_group_id: -
        :param storage_data_disk: storage_data_disk block.
        :param storage_image_reference: storage_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualMachineConfig(
            location=location,
            name=name,
            network_interface_ids=network_interface_ids,
            resource_group_name=resource_group_name,
            storage_os_disk=storage_os_disk,
            vm_size=vm_size,
            additional_capabilities=additional_capabilities,
            availability_set_id=availability_set_id,
            boot_diagnostics=boot_diagnostics,
            delete_data_disks_on_termination=delete_data_disks_on_termination,
            delete_os_disk_on_termination=delete_os_disk_on_termination,
            identity=identity,
            license_type=license_type,
            os_profile=os_profile,
            os_profile_linux_config=os_profile_linux_config,
            os_profile_secrets=os_profile_secrets,
            os_profile_windows_config=os_profile_windows_config,
            plan=plan,
            primary_network_interface_id=primary_network_interface_id,
            proximity_placement_group_id=proximity_placement_group_id,
            storage_data_disk=storage_data_disk,
            storage_image_reference=storage_image_reference,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalCapabilities")
    def reset_additional_capabilities(self) -> None:
        return jsii.invoke(self, "resetAdditionalCapabilities", [])

    @jsii.member(jsii_name="resetAvailabilitySetId")
    def reset_availability_set_id(self) -> None:
        return jsii.invoke(self, "resetAvailabilitySetId", [])

    @jsii.member(jsii_name="resetBootDiagnostics")
    def reset_boot_diagnostics(self) -> None:
        return jsii.invoke(self, "resetBootDiagnostics", [])

    @jsii.member(jsii_name="resetDeleteDataDisksOnTermination")
    def reset_delete_data_disks_on_termination(self) -> None:
        return jsii.invoke(self, "resetDeleteDataDisksOnTermination", [])

    @jsii.member(jsii_name="resetDeleteOsDiskOnTermination")
    def reset_delete_os_disk_on_termination(self) -> None:
        return jsii.invoke(self, "resetDeleteOsDiskOnTermination", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetOsProfile")
    def reset_os_profile(self) -> None:
        return jsii.invoke(self, "resetOsProfile", [])

    @jsii.member(jsii_name="resetOsProfileLinuxConfig")
    def reset_os_profile_linux_config(self) -> None:
        return jsii.invoke(self, "resetOsProfileLinuxConfig", [])

    @jsii.member(jsii_name="resetOsProfileSecrets")
    def reset_os_profile_secrets(self) -> None:
        return jsii.invoke(self, "resetOsProfileSecrets", [])

    @jsii.member(jsii_name="resetOsProfileWindowsConfig")
    def reset_os_profile_windows_config(self) -> None:
        return jsii.invoke(self, "resetOsProfileWindowsConfig", [])

    @jsii.member(jsii_name="resetPlan")
    def reset_plan(self) -> None:
        return jsii.invoke(self, "resetPlan", [])

    @jsii.member(jsii_name="resetPrimaryNetworkInterfaceId")
    def reset_primary_network_interface_id(self) -> None:
        return jsii.invoke(self, "resetPrimaryNetworkInterfaceId", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetStorageDataDisk")
    def reset_storage_data_disk(self) -> None:
        return jsii.invoke(self, "resetStorageDataDisk", [])

    @jsii.member(jsii_name="resetStorageImageReference")
    def reset_storage_image_reference(self) -> None:
        return jsii.invoke(self, "resetStorageImageReference", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdsInput")
    def network_interface_ids_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "networkInterfaceIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageOsDiskInput")
    def storage_os_disk_input(self) -> typing.List["VirtualMachineStorageOsDisk"]:
        return jsii.get(self, "storageOsDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSizeInput")
    def vm_size_input(self) -> builtins.str:
        return jsii.get(self, "vmSizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilitiesInput")
    def additional_capabilities_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineAdditionalCapabilities"]]:
        return jsii.get(self, "additionalCapabilitiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilitySetIdInput")
    def availability_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "availabilitySetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnosticsInput")
    def boot_diagnostics_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineBootDiagnostics"]]:
        return jsii.get(self, "bootDiagnosticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deleteDataDisksOnTerminationInput")
    def delete_data_disks_on_termination_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "deleteDataDisksOnTerminationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deleteOsDiskOnTerminationInput")
    def delete_os_disk_on_termination_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "deleteOsDiskOnTerminationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(self) -> typing.Optional[typing.List["VirtualMachineIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileInput")
    def os_profile_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfile"]]:
        return jsii.get(self, "osProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileLinuxConfigInput")
    def os_profile_linux_config_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileLinuxConfig"]]:
        return jsii.get(self, "osProfileLinuxConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileSecretsInput")
    def os_profile_secrets_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileSecrets"]]:
        return jsii.get(self, "osProfileSecretsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileWindowsConfigInput")
    def os_profile_windows_config_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfig"]]:
        return jsii.get(self, "osProfileWindowsConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(self) -> typing.Optional[typing.List["VirtualMachinePlan"]]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryNetworkInterfaceIdInput")
    def primary_network_interface_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "primaryNetworkInterfaceIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageDataDiskInput")
    def storage_data_disk_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineStorageDataDisk"]]:
        return jsii.get(self, "storageDataDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageImageReferenceInput")
    def storage_image_reference_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineStorageImageReference"]]:
        return jsii.get(self, "storageImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilities")
    def additional_capabilities(
        self,
    ) -> typing.List["VirtualMachineAdditionalCapabilities"]:
        return jsii.get(self, "additionalCapabilities")

    @additional_capabilities.setter # type: ignore
    def additional_capabilities(
        self,
        value: typing.List["VirtualMachineAdditionalCapabilities"],
    ) -> None:
        jsii.set(self, "additionalCapabilities", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilitySetId")
    def availability_set_id(self) -> builtins.str:
        return jsii.get(self, "availabilitySetId")

    @availability_set_id.setter # type: ignore
    def availability_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "availabilitySetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnostics")
    def boot_diagnostics(self) -> typing.List["VirtualMachineBootDiagnostics"]:
        return jsii.get(self, "bootDiagnostics")

    @boot_diagnostics.setter # type: ignore
    def boot_diagnostics(
        self,
        value: typing.List["VirtualMachineBootDiagnostics"],
    ) -> None:
        jsii.set(self, "bootDiagnostics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deleteDataDisksOnTermination")
    def delete_data_disks_on_termination(self) -> builtins.bool:
        return jsii.get(self, "deleteDataDisksOnTermination")

    @delete_data_disks_on_termination.setter # type: ignore
    def delete_data_disks_on_termination(self, value: builtins.bool) -> None:
        jsii.set(self, "deleteDataDisksOnTermination", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deleteOsDiskOnTermination")
    def delete_os_disk_on_termination(self) -> builtins.bool:
        return jsii.get(self, "deleteOsDiskOnTermination")

    @delete_os_disk_on_termination.setter # type: ignore
    def delete_os_disk_on_termination(self, value: builtins.bool) -> None:
        jsii.set(self, "deleteOsDiskOnTermination", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["VirtualMachineIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["VirtualMachineIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIds")
    def network_interface_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "networkInterfaceIds")

    @network_interface_ids.setter # type: ignore
    def network_interface_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "networkInterfaceIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfile")
    def os_profile(self) -> typing.List["VirtualMachineOsProfile"]:
        return jsii.get(self, "osProfile")

    @os_profile.setter # type: ignore
    def os_profile(self, value: typing.List["VirtualMachineOsProfile"]) -> None:
        jsii.set(self, "osProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileLinuxConfig")
    def os_profile_linux_config(
        self,
    ) -> typing.List["VirtualMachineOsProfileLinuxConfig"]:
        return jsii.get(self, "osProfileLinuxConfig")

    @os_profile_linux_config.setter # type: ignore
    def os_profile_linux_config(
        self,
        value: typing.List["VirtualMachineOsProfileLinuxConfig"],
    ) -> None:
        jsii.set(self, "osProfileLinuxConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileSecrets")
    def os_profile_secrets(self) -> typing.List["VirtualMachineOsProfileSecrets"]:
        return jsii.get(self, "osProfileSecrets")

    @os_profile_secrets.setter # type: ignore
    def os_profile_secrets(
        self,
        value: typing.List["VirtualMachineOsProfileSecrets"],
    ) -> None:
        jsii.set(self, "osProfileSecrets", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileWindowsConfig")
    def os_profile_windows_config(
        self,
    ) -> typing.List["VirtualMachineOsProfileWindowsConfig"]:
        return jsii.get(self, "osProfileWindowsConfig")

    @os_profile_windows_config.setter # type: ignore
    def os_profile_windows_config(
        self,
        value: typing.List["VirtualMachineOsProfileWindowsConfig"],
    ) -> None:
        jsii.set(self, "osProfileWindowsConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["VirtualMachinePlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["VirtualMachinePlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="primaryNetworkInterfaceId")
    def primary_network_interface_id(self) -> builtins.str:
        return jsii.get(self, "primaryNetworkInterfaceId")

    @primary_network_interface_id.setter # type: ignore
    def primary_network_interface_id(self, value: builtins.str) -> None:
        jsii.set(self, "primaryNetworkInterfaceId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageDataDisk")
    def storage_data_disk(self) -> typing.List["VirtualMachineStorageDataDisk"]:
        return jsii.get(self, "storageDataDisk")

    @storage_data_disk.setter # type: ignore
    def storage_data_disk(
        self,
        value: typing.List["VirtualMachineStorageDataDisk"],
    ) -> None:
        jsii.set(self, "storageDataDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageImageReference")
    def storage_image_reference(
        self,
    ) -> typing.List["VirtualMachineStorageImageReference"]:
        return jsii.get(self, "storageImageReference")

    @storage_image_reference.setter # type: ignore
    def storage_image_reference(
        self,
        value: typing.List["VirtualMachineStorageImageReference"],
    ) -> None:
        jsii.set(self, "storageImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageOsDisk")
    def storage_os_disk(self) -> typing.List["VirtualMachineStorageOsDisk"]:
        return jsii.get(self, "storageOsDisk")

    @storage_os_disk.setter # type: ignore
    def storage_os_disk(
        self,
        value: typing.List["VirtualMachineStorageOsDisk"],
    ) -> None:
        jsii.set(self, "storageOsDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmSize")
    def vm_size(self) -> builtins.str:
        return jsii.get(self, "vmSize")

    @vm_size.setter # type: ignore
    def vm_size(self, value: builtins.str) -> None:
        jsii.set(self, "vmSize", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineAdditionalCapabilities",
    jsii_struct_bases=[],
    name_mapping={"ultra_ssd_enabled": "ultraSsdEnabled"},
)
class VirtualMachineAdditionalCapabilities:
    def __init__(self, *, ultra_ssd_enabled: builtins.bool) -> None:
        """
        :param ultra_ssd_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "ultra_ssd_enabled": ultra_ssd_enabled,
        }

    @builtins.property
    def ultra_ssd_enabled(self) -> builtins.bool:
        result = self._values.get("ultra_ssd_enabled")
        assert result is not None, "Required property 'ultra_ssd_enabled' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineAdditionalCapabilities(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineBootDiagnostics",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "storage_uri": "storageUri"},
)
class VirtualMachineBootDiagnostics:
    def __init__(self, *, enabled: builtins.bool, storage_uri: builtins.str) -> None:
        """
        :param enabled: -
        :param storage_uri: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
            "storage_uri": storage_uri,
        }

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def storage_uri(self) -> builtins.str:
        result = self._values.get("storage_uri")
        assert result is not None, "Required property 'storage_uri' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineBootDiagnostics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "network_interface_ids": "networkInterfaceIds",
        "resource_group_name": "resourceGroupName",
        "storage_os_disk": "storageOsDisk",
        "vm_size": "vmSize",
        "additional_capabilities": "additionalCapabilities",
        "availability_set_id": "availabilitySetId",
        "boot_diagnostics": "bootDiagnostics",
        "delete_data_disks_on_termination": "deleteDataDisksOnTermination",
        "delete_os_disk_on_termination": "deleteOsDiskOnTermination",
        "identity": "identity",
        "license_type": "licenseType",
        "os_profile": "osProfile",
        "os_profile_linux_config": "osProfileLinuxConfig",
        "os_profile_secrets": "osProfileSecrets",
        "os_profile_windows_config": "osProfileWindowsConfig",
        "plan": "plan",
        "primary_network_interface_id": "primaryNetworkInterfaceId",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "storage_data_disk": "storageDataDisk",
        "storage_image_reference": "storageImageReference",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class VirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        network_interface_ids: typing.List[builtins.str],
        resource_group_name: builtins.str,
        storage_os_disk: typing.List["VirtualMachineStorageOsDisk"],
        vm_size: builtins.str,
        additional_capabilities: typing.Optional[typing.List[VirtualMachineAdditionalCapabilities]] = None,
        availability_set_id: typing.Optional[builtins.str] = None,
        boot_diagnostics: typing.Optional[typing.List[VirtualMachineBootDiagnostics]] = None,
        delete_data_disks_on_termination: typing.Optional[builtins.bool] = None,
        delete_os_disk_on_termination: typing.Optional[builtins.bool] = None,
        identity: typing.Optional[typing.List["VirtualMachineIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        os_profile: typing.Optional[typing.List["VirtualMachineOsProfile"]] = None,
        os_profile_linux_config: typing.Optional[typing.List["VirtualMachineOsProfileLinuxConfig"]] = None,
        os_profile_secrets: typing.Optional[typing.List["VirtualMachineOsProfileSecrets"]] = None,
        os_profile_windows_config: typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfig"]] = None,
        plan: typing.Optional[typing.List["VirtualMachinePlan"]] = None,
        primary_network_interface_id: typing.Optional[builtins.str] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        storage_data_disk: typing.Optional[typing.List["VirtualMachineStorageDataDisk"]] = None,
        storage_image_reference: typing.Optional[typing.List["VirtualMachineStorageImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualMachineTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param network_interface_ids: -
        :param resource_group_name: -
        :param storage_os_disk: storage_os_disk block.
        :param vm_size: -
        :param additional_capabilities: additional_capabilities block.
        :param availability_set_id: -
        :param boot_diagnostics: boot_diagnostics block.
        :param delete_data_disks_on_termination: -
        :param delete_os_disk_on_termination: -
        :param identity: identity block.
        :param license_type: -
        :param os_profile: os_profile block.
        :param os_profile_linux_config: os_profile_linux_config block.
        :param os_profile_secrets: os_profile_secrets block.
        :param os_profile_windows_config: os_profile_windows_config block.
        :param plan: plan block.
        :param primary_network_interface_id: -
        :param proximity_placement_group_id: -
        :param storage_data_disk: storage_data_disk block.
        :param storage_image_reference: storage_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "network_interface_ids": network_interface_ids,
            "resource_group_name": resource_group_name,
            "storage_os_disk": storage_os_disk,
            "vm_size": vm_size,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_capabilities is not None:
            self._values["additional_capabilities"] = additional_capabilities
        if availability_set_id is not None:
            self._values["availability_set_id"] = availability_set_id
        if boot_diagnostics is not None:
            self._values["boot_diagnostics"] = boot_diagnostics
        if delete_data_disks_on_termination is not None:
            self._values["delete_data_disks_on_termination"] = delete_data_disks_on_termination
        if delete_os_disk_on_termination is not None:
            self._values["delete_os_disk_on_termination"] = delete_os_disk_on_termination
        if identity is not None:
            self._values["identity"] = identity
        if license_type is not None:
            self._values["license_type"] = license_type
        if os_profile is not None:
            self._values["os_profile"] = os_profile
        if os_profile_linux_config is not None:
            self._values["os_profile_linux_config"] = os_profile_linux_config
        if os_profile_secrets is not None:
            self._values["os_profile_secrets"] = os_profile_secrets
        if os_profile_windows_config is not None:
            self._values["os_profile_windows_config"] = os_profile_windows_config
        if plan is not None:
            self._values["plan"] = plan
        if primary_network_interface_id is not None:
            self._values["primary_network_interface_id"] = primary_network_interface_id
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if storage_data_disk is not None:
            self._values["storage_data_disk"] = storage_data_disk
        if storage_image_reference is not None:
            self._values["storage_image_reference"] = storage_image_reference
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_interface_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("network_interface_ids")
        assert result is not None, "Required property 'network_interface_ids' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def storage_os_disk(self) -> typing.List["VirtualMachineStorageOsDisk"]:
        """storage_os_disk block."""
        result = self._values.get("storage_os_disk")
        assert result is not None, "Required property 'storage_os_disk' is missing"
        return result

    @builtins.property
    def vm_size(self) -> builtins.str:
        result = self._values.get("vm_size")
        assert result is not None, "Required property 'vm_size' is missing"
        return result

    @builtins.property
    def additional_capabilities(
        self,
    ) -> typing.Optional[typing.List[VirtualMachineAdditionalCapabilities]]:
        """additional_capabilities block."""
        result = self._values.get("additional_capabilities")
        return result

    @builtins.property
    def availability_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("availability_set_id")
        return result

    @builtins.property
    def boot_diagnostics(
        self,
    ) -> typing.Optional[typing.List[VirtualMachineBootDiagnostics]]:
        """boot_diagnostics block."""
        result = self._values.get("boot_diagnostics")
        return result

    @builtins.property
    def delete_data_disks_on_termination(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("delete_data_disks_on_termination")
        return result

    @builtins.property
    def delete_os_disk_on_termination(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("delete_os_disk_on_termination")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["VirtualMachineIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def os_profile(self) -> typing.Optional[typing.List["VirtualMachineOsProfile"]]:
        """os_profile block."""
        result = self._values.get("os_profile")
        return result

    @builtins.property
    def os_profile_linux_config(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileLinuxConfig"]]:
        """os_profile_linux_config block."""
        result = self._values.get("os_profile_linux_config")
        return result

    @builtins.property
    def os_profile_secrets(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileSecrets"]]:
        """os_profile_secrets block."""
        result = self._values.get("os_profile_secrets")
        return result

    @builtins.property
    def os_profile_windows_config(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfig"]]:
        """os_profile_windows_config block."""
        result = self._values.get("os_profile_windows_config")
        return result

    @builtins.property
    def plan(self) -> typing.Optional[typing.List["VirtualMachinePlan"]]:
        """plan block."""
        result = self._values.get("plan")
        return result

    @builtins.property
    def primary_network_interface_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("primary_network_interface_id")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def storage_data_disk(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineStorageDataDisk"]]:
        """storage_data_disk block."""
        result = self._values.get("storage_data_disk")
        return result

    @builtins.property
    def storage_image_reference(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineStorageImageReference"]]:
        """storage_image_reference block."""
        result = self._values.get("storage_image_reference")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualMachineDataDiskAttachment(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualMachineDataDiskAttachment",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        caching: builtins.str,
        lun: jsii.Number,
        managed_disk_id: builtins.str,
        virtual_machine_id: builtins.str,
        create_option: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["VirtualMachineDataDiskAttachmentTimeouts"] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param caching: -
        :param lun: -
        :param managed_disk_id: -
        :param virtual_machine_id: -
        :param create_option: -
        :param timeouts: timeouts block.
        :param write_accelerator_enabled: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualMachineDataDiskAttachmentConfig(
            caching=caching,
            lun=lun,
            managed_disk_id=managed_disk_id,
            virtual_machine_id=virtual_machine_id,
            create_option=create_option,
            timeouts=timeouts,
            write_accelerator_enabled=write_accelerator_enabled,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualMachineDataDiskAttachment, self, [scope, id, config])

    @jsii.member(jsii_name="resetCreateOption")
    def reset_create_option(self) -> None:
        return jsii.invoke(self, "resetCreateOption", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetWriteAcceleratorEnabled")
    def reset_write_accelerator_enabled(self) -> None:
        return jsii.invoke(self, "resetWriteAcceleratorEnabled", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="cachingInput")
    def caching_input(self) -> builtins.str:
        return jsii.get(self, "cachingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lunInput")
    def lun_input(self) -> jsii.Number:
        return jsii.get(self, "lunInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDiskIdInput")
    def managed_disk_id_input(self) -> builtins.str:
        return jsii.get(self, "managedDiskIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineIdInput")
    def virtual_machine_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualMachineIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createOptionInput")
    def create_option_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "createOptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["VirtualMachineDataDiskAttachmentTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="writeAcceleratorEnabledInput")
    def write_accelerator_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "writeAcceleratorEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="caching")
    def caching(self) -> builtins.str:
        return jsii.get(self, "caching")

    @caching.setter # type: ignore
    def caching(self, value: builtins.str) -> None:
        jsii.set(self, "caching", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="createOption")
    def create_option(self) -> builtins.str:
        return jsii.get(self, "createOption")

    @create_option.setter # type: ignore
    def create_option(self, value: builtins.str) -> None:
        jsii.set(self, "createOption", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="lun")
    def lun(self) -> jsii.Number:
        return jsii.get(self, "lun")

    @lun.setter # type: ignore
    def lun(self, value: jsii.Number) -> None:
        jsii.set(self, "lun", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedDiskId")
    def managed_disk_id(self) -> builtins.str:
        return jsii.get(self, "managedDiskId")

    @managed_disk_id.setter # type: ignore
    def managed_disk_id(self, value: builtins.str) -> None:
        jsii.set(self, "managedDiskId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualMachineDataDiskAttachmentTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualMachineDataDiskAttachmentTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @virtual_machine_id.setter # type: ignore
    def virtual_machine_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="writeAcceleratorEnabled")
    def write_accelerator_enabled(self) -> builtins.bool:
        return jsii.get(self, "writeAcceleratorEnabled")

    @write_accelerator_enabled.setter # type: ignore
    def write_accelerator_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "writeAcceleratorEnabled", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineDataDiskAttachmentConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "caching": "caching",
        "lun": "lun",
        "managed_disk_id": "managedDiskId",
        "virtual_machine_id": "virtualMachineId",
        "create_option": "createOption",
        "timeouts": "timeouts",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class VirtualMachineDataDiskAttachmentConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        caching: builtins.str,
        lun: jsii.Number,
        managed_disk_id: builtins.str,
        virtual_machine_id: builtins.str,
        create_option: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["VirtualMachineDataDiskAttachmentTimeouts"] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param caching: -
        :param lun: -
        :param managed_disk_id: -
        :param virtual_machine_id: -
        :param create_option: -
        :param timeouts: timeouts block.
        :param write_accelerator_enabled: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualMachineDataDiskAttachmentTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "caching": caching,
            "lun": lun,
            "managed_disk_id": managed_disk_id,
            "virtual_machine_id": virtual_machine_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if create_option is not None:
            self._values["create_option"] = create_option
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def caching(self) -> builtins.str:
        result = self._values.get("caching")
        assert result is not None, "Required property 'caching' is missing"
        return result

    @builtins.property
    def lun(self) -> jsii.Number:
        result = self._values.get("lun")
        assert result is not None, "Required property 'lun' is missing"
        return result

    @builtins.property
    def managed_disk_id(self) -> builtins.str:
        result = self._values.get("managed_disk_id")
        assert result is not None, "Required property 'managed_disk_id' is missing"
        return result

    @builtins.property
    def virtual_machine_id(self) -> builtins.str:
        result = self._values.get("virtual_machine_id")
        assert result is not None, "Required property 'virtual_machine_id' is missing"
        return result

    @builtins.property
    def create_option(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_option")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualMachineDataDiskAttachmentTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineDataDiskAttachmentConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineDataDiskAttachmentTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualMachineDataDiskAttachmentTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineDataDiskAttachmentTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualMachineExtension(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualMachineExtension",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        publisher: builtins.str,
        type: builtins.str,
        type_handler_version: builtins.str,
        virtual_machine_id: builtins.str,
        auto_upgrade_minor_version: typing.Optional[builtins.bool] = None,
        protected_settings: typing.Optional[builtins.str] = None,
        settings: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualMachineExtensionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param publisher: -
        :param type: -
        :param type_handler_version: -
        :param virtual_machine_id: -
        :param auto_upgrade_minor_version: -
        :param protected_settings: -
        :param settings: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualMachineExtensionConfig(
            name=name,
            publisher=publisher,
            type=type,
            type_handler_version=type_handler_version,
            virtual_machine_id=virtual_machine_id,
            auto_upgrade_minor_version=auto_upgrade_minor_version,
            protected_settings=protected_settings,
            settings=settings,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualMachineExtension, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoUpgradeMinorVersion")
    def reset_auto_upgrade_minor_version(self) -> None:
        return jsii.invoke(self, "resetAutoUpgradeMinorVersion", [])

    @jsii.member(jsii_name="resetProtectedSettings")
    def reset_protected_settings(self) -> None:
        return jsii.invoke(self, "resetProtectedSettings", [])

    @jsii.member(jsii_name="resetSettings")
    def reset_settings(self) -> None:
        return jsii.invoke(self, "resetSettings", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherInput")
    def publisher_input(self) -> builtins.str:
        return jsii.get(self, "publisherInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeHandlerVersionInput")
    def type_handler_version_input(self) -> builtins.str:
        return jsii.get(self, "typeHandlerVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineIdInput")
    def virtual_machine_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualMachineIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoUpgradeMinorVersionInput")
    def auto_upgrade_minor_version_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoUpgradeMinorVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protectedSettingsInput")
    def protected_settings_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "protectedSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="settingsInput")
    def settings_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "settingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualMachineExtensionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoUpgradeMinorVersion")
    def auto_upgrade_minor_version(self) -> builtins.bool:
        return jsii.get(self, "autoUpgradeMinorVersion")

    @auto_upgrade_minor_version.setter # type: ignore
    def auto_upgrade_minor_version(self, value: builtins.bool) -> None:
        jsii.set(self, "autoUpgradeMinorVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protectedSettings")
    def protected_settings(self) -> builtins.str:
        return jsii.get(self, "protectedSettings")

    @protected_settings.setter # type: ignore
    def protected_settings(self, value: builtins.str) -> None:
        jsii.set(self, "protectedSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisher")
    def publisher(self) -> builtins.str:
        return jsii.get(self, "publisher")

    @publisher.setter # type: ignore
    def publisher(self, value: builtins.str) -> None:
        jsii.set(self, "publisher", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="settings")
    def settings(self) -> builtins.str:
        return jsii.get(self, "settings")

    @settings.setter # type: ignore
    def settings(self, value: builtins.str) -> None:
        jsii.set(self, "settings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualMachineExtensionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualMachineExtensionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeHandlerVersion")
    def type_handler_version(self) -> builtins.str:
        return jsii.get(self, "typeHandlerVersion")

    @type_handler_version.setter # type: ignore
    def type_handler_version(self, value: builtins.str) -> None:
        jsii.set(self, "typeHandlerVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @virtual_machine_id.setter # type: ignore
    def virtual_machine_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineExtensionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "publisher": "publisher",
        "type": "type",
        "type_handler_version": "typeHandlerVersion",
        "virtual_machine_id": "virtualMachineId",
        "auto_upgrade_minor_version": "autoUpgradeMinorVersion",
        "protected_settings": "protectedSettings",
        "settings": "settings",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class VirtualMachineExtensionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        publisher: builtins.str,
        type: builtins.str,
        type_handler_version: builtins.str,
        virtual_machine_id: builtins.str,
        auto_upgrade_minor_version: typing.Optional[builtins.bool] = None,
        protected_settings: typing.Optional[builtins.str] = None,
        settings: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualMachineExtensionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param publisher: -
        :param type: -
        :param type_handler_version: -
        :param virtual_machine_id: -
        :param auto_upgrade_minor_version: -
        :param protected_settings: -
        :param settings: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualMachineExtensionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "publisher": publisher,
            "type": type,
            "type_handler_version": type_handler_version,
            "virtual_machine_id": virtual_machine_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_upgrade_minor_version is not None:
            self._values["auto_upgrade_minor_version"] = auto_upgrade_minor_version
        if protected_settings is not None:
            self._values["protected_settings"] = protected_settings
        if settings is not None:
            self._values["settings"] = settings
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def type_handler_version(self) -> builtins.str:
        result = self._values.get("type_handler_version")
        assert result is not None, "Required property 'type_handler_version' is missing"
        return result

    @builtins.property
    def virtual_machine_id(self) -> builtins.str:
        result = self._values.get("virtual_machine_id")
        assert result is not None, "Required property 'virtual_machine_id' is missing"
        return result

    @builtins.property
    def auto_upgrade_minor_version(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_upgrade_minor_version")
        return result

    @builtins.property
    def protected_settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protected_settings")
        return result

    @builtins.property
    def settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("settings")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualMachineExtensionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineExtensionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineExtensionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualMachineExtensionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineExtensionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class VirtualMachineIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfile",
    jsii_struct_bases=[],
    name_mapping={
        "admin_username": "adminUsername",
        "computer_name": "computerName",
        "admin_password": "adminPassword",
        "custom_data": "customData",
    },
)
class VirtualMachineOsProfile:
    def __init__(
        self,
        *,
        admin_username: builtins.str,
        computer_name: builtins.str,
        admin_password: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param admin_username: -
        :param computer_name: -
        :param admin_password: -
        :param custom_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "admin_username": admin_username,
            "computer_name": computer_name,
        }
        if admin_password is not None:
            self._values["admin_password"] = admin_password
        if custom_data is not None:
            self._values["custom_data"] = custom_data

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def computer_name(self) -> builtins.str:
        result = self._values.get("computer_name")
        assert result is not None, "Required property 'computer_name' is missing"
        return result

    @builtins.property
    def admin_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("admin_password")
        return result

    @builtins.property
    def custom_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_data")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfileLinuxConfig",
    jsii_struct_bases=[],
    name_mapping={
        "disable_password_authentication": "disablePasswordAuthentication",
        "ssh_keys": "sshKeys",
    },
)
class VirtualMachineOsProfileLinuxConfig:
    def __init__(
        self,
        *,
        disable_password_authentication: builtins.bool,
        ssh_keys: typing.Optional[typing.List["VirtualMachineOsProfileLinuxConfigSshKeys"]] = None,
    ) -> None:
        """
        :param disable_password_authentication: -
        :param ssh_keys: ssh_keys block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "disable_password_authentication": disable_password_authentication,
        }
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys

    @builtins.property
    def disable_password_authentication(self) -> builtins.bool:
        result = self._values.get("disable_password_authentication")
        assert result is not None, "Required property 'disable_password_authentication' is missing"
        return result

    @builtins.property
    def ssh_keys(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileLinuxConfigSshKeys"]]:
        """ssh_keys block."""
        result = self._values.get("ssh_keys")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfileLinuxConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfileLinuxConfigSshKeys",
    jsii_struct_bases=[],
    name_mapping={"key_data": "keyData", "path": "path"},
)
class VirtualMachineOsProfileLinuxConfigSshKeys:
    def __init__(self, *, key_data: builtins.str, path: builtins.str) -> None:
        """
        :param key_data: -
        :param path: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "key_data": key_data,
            "path": path,
        }

    @builtins.property
    def key_data(self) -> builtins.str:
        result = self._values.get("key_data")
        assert result is not None, "Required property 'key_data' is missing"
        return result

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfileLinuxConfigSshKeys(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfileSecrets",
    jsii_struct_bases=[],
    name_mapping={
        "source_vault_id": "sourceVaultId",
        "vault_certificates": "vaultCertificates",
    },
)
class VirtualMachineOsProfileSecrets:
    def __init__(
        self,
        *,
        source_vault_id: builtins.str,
        vault_certificates: typing.Optional[typing.List["VirtualMachineOsProfileSecretsVaultCertificates"]] = None,
    ) -> None:
        """
        :param source_vault_id: -
        :param vault_certificates: vault_certificates block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "source_vault_id": source_vault_id,
        }
        if vault_certificates is not None:
            self._values["vault_certificates"] = vault_certificates

    @builtins.property
    def source_vault_id(self) -> builtins.str:
        result = self._values.get("source_vault_id")
        assert result is not None, "Required property 'source_vault_id' is missing"
        return result

    @builtins.property
    def vault_certificates(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileSecretsVaultCertificates"]]:
        """vault_certificates block."""
        result = self._values.get("vault_certificates")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfileSecrets(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfileSecretsVaultCertificates",
    jsii_struct_bases=[],
    name_mapping={
        "certificate_url": "certificateUrl",
        "certificate_store": "certificateStore",
    },
)
class VirtualMachineOsProfileSecretsVaultCertificates:
    def __init__(
        self,
        *,
        certificate_url: builtins.str,
        certificate_store: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param certificate_url: -
        :param certificate_store: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate_url": certificate_url,
        }
        if certificate_store is not None:
            self._values["certificate_store"] = certificate_store

    @builtins.property
    def certificate_url(self) -> builtins.str:
        result = self._values.get("certificate_url")
        assert result is not None, "Required property 'certificate_url' is missing"
        return result

    @builtins.property
    def certificate_store(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_store")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfileSecretsVaultCertificates(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfileWindowsConfig",
    jsii_struct_bases=[],
    name_mapping={
        "additional_unattend_config": "additionalUnattendConfig",
        "enable_automatic_upgrades": "enableAutomaticUpgrades",
        "provision_vm_agent": "provisionVmAgent",
        "timezone": "timezone",
        "winrm": "winrm",
    },
)
class VirtualMachineOsProfileWindowsConfig:
    def __init__(
        self,
        *,
        additional_unattend_config: typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfigAdditionalUnattendConfig"]] = None,
        enable_automatic_upgrades: typing.Optional[builtins.bool] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        timezone: typing.Optional[builtins.str] = None,
        winrm: typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfigWinrm"]] = None,
    ) -> None:
        """
        :param additional_unattend_config: additional_unattend_config block.
        :param enable_automatic_upgrades: -
        :param provision_vm_agent: -
        :param timezone: -
        :param winrm: winrm block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if additional_unattend_config is not None:
            self._values["additional_unattend_config"] = additional_unattend_config
        if enable_automatic_upgrades is not None:
            self._values["enable_automatic_upgrades"] = enable_automatic_upgrades
        if provision_vm_agent is not None:
            self._values["provision_vm_agent"] = provision_vm_agent
        if timezone is not None:
            self._values["timezone"] = timezone
        if winrm is not None:
            self._values["winrm"] = winrm

    @builtins.property
    def additional_unattend_config(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfigAdditionalUnattendConfig"]]:
        """additional_unattend_config block."""
        result = self._values.get("additional_unattend_config")
        return result

    @builtins.property
    def enable_automatic_upgrades(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_automatic_upgrades")
        return result

    @builtins.property
    def provision_vm_agent(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("provision_vm_agent")
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    @builtins.property
    def winrm(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineOsProfileWindowsConfigWinrm"]]:
        """winrm block."""
        result = self._values.get("winrm")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfileWindowsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfileWindowsConfigAdditionalUnattendConfig",
    jsii_struct_bases=[],
    name_mapping={
        "component": "component",
        "content": "content",
        "pass_": "pass",
        "setting_name": "settingName",
    },
)
class VirtualMachineOsProfileWindowsConfigAdditionalUnattendConfig:
    def __init__(
        self,
        *,
        component: builtins.str,
        content: builtins.str,
        pass_: builtins.str,
        setting_name: builtins.str,
    ) -> None:
        """
        :param component: -
        :param content: -
        :param pass_: -
        :param setting_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "component": component,
            "content": content,
            "pass_": pass_,
            "setting_name": setting_name,
        }

    @builtins.property
    def component(self) -> builtins.str:
        result = self._values.get("component")
        assert result is not None, "Required property 'component' is missing"
        return result

    @builtins.property
    def content(self) -> builtins.str:
        result = self._values.get("content")
        assert result is not None, "Required property 'content' is missing"
        return result

    @builtins.property
    def pass_(self) -> builtins.str:
        result = self._values.get("pass_")
        assert result is not None, "Required property 'pass_' is missing"
        return result

    @builtins.property
    def setting_name(self) -> builtins.str:
        result = self._values.get("setting_name")
        assert result is not None, "Required property 'setting_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfileWindowsConfigAdditionalUnattendConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineOsProfileWindowsConfigWinrm",
    jsii_struct_bases=[],
    name_mapping={"protocol": "protocol", "certificate_url": "certificateUrl"},
)
class VirtualMachineOsProfileWindowsConfigWinrm:
    def __init__(
        self,
        *,
        protocol: builtins.str,
        certificate_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param protocol: -
        :param certificate_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "protocol": protocol,
        }
        if certificate_url is not None:
            self._values["certificate_url"] = certificate_url

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def certificate_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineOsProfileWindowsConfigWinrm(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachinePlan",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "product": "product", "publisher": "publisher"},
)
class VirtualMachinePlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: builtins.str,
        publisher: builtins.str,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "product": product,
            "publisher": publisher,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachinePlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualMachineScaleSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualMachineScaleSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        network_profile: typing.List["VirtualMachineScaleSetNetworkProfile"],
        os_profile: typing.List["VirtualMachineScaleSetOsProfile"],
        resource_group_name: builtins.str,
        sku: typing.List["VirtualMachineScaleSetSku"],
        storage_profile_os_disk: typing.List["VirtualMachineScaleSetStorageProfileOsDisk"],
        upgrade_policy_mode: builtins.str,
        automatic_os_upgrade: typing.Optional[builtins.bool] = None,
        boot_diagnostics: typing.Optional[typing.List["VirtualMachineScaleSetBootDiagnostics"]] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extension: typing.Optional[typing.List["VirtualMachineScaleSetExtension"]] = None,
        health_probe_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["VirtualMachineScaleSetIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        os_profile_linux_config: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileLinuxConfig"]] = None,
        os_profile_secrets: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileSecrets"]] = None,
        os_profile_windows_config: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfig"]] = None,
        overprovision: typing.Optional[builtins.bool] = None,
        plan: typing.Optional[typing.List["VirtualMachineScaleSetPlan"]] = None,
        priority: typing.Optional[builtins.str] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        rolling_upgrade_policy: typing.Optional[typing.List["VirtualMachineScaleSetRollingUpgradePolicy"]] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        storage_profile_data_disk: typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileDataDisk"]] = None,
        storage_profile_image_reference: typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualMachineScaleSetTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param network_profile: network_profile block.
        :param os_profile: os_profile block.
        :param resource_group_name: -
        :param sku: sku block.
        :param storage_profile_os_disk: storage_profile_os_disk block.
        :param upgrade_policy_mode: -
        :param automatic_os_upgrade: -
        :param boot_diagnostics: boot_diagnostics block.
        :param eviction_policy: -
        :param extension: extension block.
        :param health_probe_id: -
        :param identity: identity block.
        :param license_type: -
        :param os_profile_linux_config: os_profile_linux_config block.
        :param os_profile_secrets: os_profile_secrets block.
        :param os_profile_windows_config: os_profile_windows_config block.
        :param overprovision: -
        :param plan: plan block.
        :param priority: -
        :param proximity_placement_group_id: -
        :param rolling_upgrade_policy: rolling_upgrade_policy block.
        :param single_placement_group: -
        :param storage_profile_data_disk: storage_profile_data_disk block.
        :param storage_profile_image_reference: storage_profile_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualMachineScaleSetConfig(
            location=location,
            name=name,
            network_profile=network_profile,
            os_profile=os_profile,
            resource_group_name=resource_group_name,
            sku=sku,
            storage_profile_os_disk=storage_profile_os_disk,
            upgrade_policy_mode=upgrade_policy_mode,
            automatic_os_upgrade=automatic_os_upgrade,
            boot_diagnostics=boot_diagnostics,
            eviction_policy=eviction_policy,
            extension=extension,
            health_probe_id=health_probe_id,
            identity=identity,
            license_type=license_type,
            os_profile_linux_config=os_profile_linux_config,
            os_profile_secrets=os_profile_secrets,
            os_profile_windows_config=os_profile_windows_config,
            overprovision=overprovision,
            plan=plan,
            priority=priority,
            proximity_placement_group_id=proximity_placement_group_id,
            rolling_upgrade_policy=rolling_upgrade_policy,
            single_placement_group=single_placement_group,
            storage_profile_data_disk=storage_profile_data_disk,
            storage_profile_image_reference=storage_profile_image_reference,
            tags=tags,
            timeouts=timeouts,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualMachineScaleSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutomaticOsUpgrade")
    def reset_automatic_os_upgrade(self) -> None:
        return jsii.invoke(self, "resetAutomaticOsUpgrade", [])

    @jsii.member(jsii_name="resetBootDiagnostics")
    def reset_boot_diagnostics(self) -> None:
        return jsii.invoke(self, "resetBootDiagnostics", [])

    @jsii.member(jsii_name="resetEvictionPolicy")
    def reset_eviction_policy(self) -> None:
        return jsii.invoke(self, "resetEvictionPolicy", [])

    @jsii.member(jsii_name="resetExtension")
    def reset_extension(self) -> None:
        return jsii.invoke(self, "resetExtension", [])

    @jsii.member(jsii_name="resetHealthProbeId")
    def reset_health_probe_id(self) -> None:
        return jsii.invoke(self, "resetHealthProbeId", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetOsProfileLinuxConfig")
    def reset_os_profile_linux_config(self) -> None:
        return jsii.invoke(self, "resetOsProfileLinuxConfig", [])

    @jsii.member(jsii_name="resetOsProfileSecrets")
    def reset_os_profile_secrets(self) -> None:
        return jsii.invoke(self, "resetOsProfileSecrets", [])

    @jsii.member(jsii_name="resetOsProfileWindowsConfig")
    def reset_os_profile_windows_config(self) -> None:
        return jsii.invoke(self, "resetOsProfileWindowsConfig", [])

    @jsii.member(jsii_name="resetOverprovision")
    def reset_overprovision(self) -> None:
        return jsii.invoke(self, "resetOverprovision", [])

    @jsii.member(jsii_name="resetPlan")
    def reset_plan(self) -> None:
        return jsii.invoke(self, "resetPlan", [])

    @jsii.member(jsii_name="resetPriority")
    def reset_priority(self) -> None:
        return jsii.invoke(self, "resetPriority", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetRollingUpgradePolicy")
    def reset_rolling_upgrade_policy(self) -> None:
        return jsii.invoke(self, "resetRollingUpgradePolicy", [])

    @jsii.member(jsii_name="resetSinglePlacementGroup")
    def reset_single_placement_group(self) -> None:
        return jsii.invoke(self, "resetSinglePlacementGroup", [])

    @jsii.member(jsii_name="resetStorageProfileDataDisk")
    def reset_storage_profile_data_disk(self) -> None:
        return jsii.invoke(self, "resetStorageProfileDataDisk", [])

    @jsii.member(jsii_name="resetStorageProfileImageReference")
    def reset_storage_profile_image_reference(self) -> None:
        return jsii.invoke(self, "resetStorageProfileImageReference", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfileInput")
    def network_profile_input(
        self,
    ) -> typing.List["VirtualMachineScaleSetNetworkProfile"]:
        return jsii.get(self, "networkProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileInput")
    def os_profile_input(self) -> typing.List["VirtualMachineScaleSetOsProfile"]:
        return jsii.get(self, "osProfileInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> typing.List["VirtualMachineScaleSetSku"]:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileOsDiskInput")
    def storage_profile_os_disk_input(
        self,
    ) -> typing.List["VirtualMachineScaleSetStorageProfileOsDisk"]:
        return jsii.get(self, "storageProfileOsDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradePolicyModeInput")
    def upgrade_policy_mode_input(self) -> builtins.str:
        return jsii.get(self, "upgradePolicyModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticOsUpgradeInput")
    def automatic_os_upgrade_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "automaticOsUpgradeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnosticsInput")
    def boot_diagnostics_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetBootDiagnostics"]]:
        return jsii.get(self, "bootDiagnosticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicyInput")
    def eviction_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "evictionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extensionInput")
    def extension_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetExtension"]]:
        return jsii.get(self, "extensionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthProbeIdInput")
    def health_probe_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "healthProbeIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileLinuxConfigInput")
    def os_profile_linux_config_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileLinuxConfig"]]:
        return jsii.get(self, "osProfileLinuxConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileSecretsInput")
    def os_profile_secrets_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileSecrets"]]:
        return jsii.get(self, "osProfileSecretsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileWindowsConfigInput")
    def os_profile_windows_config_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfig"]]:
        return jsii.get(self, "osProfileWindowsConfigInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="overprovisionInput")
    def overprovision_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "overprovisionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(self) -> typing.Optional[typing.List["VirtualMachineScaleSetPlan"]]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollingUpgradePolicyInput")
    def rolling_upgrade_policy_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetRollingUpgradePolicy"]]:
        return jsii.get(self, "rollingUpgradePolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroupInput")
    def single_placement_group_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "singlePlacementGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileDataDiskInput")
    def storage_profile_data_disk_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileDataDisk"]]:
        return jsii.get(self, "storageProfileDataDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileImageReferenceInput")
    def storage_profile_image_reference_input(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileImageReference"]]:
        return jsii.get(self, "storageProfileImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualMachineScaleSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticOsUpgrade")
    def automatic_os_upgrade(self) -> builtins.bool:
        return jsii.get(self, "automaticOsUpgrade")

    @automatic_os_upgrade.setter # type: ignore
    def automatic_os_upgrade(self, value: builtins.bool) -> None:
        jsii.set(self, "automaticOsUpgrade", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnostics")
    def boot_diagnostics(self) -> typing.List["VirtualMachineScaleSetBootDiagnostics"]:
        return jsii.get(self, "bootDiagnostics")

    @boot_diagnostics.setter # type: ignore
    def boot_diagnostics(
        self,
        value: typing.List["VirtualMachineScaleSetBootDiagnostics"],
    ) -> None:
        jsii.set(self, "bootDiagnostics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicy")
    def eviction_policy(self) -> builtins.str:
        return jsii.get(self, "evictionPolicy")

    @eviction_policy.setter # type: ignore
    def eviction_policy(self, value: builtins.str) -> None:
        jsii.set(self, "evictionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extension")
    def extension(self) -> typing.List["VirtualMachineScaleSetExtension"]:
        return jsii.get(self, "extension")

    @extension.setter # type: ignore
    def extension(self, value: typing.List["VirtualMachineScaleSetExtension"]) -> None:
        jsii.set(self, "extension", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthProbeId")
    def health_probe_id(self) -> builtins.str:
        return jsii.get(self, "healthProbeId")

    @health_probe_id.setter # type: ignore
    def health_probe_id(self, value: builtins.str) -> None:
        jsii.set(self, "healthProbeId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["VirtualMachineScaleSetIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["VirtualMachineScaleSetIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkProfile")
    def network_profile(self) -> typing.List["VirtualMachineScaleSetNetworkProfile"]:
        return jsii.get(self, "networkProfile")

    @network_profile.setter # type: ignore
    def network_profile(
        self,
        value: typing.List["VirtualMachineScaleSetNetworkProfile"],
    ) -> None:
        jsii.set(self, "networkProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfile")
    def os_profile(self) -> typing.List["VirtualMachineScaleSetOsProfile"]:
        return jsii.get(self, "osProfile")

    @os_profile.setter # type: ignore
    def os_profile(self, value: typing.List["VirtualMachineScaleSetOsProfile"]) -> None:
        jsii.set(self, "osProfile", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileLinuxConfig")
    def os_profile_linux_config(
        self,
    ) -> typing.List["VirtualMachineScaleSetOsProfileLinuxConfig"]:
        return jsii.get(self, "osProfileLinuxConfig")

    @os_profile_linux_config.setter # type: ignore
    def os_profile_linux_config(
        self,
        value: typing.List["VirtualMachineScaleSetOsProfileLinuxConfig"],
    ) -> None:
        jsii.set(self, "osProfileLinuxConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileSecrets")
    def os_profile_secrets(
        self,
    ) -> typing.List["VirtualMachineScaleSetOsProfileSecrets"]:
        return jsii.get(self, "osProfileSecrets")

    @os_profile_secrets.setter # type: ignore
    def os_profile_secrets(
        self,
        value: typing.List["VirtualMachineScaleSetOsProfileSecrets"],
    ) -> None:
        jsii.set(self, "osProfileSecrets", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osProfileWindowsConfig")
    def os_profile_windows_config(
        self,
    ) -> typing.List["VirtualMachineScaleSetOsProfileWindowsConfig"]:
        return jsii.get(self, "osProfileWindowsConfig")

    @os_profile_windows_config.setter # type: ignore
    def os_profile_windows_config(
        self,
        value: typing.List["VirtualMachineScaleSetOsProfileWindowsConfig"],
    ) -> None:
        jsii.set(self, "osProfileWindowsConfig", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="overprovision")
    def overprovision(self) -> builtins.bool:
        return jsii.get(self, "overprovision")

    @overprovision.setter # type: ignore
    def overprovision(self, value: builtins.bool) -> None:
        jsii.set(self, "overprovision", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["VirtualMachineScaleSetPlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["VirtualMachineScaleSetPlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> builtins.str:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: builtins.str) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollingUpgradePolicy")
    def rolling_upgrade_policy(
        self,
    ) -> typing.List["VirtualMachineScaleSetRollingUpgradePolicy"]:
        return jsii.get(self, "rollingUpgradePolicy")

    @rolling_upgrade_policy.setter # type: ignore
    def rolling_upgrade_policy(
        self,
        value: typing.List["VirtualMachineScaleSetRollingUpgradePolicy"],
    ) -> None:
        jsii.set(self, "rollingUpgradePolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroup")
    def single_placement_group(self) -> builtins.bool:
        return jsii.get(self, "singlePlacementGroup")

    @single_placement_group.setter # type: ignore
    def single_placement_group(self, value: builtins.bool) -> None:
        jsii.set(self, "singlePlacementGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> typing.List["VirtualMachineScaleSetSku"]:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: typing.List["VirtualMachineScaleSetSku"]) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileDataDisk")
    def storage_profile_data_disk(
        self,
    ) -> typing.List["VirtualMachineScaleSetStorageProfileDataDisk"]:
        return jsii.get(self, "storageProfileDataDisk")

    @storage_profile_data_disk.setter # type: ignore
    def storage_profile_data_disk(
        self,
        value: typing.List["VirtualMachineScaleSetStorageProfileDataDisk"],
    ) -> None:
        jsii.set(self, "storageProfileDataDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileImageReference")
    def storage_profile_image_reference(
        self,
    ) -> typing.List["VirtualMachineScaleSetStorageProfileImageReference"]:
        return jsii.get(self, "storageProfileImageReference")

    @storage_profile_image_reference.setter # type: ignore
    def storage_profile_image_reference(
        self,
        value: typing.List["VirtualMachineScaleSetStorageProfileImageReference"],
    ) -> None:
        jsii.set(self, "storageProfileImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="storageProfileOsDisk")
    def storage_profile_os_disk(
        self,
    ) -> typing.List["VirtualMachineScaleSetStorageProfileOsDisk"]:
        return jsii.get(self, "storageProfileOsDisk")

    @storage_profile_os_disk.setter # type: ignore
    def storage_profile_os_disk(
        self,
        value: typing.List["VirtualMachineScaleSetStorageProfileOsDisk"],
    ) -> None:
        jsii.set(self, "storageProfileOsDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualMachineScaleSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualMachineScaleSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradePolicyMode")
    def upgrade_policy_mode(self) -> builtins.str:
        return jsii.get(self, "upgradePolicyMode")

    @upgrade_policy_mode.setter # type: ignore
    def upgrade_policy_mode(self, value: builtins.str) -> None:
        jsii.set(self, "upgradePolicyMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetBootDiagnostics",
    jsii_struct_bases=[],
    name_mapping={"storage_uri": "storageUri", "enabled": "enabled"},
)
class VirtualMachineScaleSetBootDiagnostics:
    def __init__(
        self,
        *,
        storage_uri: builtins.str,
        enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param storage_uri: -
        :param enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "storage_uri": storage_uri,
        }
        if enabled is not None:
            self._values["enabled"] = enabled

    @builtins.property
    def storage_uri(self) -> builtins.str:
        result = self._values.get("storage_uri")
        assert result is not None, "Required property 'storage_uri' is missing"
        return result

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetBootDiagnostics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "network_profile": "networkProfile",
        "os_profile": "osProfile",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "storage_profile_os_disk": "storageProfileOsDisk",
        "upgrade_policy_mode": "upgradePolicyMode",
        "automatic_os_upgrade": "automaticOsUpgrade",
        "boot_diagnostics": "bootDiagnostics",
        "eviction_policy": "evictionPolicy",
        "extension": "extension",
        "health_probe_id": "healthProbeId",
        "identity": "identity",
        "license_type": "licenseType",
        "os_profile_linux_config": "osProfileLinuxConfig",
        "os_profile_secrets": "osProfileSecrets",
        "os_profile_windows_config": "osProfileWindowsConfig",
        "overprovision": "overprovision",
        "plan": "plan",
        "priority": "priority",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "rolling_upgrade_policy": "rollingUpgradePolicy",
        "single_placement_group": "singlePlacementGroup",
        "storage_profile_data_disk": "storageProfileDataDisk",
        "storage_profile_image_reference": "storageProfileImageReference",
        "tags": "tags",
        "timeouts": "timeouts",
        "zones": "zones",
    },
)
class VirtualMachineScaleSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        network_profile: typing.List["VirtualMachineScaleSetNetworkProfile"],
        os_profile: typing.List["VirtualMachineScaleSetOsProfile"],
        resource_group_name: builtins.str,
        sku: typing.List["VirtualMachineScaleSetSku"],
        storage_profile_os_disk: typing.List["VirtualMachineScaleSetStorageProfileOsDisk"],
        upgrade_policy_mode: builtins.str,
        automatic_os_upgrade: typing.Optional[builtins.bool] = None,
        boot_diagnostics: typing.Optional[typing.List[VirtualMachineScaleSetBootDiagnostics]] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extension: typing.Optional[typing.List["VirtualMachineScaleSetExtension"]] = None,
        health_probe_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["VirtualMachineScaleSetIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        os_profile_linux_config: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileLinuxConfig"]] = None,
        os_profile_secrets: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileSecrets"]] = None,
        os_profile_windows_config: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfig"]] = None,
        overprovision: typing.Optional[builtins.bool] = None,
        plan: typing.Optional[typing.List["VirtualMachineScaleSetPlan"]] = None,
        priority: typing.Optional[builtins.str] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        rolling_upgrade_policy: typing.Optional[typing.List["VirtualMachineScaleSetRollingUpgradePolicy"]] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        storage_profile_data_disk: typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileDataDisk"]] = None,
        storage_profile_image_reference: typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualMachineScaleSetTimeouts"] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param network_profile: network_profile block.
        :param os_profile: os_profile block.
        :param resource_group_name: -
        :param sku: sku block.
        :param storage_profile_os_disk: storage_profile_os_disk block.
        :param upgrade_policy_mode: -
        :param automatic_os_upgrade: -
        :param boot_diagnostics: boot_diagnostics block.
        :param eviction_policy: -
        :param extension: extension block.
        :param health_probe_id: -
        :param identity: identity block.
        :param license_type: -
        :param os_profile_linux_config: os_profile_linux_config block.
        :param os_profile_secrets: os_profile_secrets block.
        :param os_profile_windows_config: os_profile_windows_config block.
        :param overprovision: -
        :param plan: plan block.
        :param priority: -
        :param proximity_placement_group_id: -
        :param rolling_upgrade_policy: rolling_upgrade_policy block.
        :param single_placement_group: -
        :param storage_profile_data_disk: storage_profile_data_disk block.
        :param storage_profile_image_reference: storage_profile_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualMachineScaleSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "network_profile": network_profile,
            "os_profile": os_profile,
            "resource_group_name": resource_group_name,
            "sku": sku,
            "storage_profile_os_disk": storage_profile_os_disk,
            "upgrade_policy_mode": upgrade_policy_mode,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if automatic_os_upgrade is not None:
            self._values["automatic_os_upgrade"] = automatic_os_upgrade
        if boot_diagnostics is not None:
            self._values["boot_diagnostics"] = boot_diagnostics
        if eviction_policy is not None:
            self._values["eviction_policy"] = eviction_policy
        if extension is not None:
            self._values["extension"] = extension
        if health_probe_id is not None:
            self._values["health_probe_id"] = health_probe_id
        if identity is not None:
            self._values["identity"] = identity
        if license_type is not None:
            self._values["license_type"] = license_type
        if os_profile_linux_config is not None:
            self._values["os_profile_linux_config"] = os_profile_linux_config
        if os_profile_secrets is not None:
            self._values["os_profile_secrets"] = os_profile_secrets
        if os_profile_windows_config is not None:
            self._values["os_profile_windows_config"] = os_profile_windows_config
        if overprovision is not None:
            self._values["overprovision"] = overprovision
        if plan is not None:
            self._values["plan"] = plan
        if priority is not None:
            self._values["priority"] = priority
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if rolling_upgrade_policy is not None:
            self._values["rolling_upgrade_policy"] = rolling_upgrade_policy
        if single_placement_group is not None:
            self._values["single_placement_group"] = single_placement_group
        if storage_profile_data_disk is not None:
            self._values["storage_profile_data_disk"] = storage_profile_data_disk
        if storage_profile_image_reference is not None:
            self._values["storage_profile_image_reference"] = storage_profile_image_reference
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_profile(self) -> typing.List["VirtualMachineScaleSetNetworkProfile"]:
        """network_profile block."""
        result = self._values.get("network_profile")
        assert result is not None, "Required property 'network_profile' is missing"
        return result

    @builtins.property
    def os_profile(self) -> typing.List["VirtualMachineScaleSetOsProfile"]:
        """os_profile block."""
        result = self._values.get("os_profile")
        assert result is not None, "Required property 'os_profile' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> typing.List["VirtualMachineScaleSetSku"]:
        """sku block."""
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def storage_profile_os_disk(
        self,
    ) -> typing.List["VirtualMachineScaleSetStorageProfileOsDisk"]:
        """storage_profile_os_disk block."""
        result = self._values.get("storage_profile_os_disk")
        assert result is not None, "Required property 'storage_profile_os_disk' is missing"
        return result

    @builtins.property
    def upgrade_policy_mode(self) -> builtins.str:
        result = self._values.get("upgrade_policy_mode")
        assert result is not None, "Required property 'upgrade_policy_mode' is missing"
        return result

    @builtins.property
    def automatic_os_upgrade(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("automatic_os_upgrade")
        return result

    @builtins.property
    def boot_diagnostics(
        self,
    ) -> typing.Optional[typing.List[VirtualMachineScaleSetBootDiagnostics]]:
        """boot_diagnostics block."""
        result = self._values.get("boot_diagnostics")
        return result

    @builtins.property
    def eviction_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eviction_policy")
        return result

    @builtins.property
    def extension(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetExtension"]]:
        """extension block."""
        result = self._values.get("extension")
        return result

    @builtins.property
    def health_probe_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("health_probe_id")
        return result

    @builtins.property
    def identity(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def os_profile_linux_config(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileLinuxConfig"]]:
        """os_profile_linux_config block."""
        result = self._values.get("os_profile_linux_config")
        return result

    @builtins.property
    def os_profile_secrets(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileSecrets"]]:
        """os_profile_secrets block."""
        result = self._values.get("os_profile_secrets")
        return result

    @builtins.property
    def os_profile_windows_config(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfig"]]:
        """os_profile_windows_config block."""
        result = self._values.get("os_profile_windows_config")
        return result

    @builtins.property
    def overprovision(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("overprovision")
        return result

    @builtins.property
    def plan(self) -> typing.Optional[typing.List["VirtualMachineScaleSetPlan"]]:
        """plan block."""
        result = self._values.get("plan")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def rolling_upgrade_policy(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetRollingUpgradePolicy"]]:
        """rolling_upgrade_policy block."""
        result = self._values.get("rolling_upgrade_policy")
        return result

    @builtins.property
    def single_placement_group(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("single_placement_group")
        return result

    @builtins.property
    def storage_profile_data_disk(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileDataDisk"]]:
        """storage_profile_data_disk block."""
        result = self._values.get("storage_profile_data_disk")
        return result

    @builtins.property
    def storage_profile_image_reference(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetStorageProfileImageReference"]]:
        """storage_profile_image_reference block."""
        result = self._values.get("storage_profile_image_reference")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualMachineScaleSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetExtension",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "publisher": "publisher",
        "type": "type",
        "type_handler_version": "typeHandlerVersion",
        "auto_upgrade_minor_version": "autoUpgradeMinorVersion",
        "protected_settings": "protectedSettings",
        "provision_after_extensions": "provisionAfterExtensions",
        "settings": "settings",
    },
)
class VirtualMachineScaleSetExtension:
    def __init__(
        self,
        *,
        name: builtins.str,
        publisher: builtins.str,
        type: builtins.str,
        type_handler_version: builtins.str,
        auto_upgrade_minor_version: typing.Optional[builtins.bool] = None,
        protected_settings: typing.Optional[builtins.str] = None,
        provision_after_extensions: typing.Optional[typing.List[builtins.str]] = None,
        settings: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param publisher: -
        :param type: -
        :param type_handler_version: -
        :param auto_upgrade_minor_version: -
        :param protected_settings: -
        :param provision_after_extensions: -
        :param settings: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "publisher": publisher,
            "type": type,
            "type_handler_version": type_handler_version,
        }
        if auto_upgrade_minor_version is not None:
            self._values["auto_upgrade_minor_version"] = auto_upgrade_minor_version
        if protected_settings is not None:
            self._values["protected_settings"] = protected_settings
        if provision_after_extensions is not None:
            self._values["provision_after_extensions"] = provision_after_extensions
        if settings is not None:
            self._values["settings"] = settings

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def type_handler_version(self) -> builtins.str:
        result = self._values.get("type_handler_version")
        assert result is not None, "Required property 'type_handler_version' is missing"
        return result

    @builtins.property
    def auto_upgrade_minor_version(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_upgrade_minor_version")
        return result

    @builtins.property
    def protected_settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protected_settings")
        return result

    @builtins.property
    def provision_after_extensions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("provision_after_extensions")
        return result

    @builtins.property
    def settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("settings")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetExtension(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualMachineScaleSetExtensionA(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualMachineScaleSetExtensionA",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        publisher: builtins.str,
        type: builtins.str,
        type_handler_version: builtins.str,
        virtual_machine_scale_set_id: builtins.str,
        auto_upgrade_minor_version: typing.Optional[builtins.bool] = None,
        force_update_tag: typing.Optional[builtins.str] = None,
        protected_settings: typing.Optional[builtins.str] = None,
        provision_after_extensions: typing.Optional[typing.List[builtins.str]] = None,
        settings: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["VirtualMachineScaleSetExtensionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param publisher: -
        :param type: -
        :param type_handler_version: -
        :param virtual_machine_scale_set_id: -
        :param auto_upgrade_minor_version: -
        :param force_update_tag: -
        :param protected_settings: -
        :param provision_after_extensions: -
        :param settings: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualMachineScaleSetExtensionAConfig(
            name=name,
            publisher=publisher,
            type=type,
            type_handler_version=type_handler_version,
            virtual_machine_scale_set_id=virtual_machine_scale_set_id,
            auto_upgrade_minor_version=auto_upgrade_minor_version,
            force_update_tag=force_update_tag,
            protected_settings=protected_settings,
            provision_after_extensions=provision_after_extensions,
            settings=settings,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualMachineScaleSetExtensionA, self, [scope, id, config])

    @jsii.member(jsii_name="resetAutoUpgradeMinorVersion")
    def reset_auto_upgrade_minor_version(self) -> None:
        return jsii.invoke(self, "resetAutoUpgradeMinorVersion", [])

    @jsii.member(jsii_name="resetForceUpdateTag")
    def reset_force_update_tag(self) -> None:
        return jsii.invoke(self, "resetForceUpdateTag", [])

    @jsii.member(jsii_name="resetProtectedSettings")
    def reset_protected_settings(self) -> None:
        return jsii.invoke(self, "resetProtectedSettings", [])

    @jsii.member(jsii_name="resetProvisionAfterExtensions")
    def reset_provision_after_extensions(self) -> None:
        return jsii.invoke(self, "resetProvisionAfterExtensions", [])

    @jsii.member(jsii_name="resetSettings")
    def reset_settings(self) -> None:
        return jsii.invoke(self, "resetSettings", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisherInput")
    def publisher_input(self) -> builtins.str:
        return jsii.get(self, "publisherInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeHandlerVersionInput")
    def type_handler_version_input(self) -> builtins.str:
        return jsii.get(self, "typeHandlerVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineScaleSetIdInput")
    def virtual_machine_scale_set_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualMachineScaleSetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoUpgradeMinorVersionInput")
    def auto_upgrade_minor_version_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "autoUpgradeMinorVersionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forceUpdateTagInput")
    def force_update_tag_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "forceUpdateTagInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protectedSettingsInput")
    def protected_settings_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "protectedSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionAfterExtensionsInput")
    def provision_after_extensions_input(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "provisionAfterExtensionsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="settingsInput")
    def settings_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "settingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["VirtualMachineScaleSetExtensionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="autoUpgradeMinorVersion")
    def auto_upgrade_minor_version(self) -> builtins.bool:
        return jsii.get(self, "autoUpgradeMinorVersion")

    @auto_upgrade_minor_version.setter # type: ignore
    def auto_upgrade_minor_version(self, value: builtins.bool) -> None:
        jsii.set(self, "autoUpgradeMinorVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="forceUpdateTag")
    def force_update_tag(self) -> builtins.str:
        return jsii.get(self, "forceUpdateTag")

    @force_update_tag.setter # type: ignore
    def force_update_tag(self, value: builtins.str) -> None:
        jsii.set(self, "forceUpdateTag", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="protectedSettings")
    def protected_settings(self) -> builtins.str:
        return jsii.get(self, "protectedSettings")

    @protected_settings.setter # type: ignore
    def protected_settings(self, value: builtins.str) -> None:
        jsii.set(self, "protectedSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionAfterExtensions")
    def provision_after_extensions(self) -> typing.List[builtins.str]:
        return jsii.get(self, "provisionAfterExtensions")

    @provision_after_extensions.setter # type: ignore
    def provision_after_extensions(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "provisionAfterExtensions", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publisher")
    def publisher(self) -> builtins.str:
        return jsii.get(self, "publisher")

    @publisher.setter # type: ignore
    def publisher(self, value: builtins.str) -> None:
        jsii.set(self, "publisher", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="settings")
    def settings(self) -> builtins.str:
        return jsii.get(self, "settings")

    @settings.setter # type: ignore
    def settings(self, value: builtins.str) -> None:
        jsii.set(self, "settings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualMachineScaleSetExtensionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualMachineScaleSetExtensionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeHandlerVersion")
    def type_handler_version(self) -> builtins.str:
        return jsii.get(self, "typeHandlerVersion")

    @type_handler_version.setter # type: ignore
    def type_handler_version(self, value: builtins.str) -> None:
        jsii.set(self, "typeHandlerVersion", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineScaleSetId")
    def virtual_machine_scale_set_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineScaleSetId")

    @virtual_machine_scale_set_id.setter # type: ignore
    def virtual_machine_scale_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineScaleSetId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetExtensionAConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "publisher": "publisher",
        "type": "type",
        "type_handler_version": "typeHandlerVersion",
        "virtual_machine_scale_set_id": "virtualMachineScaleSetId",
        "auto_upgrade_minor_version": "autoUpgradeMinorVersion",
        "force_update_tag": "forceUpdateTag",
        "protected_settings": "protectedSettings",
        "provision_after_extensions": "provisionAfterExtensions",
        "settings": "settings",
        "timeouts": "timeouts",
    },
)
class VirtualMachineScaleSetExtensionAConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        publisher: builtins.str,
        type: builtins.str,
        type_handler_version: builtins.str,
        virtual_machine_scale_set_id: builtins.str,
        auto_upgrade_minor_version: typing.Optional[builtins.bool] = None,
        force_update_tag: typing.Optional[builtins.str] = None,
        protected_settings: typing.Optional[builtins.str] = None,
        provision_after_extensions: typing.Optional[typing.List[builtins.str]] = None,
        settings: typing.Optional[builtins.str] = None,
        timeouts: typing.Optional["VirtualMachineScaleSetExtensionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param publisher: -
        :param type: -
        :param type_handler_version: -
        :param virtual_machine_scale_set_id: -
        :param auto_upgrade_minor_version: -
        :param force_update_tag: -
        :param protected_settings: -
        :param provision_after_extensions: -
        :param settings: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualMachineScaleSetExtensionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "publisher": publisher,
            "type": type,
            "type_handler_version": type_handler_version,
            "virtual_machine_scale_set_id": virtual_machine_scale_set_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if auto_upgrade_minor_version is not None:
            self._values["auto_upgrade_minor_version"] = auto_upgrade_minor_version
        if force_update_tag is not None:
            self._values["force_update_tag"] = force_update_tag
        if protected_settings is not None:
            self._values["protected_settings"] = protected_settings
        if provision_after_extensions is not None:
            self._values["provision_after_extensions"] = provision_after_extensions
        if settings is not None:
            self._values["settings"] = settings
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def type_handler_version(self) -> builtins.str:
        result = self._values.get("type_handler_version")
        assert result is not None, "Required property 'type_handler_version' is missing"
        return result

    @builtins.property
    def virtual_machine_scale_set_id(self) -> builtins.str:
        result = self._values.get("virtual_machine_scale_set_id")
        assert result is not None, "Required property 'virtual_machine_scale_set_id' is missing"
        return result

    @builtins.property
    def auto_upgrade_minor_version(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_upgrade_minor_version")
        return result

    @builtins.property
    def force_update_tag(self) -> typing.Optional[builtins.str]:
        result = self._values.get("force_update_tag")
        return result

    @builtins.property
    def protected_settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protected_settings")
        return result

    @builtins.property
    def provision_after_extensions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("provision_after_extensions")
        return result

    @builtins.property
    def settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("settings")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualMachineScaleSetExtensionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetExtensionAConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetExtensionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualMachineScaleSetExtensionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetExtensionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class VirtualMachineScaleSetIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetNetworkProfile",
    jsii_struct_bases=[],
    name_mapping={
        "ip_configuration": "ipConfiguration",
        "name": "name",
        "primary": "primary",
        "accelerated_networking": "acceleratedNetworking",
        "dns_settings": "dnsSettings",
        "ip_forwarding": "ipForwarding",
        "network_security_group_id": "networkSecurityGroupId",
    },
)
class VirtualMachineScaleSetNetworkProfile:
    def __init__(
        self,
        *,
        ip_configuration: typing.List["VirtualMachineScaleSetNetworkProfileIpConfiguration"],
        name: builtins.str,
        primary: builtins.bool,
        accelerated_networking: typing.Optional[builtins.bool] = None,
        dns_settings: typing.Optional[typing.List["VirtualMachineScaleSetNetworkProfileDnsSettings"]] = None,
        ip_forwarding: typing.Optional[builtins.bool] = None,
        network_security_group_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param ip_configuration: ip_configuration block.
        :param name: -
        :param primary: -
        :param accelerated_networking: -
        :param dns_settings: dns_settings block.
        :param ip_forwarding: -
        :param network_security_group_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "ip_configuration": ip_configuration,
            "name": name,
            "primary": primary,
        }
        if accelerated_networking is not None:
            self._values["accelerated_networking"] = accelerated_networking
        if dns_settings is not None:
            self._values["dns_settings"] = dns_settings
        if ip_forwarding is not None:
            self._values["ip_forwarding"] = ip_forwarding
        if network_security_group_id is not None:
            self._values["network_security_group_id"] = network_security_group_id

    @builtins.property
    def ip_configuration(
        self,
    ) -> typing.List["VirtualMachineScaleSetNetworkProfileIpConfiguration"]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        assert result is not None, "Required property 'ip_configuration' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def primary(self) -> builtins.bool:
        result = self._values.get("primary")
        assert result is not None, "Required property 'primary' is missing"
        return result

    @builtins.property
    def accelerated_networking(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("accelerated_networking")
        return result

    @builtins.property
    def dns_settings(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetNetworkProfileDnsSettings"]]:
        """dns_settings block."""
        result = self._values.get("dns_settings")
        return result

    @builtins.property
    def ip_forwarding(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ip_forwarding")
        return result

    @builtins.property
    def network_security_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("network_security_group_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetNetworkProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetNetworkProfileDnsSettings",
    jsii_struct_bases=[],
    name_mapping={"dns_servers": "dnsServers"},
)
class VirtualMachineScaleSetNetworkProfileDnsSettings:
    def __init__(self, *, dns_servers: typing.List[builtins.str]) -> None:
        """
        :param dns_servers: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "dns_servers": dns_servers,
        }

    @builtins.property
    def dns_servers(self) -> typing.List[builtins.str]:
        result = self._values.get("dns_servers")
        assert result is not None, "Required property 'dns_servers' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetNetworkProfileDnsSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetNetworkProfileIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "primary": "primary",
        "subnet_id": "subnetId",
        "application_gateway_backend_address_pool_ids": "applicationGatewayBackendAddressPoolIds",
        "application_security_group_ids": "applicationSecurityGroupIds",
        "load_balancer_backend_address_pool_ids": "loadBalancerBackendAddressPoolIds",
        "load_balancer_inbound_nat_rules_ids": "loadBalancerInboundNatRulesIds",
        "public_ip_address_configuration": "publicIpAddressConfiguration",
    },
)
class VirtualMachineScaleSetNetworkProfileIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        primary: builtins.bool,
        subnet_id: builtins.str,
        application_gateway_backend_address_pool_ids: typing.Optional[typing.List[builtins.str]] = None,
        application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        load_balancer_backend_address_pool_ids: typing.Optional[typing.List[builtins.str]] = None,
        load_balancer_inbound_nat_rules_ids: typing.Optional[typing.List[builtins.str]] = None,
        public_ip_address_configuration: typing.Optional[typing.List["VirtualMachineScaleSetNetworkProfileIpConfigurationPublicIpAddressConfiguration"]] = None,
    ) -> None:
        """
        :param name: -
        :param primary: -
        :param subnet_id: -
        :param application_gateway_backend_address_pool_ids: -
        :param application_security_group_ids: -
        :param load_balancer_backend_address_pool_ids: -
        :param load_balancer_inbound_nat_rules_ids: -
        :param public_ip_address_configuration: public_ip_address_configuration block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "primary": primary,
            "subnet_id": subnet_id,
        }
        if application_gateway_backend_address_pool_ids is not None:
            self._values["application_gateway_backend_address_pool_ids"] = application_gateway_backend_address_pool_ids
        if application_security_group_ids is not None:
            self._values["application_security_group_ids"] = application_security_group_ids
        if load_balancer_backend_address_pool_ids is not None:
            self._values["load_balancer_backend_address_pool_ids"] = load_balancer_backend_address_pool_ids
        if load_balancer_inbound_nat_rules_ids is not None:
            self._values["load_balancer_inbound_nat_rules_ids"] = load_balancer_inbound_nat_rules_ids
        if public_ip_address_configuration is not None:
            self._values["public_ip_address_configuration"] = public_ip_address_configuration

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def primary(self) -> builtins.bool:
        result = self._values.get("primary")
        assert result is not None, "Required property 'primary' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def application_gateway_backend_address_pool_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("application_gateway_backend_address_pool_ids")
        return result

    @builtins.property
    def application_security_group_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("application_security_group_ids")
        return result

    @builtins.property
    def load_balancer_backend_address_pool_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("load_balancer_backend_address_pool_ids")
        return result

    @builtins.property
    def load_balancer_inbound_nat_rules_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("load_balancer_inbound_nat_rules_ids")
        return result

    @builtins.property
    def public_ip_address_configuration(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetNetworkProfileIpConfigurationPublicIpAddressConfiguration"]]:
        """public_ip_address_configuration block."""
        result = self._values.get("public_ip_address_configuration")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetNetworkProfileIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetNetworkProfileIpConfigurationPublicIpAddressConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "domain_name_label": "domainNameLabel",
        "idle_timeout": "idleTimeout",
        "name": "name",
    },
)
class VirtualMachineScaleSetNetworkProfileIpConfigurationPublicIpAddressConfiguration:
    def __init__(
        self,
        *,
        domain_name_label: builtins.str,
        idle_timeout: jsii.Number,
        name: builtins.str,
    ) -> None:
        """
        :param domain_name_label: -
        :param idle_timeout: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "domain_name_label": domain_name_label,
            "idle_timeout": idle_timeout,
            "name": name,
        }

    @builtins.property
    def domain_name_label(self) -> builtins.str:
        result = self._values.get("domain_name_label")
        assert result is not None, "Required property 'domain_name_label' is missing"
        return result

    @builtins.property
    def idle_timeout(self) -> jsii.Number:
        result = self._values.get("idle_timeout")
        assert result is not None, "Required property 'idle_timeout' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetNetworkProfileIpConfigurationPublicIpAddressConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfile",
    jsii_struct_bases=[],
    name_mapping={
        "admin_username": "adminUsername",
        "computer_name_prefix": "computerNamePrefix",
        "admin_password": "adminPassword",
        "custom_data": "customData",
    },
)
class VirtualMachineScaleSetOsProfile:
    def __init__(
        self,
        *,
        admin_username: builtins.str,
        computer_name_prefix: builtins.str,
        admin_password: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param admin_username: -
        :param computer_name_prefix: -
        :param admin_password: -
        :param custom_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "admin_username": admin_username,
            "computer_name_prefix": computer_name_prefix,
        }
        if admin_password is not None:
            self._values["admin_password"] = admin_password
        if custom_data is not None:
            self._values["custom_data"] = custom_data

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def computer_name_prefix(self) -> builtins.str:
        result = self._values.get("computer_name_prefix")
        assert result is not None, "Required property 'computer_name_prefix' is missing"
        return result

    @builtins.property
    def admin_password(self) -> typing.Optional[builtins.str]:
        result = self._values.get("admin_password")
        return result

    @builtins.property
    def custom_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_data")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfile(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfileLinuxConfig",
    jsii_struct_bases=[],
    name_mapping={
        "disable_password_authentication": "disablePasswordAuthentication",
        "ssh_keys": "sshKeys",
    },
)
class VirtualMachineScaleSetOsProfileLinuxConfig:
    def __init__(
        self,
        *,
        disable_password_authentication: typing.Optional[builtins.bool] = None,
        ssh_keys: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileLinuxConfigSshKeys"]] = None,
    ) -> None:
        """
        :param disable_password_authentication: -
        :param ssh_keys: ssh_keys block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if disable_password_authentication is not None:
            self._values["disable_password_authentication"] = disable_password_authentication
        if ssh_keys is not None:
            self._values["ssh_keys"] = ssh_keys

    @builtins.property
    def disable_password_authentication(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disable_password_authentication")
        return result

    @builtins.property
    def ssh_keys(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileLinuxConfigSshKeys"]]:
        """ssh_keys block."""
        result = self._values.get("ssh_keys")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfileLinuxConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfileLinuxConfigSshKeys",
    jsii_struct_bases=[],
    name_mapping={"path": "path", "key_data": "keyData"},
)
class VirtualMachineScaleSetOsProfileLinuxConfigSshKeys:
    def __init__(
        self,
        *,
        path: builtins.str,
        key_data: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param path: -
        :param key_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "path": path,
        }
        if key_data is not None:
            self._values["key_data"] = key_data

    @builtins.property
    def path(self) -> builtins.str:
        result = self._values.get("path")
        assert result is not None, "Required property 'path' is missing"
        return result

    @builtins.property
    def key_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("key_data")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfileLinuxConfigSshKeys(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfileSecrets",
    jsii_struct_bases=[],
    name_mapping={
        "source_vault_id": "sourceVaultId",
        "vault_certificates": "vaultCertificates",
    },
)
class VirtualMachineScaleSetOsProfileSecrets:
    def __init__(
        self,
        *,
        source_vault_id: builtins.str,
        vault_certificates: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileSecretsVaultCertificates"]] = None,
    ) -> None:
        """
        :param source_vault_id: -
        :param vault_certificates: vault_certificates block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "source_vault_id": source_vault_id,
        }
        if vault_certificates is not None:
            self._values["vault_certificates"] = vault_certificates

    @builtins.property
    def source_vault_id(self) -> builtins.str:
        result = self._values.get("source_vault_id")
        assert result is not None, "Required property 'source_vault_id' is missing"
        return result

    @builtins.property
    def vault_certificates(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileSecretsVaultCertificates"]]:
        """vault_certificates block."""
        result = self._values.get("vault_certificates")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfileSecrets(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfileSecretsVaultCertificates",
    jsii_struct_bases=[],
    name_mapping={
        "certificate_url": "certificateUrl",
        "certificate_store": "certificateStore",
    },
)
class VirtualMachineScaleSetOsProfileSecretsVaultCertificates:
    def __init__(
        self,
        *,
        certificate_url: builtins.str,
        certificate_store: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param certificate_url: -
        :param certificate_store: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate_url": certificate_url,
        }
        if certificate_store is not None:
            self._values["certificate_store"] = certificate_store

    @builtins.property
    def certificate_url(self) -> builtins.str:
        result = self._values.get("certificate_url")
        assert result is not None, "Required property 'certificate_url' is missing"
        return result

    @builtins.property
    def certificate_store(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_store")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfileSecretsVaultCertificates(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfileWindowsConfig",
    jsii_struct_bases=[],
    name_mapping={
        "additional_unattend_config": "additionalUnattendConfig",
        "enable_automatic_upgrades": "enableAutomaticUpgrades",
        "provision_vm_agent": "provisionVmAgent",
        "winrm": "winrm",
    },
)
class VirtualMachineScaleSetOsProfileWindowsConfig:
    def __init__(
        self,
        *,
        additional_unattend_config: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfigAdditionalUnattendConfig"]] = None,
        enable_automatic_upgrades: typing.Optional[builtins.bool] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        winrm: typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfigWinrm"]] = None,
    ) -> None:
        """
        :param additional_unattend_config: additional_unattend_config block.
        :param enable_automatic_upgrades: -
        :param provision_vm_agent: -
        :param winrm: winrm block.
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if additional_unattend_config is not None:
            self._values["additional_unattend_config"] = additional_unattend_config
        if enable_automatic_upgrades is not None:
            self._values["enable_automatic_upgrades"] = enable_automatic_upgrades
        if provision_vm_agent is not None:
            self._values["provision_vm_agent"] = provision_vm_agent
        if winrm is not None:
            self._values["winrm"] = winrm

    @builtins.property
    def additional_unattend_config(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfigAdditionalUnattendConfig"]]:
        """additional_unattend_config block."""
        result = self._values.get("additional_unattend_config")
        return result

    @builtins.property
    def enable_automatic_upgrades(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_automatic_upgrades")
        return result

    @builtins.property
    def provision_vm_agent(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("provision_vm_agent")
        return result

    @builtins.property
    def winrm(
        self,
    ) -> typing.Optional[typing.List["VirtualMachineScaleSetOsProfileWindowsConfigWinrm"]]:
        """winrm block."""
        result = self._values.get("winrm")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfileWindowsConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfileWindowsConfigAdditionalUnattendConfig",
    jsii_struct_bases=[],
    name_mapping={
        "component": "component",
        "content": "content",
        "pass_": "pass",
        "setting_name": "settingName",
    },
)
class VirtualMachineScaleSetOsProfileWindowsConfigAdditionalUnattendConfig:
    def __init__(
        self,
        *,
        component: builtins.str,
        content: builtins.str,
        pass_: builtins.str,
        setting_name: builtins.str,
    ) -> None:
        """
        :param component: -
        :param content: -
        :param pass_: -
        :param setting_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "component": component,
            "content": content,
            "pass_": pass_,
            "setting_name": setting_name,
        }

    @builtins.property
    def component(self) -> builtins.str:
        result = self._values.get("component")
        assert result is not None, "Required property 'component' is missing"
        return result

    @builtins.property
    def content(self) -> builtins.str:
        result = self._values.get("content")
        assert result is not None, "Required property 'content' is missing"
        return result

    @builtins.property
    def pass_(self) -> builtins.str:
        result = self._values.get("pass_")
        assert result is not None, "Required property 'pass_' is missing"
        return result

    @builtins.property
    def setting_name(self) -> builtins.str:
        result = self._values.get("setting_name")
        assert result is not None, "Required property 'setting_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfileWindowsConfigAdditionalUnattendConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetOsProfileWindowsConfigWinrm",
    jsii_struct_bases=[],
    name_mapping={"protocol": "protocol", "certificate_url": "certificateUrl"},
)
class VirtualMachineScaleSetOsProfileWindowsConfigWinrm:
    def __init__(
        self,
        *,
        protocol: builtins.str,
        certificate_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param protocol: -
        :param certificate_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "protocol": protocol,
        }
        if certificate_url is not None:
            self._values["certificate_url"] = certificate_url

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def certificate_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetOsProfileWindowsConfigWinrm(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetPlan",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "product": "product", "publisher": "publisher"},
)
class VirtualMachineScaleSetPlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: builtins.str,
        publisher: builtins.str,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "product": product,
            "publisher": publisher,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetPlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetRollingUpgradePolicy",
    jsii_struct_bases=[],
    name_mapping={
        "max_batch_instance_percent": "maxBatchInstancePercent",
        "max_unhealthy_instance_percent": "maxUnhealthyInstancePercent",
        "max_unhealthy_upgraded_instance_percent": "maxUnhealthyUpgradedInstancePercent",
        "pause_time_between_batches": "pauseTimeBetweenBatches",
    },
)
class VirtualMachineScaleSetRollingUpgradePolicy:
    def __init__(
        self,
        *,
        max_batch_instance_percent: typing.Optional[jsii.Number] = None,
        max_unhealthy_instance_percent: typing.Optional[jsii.Number] = None,
        max_unhealthy_upgraded_instance_percent: typing.Optional[jsii.Number] = None,
        pause_time_between_batches: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param max_batch_instance_percent: -
        :param max_unhealthy_instance_percent: -
        :param max_unhealthy_upgraded_instance_percent: -
        :param pause_time_between_batches: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if max_batch_instance_percent is not None:
            self._values["max_batch_instance_percent"] = max_batch_instance_percent
        if max_unhealthy_instance_percent is not None:
            self._values["max_unhealthy_instance_percent"] = max_unhealthy_instance_percent
        if max_unhealthy_upgraded_instance_percent is not None:
            self._values["max_unhealthy_upgraded_instance_percent"] = max_unhealthy_upgraded_instance_percent
        if pause_time_between_batches is not None:
            self._values["pause_time_between_batches"] = pause_time_between_batches

    @builtins.property
    def max_batch_instance_percent(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_batch_instance_percent")
        return result

    @builtins.property
    def max_unhealthy_instance_percent(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_unhealthy_instance_percent")
        return result

    @builtins.property
    def max_unhealthy_upgraded_instance_percent(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_unhealthy_upgraded_instance_percent")
        return result

    @builtins.property
    def pause_time_between_batches(self) -> typing.Optional[builtins.str]:
        result = self._values.get("pause_time_between_batches")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetRollingUpgradePolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetSku",
    jsii_struct_bases=[],
    name_mapping={"capacity": "capacity", "name": "name", "tier": "tier"},
)
class VirtualMachineScaleSetSku:
    def __init__(
        self,
        *,
        capacity: jsii.Number,
        name: builtins.str,
        tier: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param capacity: -
        :param name: -
        :param tier: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "capacity": capacity,
            "name": name,
        }
        if tier is not None:
            self._values["tier"] = tier

    @builtins.property
    def capacity(self) -> jsii.Number:
        result = self._values.get("capacity")
        assert result is not None, "Required property 'capacity' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def tier(self) -> typing.Optional[builtins.str]:
        result = self._values.get("tier")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetSku(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetStorageProfileDataDisk",
    jsii_struct_bases=[],
    name_mapping={
        "create_option": "createOption",
        "lun": "lun",
        "caching": "caching",
        "disk_size_gb": "diskSizeGb",
        "managed_disk_type": "managedDiskType",
    },
)
class VirtualMachineScaleSetStorageProfileDataDisk:
    def __init__(
        self,
        *,
        create_option: builtins.str,
        lun: jsii.Number,
        caching: typing.Optional[builtins.str] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        managed_disk_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create_option: -
        :param lun: -
        :param caching: -
        :param disk_size_gb: -
        :param managed_disk_type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "create_option": create_option,
            "lun": lun,
        }
        if caching is not None:
            self._values["caching"] = caching
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if managed_disk_type is not None:
            self._values["managed_disk_type"] = managed_disk_type

    @builtins.property
    def create_option(self) -> builtins.str:
        result = self._values.get("create_option")
        assert result is not None, "Required property 'create_option' is missing"
        return result

    @builtins.property
    def lun(self) -> jsii.Number:
        result = self._values.get("lun")
        assert result is not None, "Required property 'lun' is missing"
        return result

    @builtins.property
    def caching(self) -> typing.Optional[builtins.str]:
        result = self._values.get("caching")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def managed_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetStorageProfileDataDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetStorageProfileImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "id": "id",
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class VirtualMachineScaleSetStorageProfileImageReference:
    def __init__(
        self,
        *,
        id: typing.Optional[builtins.str] = None,
        offer: typing.Optional[builtins.str] = None,
        publisher: typing.Optional[builtins.str] = None,
        sku: typing.Optional[builtins.str] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param id: -
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if id is not None:
            self._values["id"] = id
        if offer is not None:
            self._values["offer"] = offer
        if publisher is not None:
            self._values["publisher"] = publisher
        if sku is not None:
            self._values["sku"] = sku
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("id")
        return result

    @builtins.property
    def offer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("offer")
        return result

    @builtins.property
    def publisher(self) -> typing.Optional[builtins.str]:
        result = self._values.get("publisher")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetStorageProfileImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetStorageProfileOsDisk",
    jsii_struct_bases=[],
    name_mapping={
        "create_option": "createOption",
        "caching": "caching",
        "image": "image",
        "managed_disk_type": "managedDiskType",
        "name": "name",
        "os_type": "osType",
        "vhd_containers": "vhdContainers",
    },
)
class VirtualMachineScaleSetStorageProfileOsDisk:
    def __init__(
        self,
        *,
        create_option: builtins.str,
        caching: typing.Optional[builtins.str] = None,
        image: typing.Optional[builtins.str] = None,
        managed_disk_type: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        os_type: typing.Optional[builtins.str] = None,
        vhd_containers: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param create_option: -
        :param caching: -
        :param image: -
        :param managed_disk_type: -
        :param name: -
        :param os_type: -
        :param vhd_containers: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "create_option": create_option,
        }
        if caching is not None:
            self._values["caching"] = caching
        if image is not None:
            self._values["image"] = image
        if managed_disk_type is not None:
            self._values["managed_disk_type"] = managed_disk_type
        if name is not None:
            self._values["name"] = name
        if os_type is not None:
            self._values["os_type"] = os_type
        if vhd_containers is not None:
            self._values["vhd_containers"] = vhd_containers

    @builtins.property
    def create_option(self) -> builtins.str:
        result = self._values.get("create_option")
        assert result is not None, "Required property 'create_option' is missing"
        return result

    @builtins.property
    def caching(self) -> typing.Optional[builtins.str]:
        result = self._values.get("caching")
        return result

    @builtins.property
    def image(self) -> typing.Optional[builtins.str]:
        result = self._values.get("image")
        return result

    @builtins.property
    def managed_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_type")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def os_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_type")
        return result

    @builtins.property
    def vhd_containers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("vhd_containers")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetStorageProfileOsDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineScaleSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualMachineScaleSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineScaleSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineStorageDataDisk",
    jsii_struct_bases=[],
    name_mapping={
        "create_option": "createOption",
        "lun": "lun",
        "name": "name",
        "caching": "caching",
        "disk_size_gb": "diskSizeGb",
        "managed_disk_id": "managedDiskId",
        "managed_disk_type": "managedDiskType",
        "vhd_uri": "vhdUri",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class VirtualMachineStorageDataDisk:
    def __init__(
        self,
        *,
        create_option: builtins.str,
        lun: jsii.Number,
        name: builtins.str,
        caching: typing.Optional[builtins.str] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        managed_disk_id: typing.Optional[builtins.str] = None,
        managed_disk_type: typing.Optional[builtins.str] = None,
        vhd_uri: typing.Optional[builtins.str] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param create_option: -
        :param lun: -
        :param name: -
        :param caching: -
        :param disk_size_gb: -
        :param managed_disk_id: -
        :param managed_disk_type: -
        :param vhd_uri: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "create_option": create_option,
            "lun": lun,
            "name": name,
        }
        if caching is not None:
            self._values["caching"] = caching
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if managed_disk_id is not None:
            self._values["managed_disk_id"] = managed_disk_id
        if managed_disk_type is not None:
            self._values["managed_disk_type"] = managed_disk_type
        if vhd_uri is not None:
            self._values["vhd_uri"] = vhd_uri
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def create_option(self) -> builtins.str:
        result = self._values.get("create_option")
        assert result is not None, "Required property 'create_option' is missing"
        return result

    @builtins.property
    def lun(self) -> jsii.Number:
        result = self._values.get("lun")
        assert result is not None, "Required property 'lun' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def caching(self) -> typing.Optional[builtins.str]:
        result = self._values.get("caching")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def managed_disk_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_id")
        return result

    @builtins.property
    def managed_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_type")
        return result

    @builtins.property
    def vhd_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("vhd_uri")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineStorageDataDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineStorageImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "id": "id",
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class VirtualMachineStorageImageReference:
    def __init__(
        self,
        *,
        id: typing.Optional[builtins.str] = None,
        offer: typing.Optional[builtins.str] = None,
        publisher: typing.Optional[builtins.str] = None,
        sku: typing.Optional[builtins.str] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param id: -
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if id is not None:
            self._values["id"] = id
        if offer is not None:
            self._values["offer"] = offer
        if publisher is not None:
            self._values["publisher"] = publisher
        if sku is not None:
            self._values["sku"] = sku
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("id")
        return result

    @builtins.property
    def offer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("offer")
        return result

    @builtins.property
    def publisher(self) -> typing.Optional[builtins.str]:
        result = self._values.get("publisher")
        return result

    @builtins.property
    def sku(self) -> typing.Optional[builtins.str]:
        result = self._values.get("sku")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineStorageImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineStorageOsDisk",
    jsii_struct_bases=[],
    name_mapping={
        "create_option": "createOption",
        "name": "name",
        "caching": "caching",
        "disk_size_gb": "diskSizeGb",
        "image_uri": "imageUri",
        "managed_disk_id": "managedDiskId",
        "managed_disk_type": "managedDiskType",
        "os_type": "osType",
        "vhd_uri": "vhdUri",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class VirtualMachineStorageOsDisk:
    def __init__(
        self,
        *,
        create_option: builtins.str,
        name: builtins.str,
        caching: typing.Optional[builtins.str] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        image_uri: typing.Optional[builtins.str] = None,
        managed_disk_id: typing.Optional[builtins.str] = None,
        managed_disk_type: typing.Optional[builtins.str] = None,
        os_type: typing.Optional[builtins.str] = None,
        vhd_uri: typing.Optional[builtins.str] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param create_option: -
        :param name: -
        :param caching: -
        :param disk_size_gb: -
        :param image_uri: -
        :param managed_disk_id: -
        :param managed_disk_type: -
        :param os_type: -
        :param vhd_uri: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "create_option": create_option,
            "name": name,
        }
        if caching is not None:
            self._values["caching"] = caching
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if image_uri is not None:
            self._values["image_uri"] = image_uri
        if managed_disk_id is not None:
            self._values["managed_disk_id"] = managed_disk_id
        if managed_disk_type is not None:
            self._values["managed_disk_type"] = managed_disk_type
        if os_type is not None:
            self._values["os_type"] = os_type
        if vhd_uri is not None:
            self._values["vhd_uri"] = vhd_uri
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def create_option(self) -> builtins.str:
        result = self._values.get("create_option")
        assert result is not None, "Required property 'create_option' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def caching(self) -> typing.Optional[builtins.str]:
        result = self._values.get("caching")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def image_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("image_uri")
        return result

    @builtins.property
    def managed_disk_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_id")
        return result

    @builtins.property
    def managed_disk_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("managed_disk_type")
        return result

    @builtins.property
    def os_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("os_type")
        return result

    @builtins.property
    def vhd_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("vhd_uri")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineStorageOsDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualMachineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualNetwork(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualNetwork",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        address_space: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        bgp_community: typing.Optional[builtins.str] = None,
        ddos_protection_plan: typing.Optional[typing.List["VirtualNetworkDdosProtectionPlan"]] = None,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        subnet: typing.Optional[typing.List["VirtualNetworkSubnet"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualNetworkTimeouts"] = None,
        vm_protection_enabled: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param address_space: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param bgp_community: -
        :param ddos_protection_plan: ddos_protection_plan block.
        :param dns_servers: -
        :param subnet: -
        :param tags: -
        :param timeouts: timeouts block.
        :param vm_protection_enabled: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualNetworkConfig(
            address_space=address_space,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            bgp_community=bgp_community,
            ddos_protection_plan=ddos_protection_plan,
            dns_servers=dns_servers,
            subnet=subnet,
            tags=tags,
            timeouts=timeouts,
            vm_protection_enabled=vm_protection_enabled,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualNetwork, self, [scope, id, config])

    @jsii.member(jsii_name="resetBgpCommunity")
    def reset_bgp_community(self) -> None:
        return jsii.invoke(self, "resetBgpCommunity", [])

    @jsii.member(jsii_name="resetDdosProtectionPlan")
    def reset_ddos_protection_plan(self) -> None:
        return jsii.invoke(self, "resetDdosProtectionPlan", [])

    @jsii.member(jsii_name="resetDnsServers")
    def reset_dns_servers(self) -> None:
        return jsii.invoke(self, "resetDnsServers", [])

    @jsii.member(jsii_name="resetSubnet")
    def reset_subnet(self) -> None:
        return jsii.invoke(self, "resetSubnet", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVmProtectionEnabled")
    def reset_vm_protection_enabled(self) -> None:
        return jsii.invoke(self, "resetVmProtectionEnabled", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressSpaceInput")
    def address_space_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressSpaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="guid")
    def guid(self) -> builtins.str:
        return jsii.get(self, "guid")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpCommunityInput")
    def bgp_community_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "bgpCommunityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ddosProtectionPlanInput")
    def ddos_protection_plan_input(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkDdosProtectionPlan"]]:
        return jsii.get(self, "ddosProtectionPlanInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServersInput")
    def dns_servers_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "dnsServersInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnetInput")
    def subnet_input(self) -> typing.Optional[typing.List["VirtualNetworkSubnet"]]:
        return jsii.get(self, "subnetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualNetworkTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmProtectionEnabledInput")
    def vm_protection_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "vmProtectionEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressSpace")
    def address_space(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressSpace")

    @address_space.setter # type: ignore
    def address_space(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "addressSpace", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpCommunity")
    def bgp_community(self) -> builtins.str:
        return jsii.get(self, "bgpCommunity")

    @bgp_community.setter # type: ignore
    def bgp_community(self, value: builtins.str) -> None:
        jsii.set(self, "bgpCommunity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ddosProtectionPlan")
    def ddos_protection_plan(self) -> typing.List["VirtualNetworkDdosProtectionPlan"]:
        return jsii.get(self, "ddosProtectionPlan")

    @ddos_protection_plan.setter # type: ignore
    def ddos_protection_plan(
        self,
        value: typing.List["VirtualNetworkDdosProtectionPlan"],
    ) -> None:
        jsii.set(self, "ddosProtectionPlan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dnsServers")
    def dns_servers(self) -> typing.List[builtins.str]:
        return jsii.get(self, "dnsServers")

    @dns_servers.setter # type: ignore
    def dns_servers(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "dnsServers", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="subnet")
    def subnet(self) -> typing.List["VirtualNetworkSubnet"]:
        return jsii.get(self, "subnet")

    @subnet.setter # type: ignore
    def subnet(self, value: typing.List["VirtualNetworkSubnet"]) -> None:
        jsii.set(self, "subnet", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualNetworkTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualNetworkTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vmProtectionEnabled")
    def vm_protection_enabled(self) -> builtins.bool:
        return jsii.get(self, "vmProtectionEnabled")

    @vm_protection_enabled.setter # type: ignore
    def vm_protection_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "vmProtectionEnabled", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "address_space": "addressSpace",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "bgp_community": "bgpCommunity",
        "ddos_protection_plan": "ddosProtectionPlan",
        "dns_servers": "dnsServers",
        "subnet": "subnet",
        "tags": "tags",
        "timeouts": "timeouts",
        "vm_protection_enabled": "vmProtectionEnabled",
    },
)
class VirtualNetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        address_space: typing.List[builtins.str],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        bgp_community: typing.Optional[builtins.str] = None,
        ddos_protection_plan: typing.Optional[typing.List["VirtualNetworkDdosProtectionPlan"]] = None,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        subnet: typing.Optional[typing.List["VirtualNetworkSubnet"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualNetworkTimeouts"] = None,
        vm_protection_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param address_space: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param bgp_community: -
        :param ddos_protection_plan: ddos_protection_plan block.
        :param dns_servers: -
        :param subnet: -
        :param tags: -
        :param timeouts: timeouts block.
        :param vm_protection_enabled: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualNetworkTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "address_space": address_space,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if bgp_community is not None:
            self._values["bgp_community"] = bgp_community
        if ddos_protection_plan is not None:
            self._values["ddos_protection_plan"] = ddos_protection_plan
        if dns_servers is not None:
            self._values["dns_servers"] = dns_servers
        if subnet is not None:
            self._values["subnet"] = subnet
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if vm_protection_enabled is not None:
            self._values["vm_protection_enabled"] = vm_protection_enabled

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def address_space(self) -> typing.List[builtins.str]:
        result = self._values.get("address_space")
        assert result is not None, "Required property 'address_space' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def bgp_community(self) -> typing.Optional[builtins.str]:
        result = self._values.get("bgp_community")
        return result

    @builtins.property
    def ddos_protection_plan(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkDdosProtectionPlan"]]:
        """ddos_protection_plan block."""
        result = self._values.get("ddos_protection_plan")
        return result

    @builtins.property
    def dns_servers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("dns_servers")
        return result

    @builtins.property
    def subnet(self) -> typing.Optional[typing.List["VirtualNetworkSubnet"]]:
        result = self._values.get("subnet")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualNetworkTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def vm_protection_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("vm_protection_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkDdosProtectionPlan",
    jsii_struct_bases=[],
    name_mapping={"enable": "enable", "id": "id"},
)
class VirtualNetworkDdosProtectionPlan:
    def __init__(self, *, enable: builtins.bool, id: builtins.str) -> None:
        """
        :param enable: -
        :param id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enable": enable,
            "id": id,
        }

    @builtins.property
    def enable(self) -> builtins.bool:
        result = self._values.get("enable")
        assert result is not None, "Required property 'enable' is missing"
        return result

    @builtins.property
    def id(self) -> builtins.str:
        result = self._values.get("id")
        assert result is not None, "Required property 'id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkDdosProtectionPlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualNetworkGateway(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualNetworkGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        ip_configuration: typing.List["VirtualNetworkGatewayIpConfiguration"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        type: builtins.str,
        active_active: typing.Optional[builtins.bool] = None,
        bgp_settings: typing.Optional[typing.List["VirtualNetworkGatewayBgpSettings"]] = None,
        custom_route: typing.Optional[typing.List["VirtualNetworkGatewayCustomRoute"]] = None,
        default_local_network_gateway_id: typing.Optional[builtins.str] = None,
        enable_bgp: typing.Optional[builtins.bool] = None,
        generation: typing.Optional[builtins.str] = None,
        private_ip_address_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualNetworkGatewayTimeouts"] = None,
        vpn_client_configuration: typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfiguration"]] = None,
        vpn_type: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param ip_configuration: ip_configuration block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param type: -
        :param active_active: -
        :param bgp_settings: bgp_settings block.
        :param custom_route: custom_route block.
        :param default_local_network_gateway_id: -
        :param enable_bgp: -
        :param generation: -
        :param private_ip_address_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param vpn_client_configuration: vpn_client_configuration block.
        :param vpn_type: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualNetworkGatewayConfig(
            ip_configuration=ip_configuration,
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            sku=sku,
            type=type,
            active_active=active_active,
            bgp_settings=bgp_settings,
            custom_route=custom_route,
            default_local_network_gateway_id=default_local_network_gateway_id,
            enable_bgp=enable_bgp,
            generation=generation,
            private_ip_address_enabled=private_ip_address_enabled,
            tags=tags,
            timeouts=timeouts,
            vpn_client_configuration=vpn_client_configuration,
            vpn_type=vpn_type,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualNetworkGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetActiveActive")
    def reset_active_active(self) -> None:
        return jsii.invoke(self, "resetActiveActive", [])

    @jsii.member(jsii_name="resetBgpSettings")
    def reset_bgp_settings(self) -> None:
        return jsii.invoke(self, "resetBgpSettings", [])

    @jsii.member(jsii_name="resetCustomRoute")
    def reset_custom_route(self) -> None:
        return jsii.invoke(self, "resetCustomRoute", [])

    @jsii.member(jsii_name="resetDefaultLocalNetworkGatewayId")
    def reset_default_local_network_gateway_id(self) -> None:
        return jsii.invoke(self, "resetDefaultLocalNetworkGatewayId", [])

    @jsii.member(jsii_name="resetEnableBgp")
    def reset_enable_bgp(self) -> None:
        return jsii.invoke(self, "resetEnableBgp", [])

    @jsii.member(jsii_name="resetGeneration")
    def reset_generation(self) -> None:
        return jsii.invoke(self, "resetGeneration", [])

    @jsii.member(jsii_name="resetPrivateIpAddressEnabled")
    def reset_private_ip_address_enabled(self) -> None:
        return jsii.invoke(self, "resetPrivateIpAddressEnabled", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVpnClientConfiguration")
    def reset_vpn_client_configuration(self) -> None:
        return jsii.invoke(self, "resetVpnClientConfiguration", [])

    @jsii.member(jsii_name="resetVpnType")
    def reset_vpn_type(self) -> None:
        return jsii.invoke(self, "resetVpnType", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfigurationInput")
    def ip_configuration_input(
        self,
    ) -> typing.List["VirtualNetworkGatewayIpConfiguration"]:
        return jsii.get(self, "ipConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activeActiveInput")
    def active_active_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "activeActiveInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpSettingsInput")
    def bgp_settings_input(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayBgpSettings"]]:
        return jsii.get(self, "bgpSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customRouteInput")
    def custom_route_input(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayCustomRoute"]]:
        return jsii.get(self, "customRouteInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultLocalNetworkGatewayIdInput")
    def default_local_network_gateway_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "defaultLocalNetworkGatewayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBgpInput")
    def enable_bgp_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableBgpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="generationInput")
    def generation_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "generationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressEnabledInput")
    def private_ip_address_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "privateIpAddressEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualNetworkGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnClientConfigurationInput")
    def vpn_client_configuration_input(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfiguration"]]:
        return jsii.get(self, "vpnClientConfigurationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnTypeInput")
    def vpn_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "vpnTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="activeActive")
    def active_active(self) -> builtins.bool:
        return jsii.get(self, "activeActive")

    @active_active.setter # type: ignore
    def active_active(self, value: builtins.bool) -> None:
        jsii.set(self, "activeActive", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpSettings")
    def bgp_settings(self) -> typing.List["VirtualNetworkGatewayBgpSettings"]:
        return jsii.get(self, "bgpSettings")

    @bgp_settings.setter # type: ignore
    def bgp_settings(
        self,
        value: typing.List["VirtualNetworkGatewayBgpSettings"],
    ) -> None:
        jsii.set(self, "bgpSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customRoute")
    def custom_route(self) -> typing.List["VirtualNetworkGatewayCustomRoute"]:
        return jsii.get(self, "customRoute")

    @custom_route.setter # type: ignore
    def custom_route(
        self,
        value: typing.List["VirtualNetworkGatewayCustomRoute"],
    ) -> None:
        jsii.set(self, "customRoute", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="defaultLocalNetworkGatewayId")
    def default_local_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "defaultLocalNetworkGatewayId")

    @default_local_network_gateway_id.setter # type: ignore
    def default_local_network_gateway_id(self, value: builtins.str) -> None:
        jsii.set(self, "defaultLocalNetworkGatewayId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBgp")
    def enable_bgp(self) -> builtins.bool:
        return jsii.get(self, "enableBgp")

    @enable_bgp.setter # type: ignore
    def enable_bgp(self, value: builtins.bool) -> None:
        jsii.set(self, "enableBgp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="generation")
    def generation(self) -> builtins.str:
        return jsii.get(self, "generation")

    @generation.setter # type: ignore
    def generation(self, value: builtins.str) -> None:
        jsii.set(self, "generation", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(self) -> typing.List["VirtualNetworkGatewayIpConfiguration"]:
        return jsii.get(self, "ipConfiguration")

    @ip_configuration.setter # type: ignore
    def ip_configuration(
        self,
        value: typing.List["VirtualNetworkGatewayIpConfiguration"],
    ) -> None:
        jsii.set(self, "ipConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddressEnabled")
    def private_ip_address_enabled(self) -> builtins.bool:
        return jsii.get(self, "privateIpAddressEnabled")

    @private_ip_address_enabled.setter # type: ignore
    def private_ip_address_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "privateIpAddressEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualNetworkGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualNetworkGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnClientConfiguration")
    def vpn_client_configuration(
        self,
    ) -> typing.List["VirtualNetworkGatewayVpnClientConfiguration"]:
        return jsii.get(self, "vpnClientConfiguration")

    @vpn_client_configuration.setter # type: ignore
    def vpn_client_configuration(
        self,
        value: typing.List["VirtualNetworkGatewayVpnClientConfiguration"],
    ) -> None:
        jsii.set(self, "vpnClientConfiguration", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnType")
    def vpn_type(self) -> builtins.str:
        return jsii.get(self, "vpnType")

    @vpn_type.setter # type: ignore
    def vpn_type(self, value: builtins.str) -> None:
        jsii.set(self, "vpnType", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayBgpSettings",
    jsii_struct_bases=[],
    name_mapping={
        "asn": "asn",
        "peering_address": "peeringAddress",
        "peer_weight": "peerWeight",
    },
)
class VirtualNetworkGatewayBgpSettings:
    def __init__(
        self,
        *,
        asn: typing.Optional[jsii.Number] = None,
        peering_address: typing.Optional[builtins.str] = None,
        peer_weight: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param asn: -
        :param peering_address: -
        :param peer_weight: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if asn is not None:
            self._values["asn"] = asn
        if peering_address is not None:
            self._values["peering_address"] = peering_address
        if peer_weight is not None:
            self._values["peer_weight"] = peer_weight

    @builtins.property
    def asn(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("asn")
        return result

    @builtins.property
    def peering_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("peering_address")
        return result

    @builtins.property
    def peer_weight(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("peer_weight")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayBgpSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "ip_configuration": "ipConfiguration",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "type": "type",
        "active_active": "activeActive",
        "bgp_settings": "bgpSettings",
        "custom_route": "customRoute",
        "default_local_network_gateway_id": "defaultLocalNetworkGatewayId",
        "enable_bgp": "enableBgp",
        "generation": "generation",
        "private_ip_address_enabled": "privateIpAddressEnabled",
        "tags": "tags",
        "timeouts": "timeouts",
        "vpn_client_configuration": "vpnClientConfiguration",
        "vpn_type": "vpnType",
    },
)
class VirtualNetworkGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        ip_configuration: typing.List["VirtualNetworkGatewayIpConfiguration"],
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        sku: builtins.str,
        type: builtins.str,
        active_active: typing.Optional[builtins.bool] = None,
        bgp_settings: typing.Optional[typing.List[VirtualNetworkGatewayBgpSettings]] = None,
        custom_route: typing.Optional[typing.List["VirtualNetworkGatewayCustomRoute"]] = None,
        default_local_network_gateway_id: typing.Optional[builtins.str] = None,
        enable_bgp: typing.Optional[builtins.bool] = None,
        generation: typing.Optional[builtins.str] = None,
        private_ip_address_enabled: typing.Optional[builtins.bool] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualNetworkGatewayTimeouts"] = None,
        vpn_client_configuration: typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfiguration"]] = None,
        vpn_type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param ip_configuration: ip_configuration block.
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param sku: -
        :param type: -
        :param active_active: -
        :param bgp_settings: bgp_settings block.
        :param custom_route: custom_route block.
        :param default_local_network_gateway_id: -
        :param enable_bgp: -
        :param generation: -
        :param private_ip_address_enabled: -
        :param tags: -
        :param timeouts: timeouts block.
        :param vpn_client_configuration: vpn_client_configuration block.
        :param vpn_type: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualNetworkGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "ip_configuration": ip_configuration,
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "sku": sku,
            "type": type,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if active_active is not None:
            self._values["active_active"] = active_active
        if bgp_settings is not None:
            self._values["bgp_settings"] = bgp_settings
        if custom_route is not None:
            self._values["custom_route"] = custom_route
        if default_local_network_gateway_id is not None:
            self._values["default_local_network_gateway_id"] = default_local_network_gateway_id
        if enable_bgp is not None:
            self._values["enable_bgp"] = enable_bgp
        if generation is not None:
            self._values["generation"] = generation
        if private_ip_address_enabled is not None:
            self._values["private_ip_address_enabled"] = private_ip_address_enabled
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if vpn_client_configuration is not None:
            self._values["vpn_client_configuration"] = vpn_client_configuration
        if vpn_type is not None:
            self._values["vpn_type"] = vpn_type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def ip_configuration(self) -> typing.List["VirtualNetworkGatewayIpConfiguration"]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        assert result is not None, "Required property 'ip_configuration' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def active_active(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("active_active")
        return result

    @builtins.property
    def bgp_settings(
        self,
    ) -> typing.Optional[typing.List[VirtualNetworkGatewayBgpSettings]]:
        """bgp_settings block."""
        result = self._values.get("bgp_settings")
        return result

    @builtins.property
    def custom_route(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayCustomRoute"]]:
        """custom_route block."""
        result = self._values.get("custom_route")
        return result

    @builtins.property
    def default_local_network_gateway_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("default_local_network_gateway_id")
        return result

    @builtins.property
    def enable_bgp(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_bgp")
        return result

    @builtins.property
    def generation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("generation")
        return result

    @builtins.property
    def private_ip_address_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("private_ip_address_enabled")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualNetworkGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def vpn_client_configuration(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfiguration"]]:
        """vpn_client_configuration block."""
        result = self._values.get("vpn_client_configuration")
        return result

    @builtins.property
    def vpn_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("vpn_type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualNetworkGatewayConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualNetworkGatewayConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        virtual_network_gateway_id: builtins.str,
        authorization_key: typing.Optional[builtins.str] = None,
        connection_protocol: typing.Optional[builtins.str] = None,
        dpd_timeout_seconds: typing.Optional[jsii.Number] = None,
        enable_bgp: typing.Optional[builtins.bool] = None,
        express_route_circuit_id: typing.Optional[builtins.str] = None,
        express_route_gateway_bypass: typing.Optional[builtins.bool] = None,
        ipsec_policy: typing.Optional[typing.List["VirtualNetworkGatewayConnectionIpsecPolicy"]] = None,
        local_azure_ip_address_enabled: typing.Optional[builtins.bool] = None,
        local_network_gateway_id: typing.Optional[builtins.str] = None,
        peer_virtual_network_gateway_id: typing.Optional[builtins.str] = None,
        routing_weight: typing.Optional[jsii.Number] = None,
        shared_key: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualNetworkGatewayConnectionTimeouts"] = None,
        traffic_selector_policy: typing.Optional[typing.List["VirtualNetworkGatewayConnectionTrafficSelectorPolicy"]] = None,
        use_policy_based_traffic_selectors: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param virtual_network_gateway_id: -
        :param authorization_key: -
        :param connection_protocol: -
        :param dpd_timeout_seconds: -
        :param enable_bgp: -
        :param express_route_circuit_id: -
        :param express_route_gateway_bypass: -
        :param ipsec_policy: ipsec_policy block.
        :param local_azure_ip_address_enabled: -
        :param local_network_gateway_id: -
        :param peer_virtual_network_gateway_id: -
        :param routing_weight: -
        :param shared_key: -
        :param tags: -
        :param timeouts: timeouts block.
        :param traffic_selector_policy: traffic_selector_policy block.
        :param use_policy_based_traffic_selectors: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualNetworkGatewayConnectionConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            type=type,
            virtual_network_gateway_id=virtual_network_gateway_id,
            authorization_key=authorization_key,
            connection_protocol=connection_protocol,
            dpd_timeout_seconds=dpd_timeout_seconds,
            enable_bgp=enable_bgp,
            express_route_circuit_id=express_route_circuit_id,
            express_route_gateway_bypass=express_route_gateway_bypass,
            ipsec_policy=ipsec_policy,
            local_azure_ip_address_enabled=local_azure_ip_address_enabled,
            local_network_gateway_id=local_network_gateway_id,
            peer_virtual_network_gateway_id=peer_virtual_network_gateway_id,
            routing_weight=routing_weight,
            shared_key=shared_key,
            tags=tags,
            timeouts=timeouts,
            traffic_selector_policy=traffic_selector_policy,
            use_policy_based_traffic_selectors=use_policy_based_traffic_selectors,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualNetworkGatewayConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetAuthorizationKey")
    def reset_authorization_key(self) -> None:
        return jsii.invoke(self, "resetAuthorizationKey", [])

    @jsii.member(jsii_name="resetConnectionProtocol")
    def reset_connection_protocol(self) -> None:
        return jsii.invoke(self, "resetConnectionProtocol", [])

    @jsii.member(jsii_name="resetDpdTimeoutSeconds")
    def reset_dpd_timeout_seconds(self) -> None:
        return jsii.invoke(self, "resetDpdTimeoutSeconds", [])

    @jsii.member(jsii_name="resetEnableBgp")
    def reset_enable_bgp(self) -> None:
        return jsii.invoke(self, "resetEnableBgp", [])

    @jsii.member(jsii_name="resetExpressRouteCircuitId")
    def reset_express_route_circuit_id(self) -> None:
        return jsii.invoke(self, "resetExpressRouteCircuitId", [])

    @jsii.member(jsii_name="resetExpressRouteGatewayBypass")
    def reset_express_route_gateway_bypass(self) -> None:
        return jsii.invoke(self, "resetExpressRouteGatewayBypass", [])

    @jsii.member(jsii_name="resetIpsecPolicy")
    def reset_ipsec_policy(self) -> None:
        return jsii.invoke(self, "resetIpsecPolicy", [])

    @jsii.member(jsii_name="resetLocalAzureIpAddressEnabled")
    def reset_local_azure_ip_address_enabled(self) -> None:
        return jsii.invoke(self, "resetLocalAzureIpAddressEnabled", [])

    @jsii.member(jsii_name="resetLocalNetworkGatewayId")
    def reset_local_network_gateway_id(self) -> None:
        return jsii.invoke(self, "resetLocalNetworkGatewayId", [])

    @jsii.member(jsii_name="resetPeerVirtualNetworkGatewayId")
    def reset_peer_virtual_network_gateway_id(self) -> None:
        return jsii.invoke(self, "resetPeerVirtualNetworkGatewayId", [])

    @jsii.member(jsii_name="resetRoutingWeight")
    def reset_routing_weight(self) -> None:
        return jsii.invoke(self, "resetRoutingWeight", [])

    @jsii.member(jsii_name="resetSharedKey")
    def reset_shared_key(self) -> None:
        return jsii.invoke(self, "resetSharedKey", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTrafficSelectorPolicy")
    def reset_traffic_selector_policy(self) -> None:
        return jsii.invoke(self, "resetTrafficSelectorPolicy", [])

    @jsii.member(jsii_name="resetUsePolicyBasedTrafficSelectors")
    def reset_use_policy_based_traffic_selectors(self) -> None:
        return jsii.invoke(self, "resetUsePolicyBasedTrafficSelectors", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> builtins.str:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkGatewayIdInput")
    def virtual_network_gateway_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkGatewayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationKeyInput")
    def authorization_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "authorizationKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionProtocolInput")
    def connection_protocol_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "connectionProtocolInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dpdTimeoutSecondsInput")
    def dpd_timeout_seconds_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dpdTimeoutSecondsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBgpInput")
    def enable_bgp_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableBgpInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteCircuitIdInput")
    def express_route_circuit_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "expressRouteCircuitIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteGatewayBypassInput")
    def express_route_gateway_bypass_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "expressRouteGatewayBypassInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipsecPolicyInput")
    def ipsec_policy_input(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayConnectionIpsecPolicy"]]:
        return jsii.get(self, "ipsecPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localAzureIpAddressEnabledInput")
    def local_azure_ip_address_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "localAzureIpAddressEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localNetworkGatewayIdInput")
    def local_network_gateway_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "localNetworkGatewayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerVirtualNetworkGatewayIdInput")
    def peer_virtual_network_gateway_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "peerVirtualNetworkGatewayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routingWeightInput")
    def routing_weight_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "routingWeightInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedKeyInput")
    def shared_key_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sharedKeyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["VirtualNetworkGatewayConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trafficSelectorPolicyInput")
    def traffic_selector_policy_input(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayConnectionTrafficSelectorPolicy"]]:
        return jsii.get(self, "trafficSelectorPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usePolicyBasedTrafficSelectorsInput")
    def use_policy_based_traffic_selectors_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "usePolicyBasedTrafficSelectorsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="authorizationKey")
    def authorization_key(self) -> builtins.str:
        return jsii.get(self, "authorizationKey")

    @authorization_key.setter # type: ignore
    def authorization_key(self, value: builtins.str) -> None:
        jsii.set(self, "authorizationKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="connectionProtocol")
    def connection_protocol(self) -> builtins.str:
        return jsii.get(self, "connectionProtocol")

    @connection_protocol.setter # type: ignore
    def connection_protocol(self, value: builtins.str) -> None:
        jsii.set(self, "connectionProtocol", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dpdTimeoutSeconds")
    def dpd_timeout_seconds(self) -> jsii.Number:
        return jsii.get(self, "dpdTimeoutSeconds")

    @dpd_timeout_seconds.setter # type: ignore
    def dpd_timeout_seconds(self, value: jsii.Number) -> None:
        jsii.set(self, "dpdTimeoutSeconds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableBgp")
    def enable_bgp(self) -> builtins.bool:
        return jsii.get(self, "enableBgp")

    @enable_bgp.setter # type: ignore
    def enable_bgp(self, value: builtins.bool) -> None:
        jsii.set(self, "enableBgp", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteCircuitId")
    def express_route_circuit_id(self) -> builtins.str:
        return jsii.get(self, "expressRouteCircuitId")

    @express_route_circuit_id.setter # type: ignore
    def express_route_circuit_id(self, value: builtins.str) -> None:
        jsii.set(self, "expressRouteCircuitId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="expressRouteGatewayBypass")
    def express_route_gateway_bypass(self) -> builtins.bool:
        return jsii.get(self, "expressRouteGatewayBypass")

    @express_route_gateway_bypass.setter # type: ignore
    def express_route_gateway_bypass(self, value: builtins.bool) -> None:
        jsii.set(self, "expressRouteGatewayBypass", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipsecPolicy")
    def ipsec_policy(self) -> typing.List["VirtualNetworkGatewayConnectionIpsecPolicy"]:
        return jsii.get(self, "ipsecPolicy")

    @ipsec_policy.setter # type: ignore
    def ipsec_policy(
        self,
        value: typing.List["VirtualNetworkGatewayConnectionIpsecPolicy"],
    ) -> None:
        jsii.set(self, "ipsecPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localAzureIpAddressEnabled")
    def local_azure_ip_address_enabled(self) -> builtins.bool:
        return jsii.get(self, "localAzureIpAddressEnabled")

    @local_azure_ip_address_enabled.setter # type: ignore
    def local_azure_ip_address_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "localAzureIpAddressEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="localNetworkGatewayId")
    def local_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "localNetworkGatewayId")

    @local_network_gateway_id.setter # type: ignore
    def local_network_gateway_id(self, value: builtins.str) -> None:
        jsii.set(self, "localNetworkGatewayId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="peerVirtualNetworkGatewayId")
    def peer_virtual_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "peerVirtualNetworkGatewayId")

    @peer_virtual_network_gateway_id.setter # type: ignore
    def peer_virtual_network_gateway_id(self, value: builtins.str) -> None:
        jsii.set(self, "peerVirtualNetworkGatewayId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routingWeight")
    def routing_weight(self) -> jsii.Number:
        return jsii.get(self, "routingWeight")

    @routing_weight.setter # type: ignore
    def routing_weight(self, value: jsii.Number) -> None:
        jsii.set(self, "routingWeight", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sharedKey")
    def shared_key(self) -> builtins.str:
        return jsii.get(self, "sharedKey")

    @shared_key.setter # type: ignore
    def shared_key(self, value: builtins.str) -> None:
        jsii.set(self, "sharedKey", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualNetworkGatewayConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualNetworkGatewayConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="trafficSelectorPolicy")
    def traffic_selector_policy(
        self,
    ) -> typing.List["VirtualNetworkGatewayConnectionTrafficSelectorPolicy"]:
        return jsii.get(self, "trafficSelectorPolicy")

    @traffic_selector_policy.setter # type: ignore
    def traffic_selector_policy(
        self,
        value: typing.List["VirtualNetworkGatewayConnectionTrafficSelectorPolicy"],
    ) -> None:
        jsii.set(self, "trafficSelectorPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="usePolicyBasedTrafficSelectors")
    def use_policy_based_traffic_selectors(self) -> builtins.bool:
        return jsii.get(self, "usePolicyBasedTrafficSelectors")

    @use_policy_based_traffic_selectors.setter # type: ignore
    def use_policy_based_traffic_selectors(self, value: builtins.bool) -> None:
        jsii.set(self, "usePolicyBasedTrafficSelectors", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkGatewayId")
    def virtual_network_gateway_id(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkGatewayId")

    @virtual_network_gateway_id.setter # type: ignore
    def virtual_network_gateway_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualNetworkGatewayId", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "type": "type",
        "virtual_network_gateway_id": "virtualNetworkGatewayId",
        "authorization_key": "authorizationKey",
        "connection_protocol": "connectionProtocol",
        "dpd_timeout_seconds": "dpdTimeoutSeconds",
        "enable_bgp": "enableBgp",
        "express_route_circuit_id": "expressRouteCircuitId",
        "express_route_gateway_bypass": "expressRouteGatewayBypass",
        "ipsec_policy": "ipsecPolicy",
        "local_azure_ip_address_enabled": "localAzureIpAddressEnabled",
        "local_network_gateway_id": "localNetworkGatewayId",
        "peer_virtual_network_gateway_id": "peerVirtualNetworkGatewayId",
        "routing_weight": "routingWeight",
        "shared_key": "sharedKey",
        "tags": "tags",
        "timeouts": "timeouts",
        "traffic_selector_policy": "trafficSelectorPolicy",
        "use_policy_based_traffic_selectors": "usePolicyBasedTrafficSelectors",
    },
)
class VirtualNetworkGatewayConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        type: builtins.str,
        virtual_network_gateway_id: builtins.str,
        authorization_key: typing.Optional[builtins.str] = None,
        connection_protocol: typing.Optional[builtins.str] = None,
        dpd_timeout_seconds: typing.Optional[jsii.Number] = None,
        enable_bgp: typing.Optional[builtins.bool] = None,
        express_route_circuit_id: typing.Optional[builtins.str] = None,
        express_route_gateway_bypass: typing.Optional[builtins.bool] = None,
        ipsec_policy: typing.Optional[typing.List["VirtualNetworkGatewayConnectionIpsecPolicy"]] = None,
        local_azure_ip_address_enabled: typing.Optional[builtins.bool] = None,
        local_network_gateway_id: typing.Optional[builtins.str] = None,
        peer_virtual_network_gateway_id: typing.Optional[builtins.str] = None,
        routing_weight: typing.Optional[jsii.Number] = None,
        shared_key: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualNetworkGatewayConnectionTimeouts"] = None,
        traffic_selector_policy: typing.Optional[typing.List["VirtualNetworkGatewayConnectionTrafficSelectorPolicy"]] = None,
        use_policy_based_traffic_selectors: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param type: -
        :param virtual_network_gateway_id: -
        :param authorization_key: -
        :param connection_protocol: -
        :param dpd_timeout_seconds: -
        :param enable_bgp: -
        :param express_route_circuit_id: -
        :param express_route_gateway_bypass: -
        :param ipsec_policy: ipsec_policy block.
        :param local_azure_ip_address_enabled: -
        :param local_network_gateway_id: -
        :param peer_virtual_network_gateway_id: -
        :param routing_weight: -
        :param shared_key: -
        :param tags: -
        :param timeouts: timeouts block.
        :param traffic_selector_policy: traffic_selector_policy block.
        :param use_policy_based_traffic_selectors: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualNetworkGatewayConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "type": type,
            "virtual_network_gateway_id": virtual_network_gateway_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if authorization_key is not None:
            self._values["authorization_key"] = authorization_key
        if connection_protocol is not None:
            self._values["connection_protocol"] = connection_protocol
        if dpd_timeout_seconds is not None:
            self._values["dpd_timeout_seconds"] = dpd_timeout_seconds
        if enable_bgp is not None:
            self._values["enable_bgp"] = enable_bgp
        if express_route_circuit_id is not None:
            self._values["express_route_circuit_id"] = express_route_circuit_id
        if express_route_gateway_bypass is not None:
            self._values["express_route_gateway_bypass"] = express_route_gateway_bypass
        if ipsec_policy is not None:
            self._values["ipsec_policy"] = ipsec_policy
        if local_azure_ip_address_enabled is not None:
            self._values["local_azure_ip_address_enabled"] = local_azure_ip_address_enabled
        if local_network_gateway_id is not None:
            self._values["local_network_gateway_id"] = local_network_gateway_id
        if peer_virtual_network_gateway_id is not None:
            self._values["peer_virtual_network_gateway_id"] = peer_virtual_network_gateway_id
        if routing_weight is not None:
            self._values["routing_weight"] = routing_weight
        if shared_key is not None:
            self._values["shared_key"] = shared_key
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if traffic_selector_policy is not None:
            self._values["traffic_selector_policy"] = traffic_selector_policy
        if use_policy_based_traffic_selectors is not None:
            self._values["use_policy_based_traffic_selectors"] = use_policy_based_traffic_selectors

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def virtual_network_gateway_id(self) -> builtins.str:
        result = self._values.get("virtual_network_gateway_id")
        assert result is not None, "Required property 'virtual_network_gateway_id' is missing"
        return result

    @builtins.property
    def authorization_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("authorization_key")
        return result

    @builtins.property
    def connection_protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("connection_protocol")
        return result

    @builtins.property
    def dpd_timeout_seconds(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("dpd_timeout_seconds")
        return result

    @builtins.property
    def enable_bgp(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_bgp")
        return result

    @builtins.property
    def express_route_circuit_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("express_route_circuit_id")
        return result

    @builtins.property
    def express_route_gateway_bypass(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("express_route_gateway_bypass")
        return result

    @builtins.property
    def ipsec_policy(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayConnectionIpsecPolicy"]]:
        """ipsec_policy block."""
        result = self._values.get("ipsec_policy")
        return result

    @builtins.property
    def local_azure_ip_address_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("local_azure_ip_address_enabled")
        return result

    @builtins.property
    def local_network_gateway_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("local_network_gateway_id")
        return result

    @builtins.property
    def peer_virtual_network_gateway_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("peer_virtual_network_gateway_id")
        return result

    @builtins.property
    def routing_weight(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("routing_weight")
        return result

    @builtins.property
    def shared_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("shared_key")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualNetworkGatewayConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def traffic_selector_policy(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayConnectionTrafficSelectorPolicy"]]:
        """traffic_selector_policy block."""
        result = self._values.get("traffic_selector_policy")
        return result

    @builtins.property
    def use_policy_based_traffic_selectors(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_policy_based_traffic_selectors")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayConnectionIpsecPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "dh_group": "dhGroup",
        "ike_encryption": "ikeEncryption",
        "ike_integrity": "ikeIntegrity",
        "ipsec_encryption": "ipsecEncryption",
        "ipsec_integrity": "ipsecIntegrity",
        "pfs_group": "pfsGroup",
        "sa_datasize": "saDatasize",
        "sa_lifetime": "saLifetime",
    },
)
class VirtualNetworkGatewayConnectionIpsecPolicy:
    def __init__(
        self,
        *,
        dh_group: builtins.str,
        ike_encryption: builtins.str,
        ike_integrity: builtins.str,
        ipsec_encryption: builtins.str,
        ipsec_integrity: builtins.str,
        pfs_group: builtins.str,
        sa_datasize: typing.Optional[jsii.Number] = None,
        sa_lifetime: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param dh_group: -
        :param ike_encryption: -
        :param ike_integrity: -
        :param ipsec_encryption: -
        :param ipsec_integrity: -
        :param pfs_group: -
        :param sa_datasize: -
        :param sa_lifetime: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "dh_group": dh_group,
            "ike_encryption": ike_encryption,
            "ike_integrity": ike_integrity,
            "ipsec_encryption": ipsec_encryption,
            "ipsec_integrity": ipsec_integrity,
            "pfs_group": pfs_group,
        }
        if sa_datasize is not None:
            self._values["sa_datasize"] = sa_datasize
        if sa_lifetime is not None:
            self._values["sa_lifetime"] = sa_lifetime

    @builtins.property
    def dh_group(self) -> builtins.str:
        result = self._values.get("dh_group")
        assert result is not None, "Required property 'dh_group' is missing"
        return result

    @builtins.property
    def ike_encryption(self) -> builtins.str:
        result = self._values.get("ike_encryption")
        assert result is not None, "Required property 'ike_encryption' is missing"
        return result

    @builtins.property
    def ike_integrity(self) -> builtins.str:
        result = self._values.get("ike_integrity")
        assert result is not None, "Required property 'ike_integrity' is missing"
        return result

    @builtins.property
    def ipsec_encryption(self) -> builtins.str:
        result = self._values.get("ipsec_encryption")
        assert result is not None, "Required property 'ipsec_encryption' is missing"
        return result

    @builtins.property
    def ipsec_integrity(self) -> builtins.str:
        result = self._values.get("ipsec_integrity")
        assert result is not None, "Required property 'ipsec_integrity' is missing"
        return result

    @builtins.property
    def pfs_group(self) -> builtins.str:
        result = self._values.get("pfs_group")
        assert result is not None, "Required property 'pfs_group' is missing"
        return result

    @builtins.property
    def sa_datasize(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("sa_datasize")
        return result

    @builtins.property
    def sa_lifetime(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("sa_lifetime")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayConnectionIpsecPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualNetworkGatewayConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayConnectionTrafficSelectorPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "local_address_cidrs": "localAddressCidrs",
        "remote_address_cidrs": "remoteAddressCidrs",
    },
)
class VirtualNetworkGatewayConnectionTrafficSelectorPolicy:
    def __init__(
        self,
        *,
        local_address_cidrs: typing.List[builtins.str],
        remote_address_cidrs: typing.List[builtins.str],
    ) -> None:
        """
        :param local_address_cidrs: -
        :param remote_address_cidrs: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "local_address_cidrs": local_address_cidrs,
            "remote_address_cidrs": remote_address_cidrs,
        }

    @builtins.property
    def local_address_cidrs(self) -> typing.List[builtins.str]:
        result = self._values.get("local_address_cidrs")
        assert result is not None, "Required property 'local_address_cidrs' is missing"
        return result

    @builtins.property
    def remote_address_cidrs(self) -> typing.List[builtins.str]:
        result = self._values.get("remote_address_cidrs")
        assert result is not None, "Required property 'remote_address_cidrs' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayConnectionTrafficSelectorPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayCustomRoute",
    jsii_struct_bases=[],
    name_mapping={"address_prefixes": "addressPrefixes"},
)
class VirtualNetworkGatewayCustomRoute:
    def __init__(
        self,
        *,
        address_prefixes: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param address_prefixes: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if address_prefixes is not None:
            self._values["address_prefixes"] = address_prefixes

    @builtins.property
    def address_prefixes(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("address_prefixes")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayCustomRoute(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "public_ip_address_id": "publicIpAddressId",
        "subnet_id": "subnetId",
        "name": "name",
        "private_ip_address_allocation": "privateIpAddressAllocation",
    },
)
class VirtualNetworkGatewayIpConfiguration:
    def __init__(
        self,
        *,
        public_ip_address_id: builtins.str,
        subnet_id: builtins.str,
        name: typing.Optional[builtins.str] = None,
        private_ip_address_allocation: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param public_ip_address_id: -
        :param subnet_id: -
        :param name: -
        :param private_ip_address_allocation: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "public_ip_address_id": public_ip_address_id,
            "subnet_id": subnet_id,
        }
        if name is not None:
            self._values["name"] = name
        if private_ip_address_allocation is not None:
            self._values["private_ip_address_allocation"] = private_ip_address_allocation

    @builtins.property
    def public_ip_address_id(self) -> builtins.str:
        result = self._values.get("public_ip_address_id")
        assert result is not None, "Required property 'public_ip_address_id' is missing"
        return result

    @builtins.property
    def subnet_id(self) -> builtins.str:
        result = self._values.get("subnet_id")
        assert result is not None, "Required property 'subnet_id' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def private_ip_address_allocation(self) -> typing.Optional[builtins.str]:
        result = self._values.get("private_ip_address_allocation")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualNetworkGatewayTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayVpnClientConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "address_space": "addressSpace",
        "aad_audience": "aadAudience",
        "aad_issuer": "aadIssuer",
        "aad_tenant": "aadTenant",
        "radius_server_address": "radiusServerAddress",
        "radius_server_secret": "radiusServerSecret",
        "revoked_certificate": "revokedCertificate",
        "root_certificate": "rootCertificate",
        "vpn_client_protocols": "vpnClientProtocols",
    },
)
class VirtualNetworkGatewayVpnClientConfiguration:
    def __init__(
        self,
        *,
        address_space: typing.List[builtins.str],
        aad_audience: typing.Optional[builtins.str] = None,
        aad_issuer: typing.Optional[builtins.str] = None,
        aad_tenant: typing.Optional[builtins.str] = None,
        radius_server_address: typing.Optional[builtins.str] = None,
        radius_server_secret: typing.Optional[builtins.str] = None,
        revoked_certificate: typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfigurationRevokedCertificate"]] = None,
        root_certificate: typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfigurationRootCertificate"]] = None,
        vpn_client_protocols: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param address_space: -
        :param aad_audience: -
        :param aad_issuer: -
        :param aad_tenant: -
        :param radius_server_address: -
        :param radius_server_secret: -
        :param revoked_certificate: revoked_certificate block.
        :param root_certificate: root_certificate block.
        :param vpn_client_protocols: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "address_space": address_space,
        }
        if aad_audience is not None:
            self._values["aad_audience"] = aad_audience
        if aad_issuer is not None:
            self._values["aad_issuer"] = aad_issuer
        if aad_tenant is not None:
            self._values["aad_tenant"] = aad_tenant
        if radius_server_address is not None:
            self._values["radius_server_address"] = radius_server_address
        if radius_server_secret is not None:
            self._values["radius_server_secret"] = radius_server_secret
        if revoked_certificate is not None:
            self._values["revoked_certificate"] = revoked_certificate
        if root_certificate is not None:
            self._values["root_certificate"] = root_certificate
        if vpn_client_protocols is not None:
            self._values["vpn_client_protocols"] = vpn_client_protocols

    @builtins.property
    def address_space(self) -> typing.List[builtins.str]:
        result = self._values.get("address_space")
        assert result is not None, "Required property 'address_space' is missing"
        return result

    @builtins.property
    def aad_audience(self) -> typing.Optional[builtins.str]:
        result = self._values.get("aad_audience")
        return result

    @builtins.property
    def aad_issuer(self) -> typing.Optional[builtins.str]:
        result = self._values.get("aad_issuer")
        return result

    @builtins.property
    def aad_tenant(self) -> typing.Optional[builtins.str]:
        result = self._values.get("aad_tenant")
        return result

    @builtins.property
    def radius_server_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("radius_server_address")
        return result

    @builtins.property
    def radius_server_secret(self) -> typing.Optional[builtins.str]:
        result = self._values.get("radius_server_secret")
        return result

    @builtins.property
    def revoked_certificate(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfigurationRevokedCertificate"]]:
        """revoked_certificate block."""
        result = self._values.get("revoked_certificate")
        return result

    @builtins.property
    def root_certificate(
        self,
    ) -> typing.Optional[typing.List["VirtualNetworkGatewayVpnClientConfigurationRootCertificate"]]:
        """root_certificate block."""
        result = self._values.get("root_certificate")
        return result

    @builtins.property
    def vpn_client_protocols(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("vpn_client_protocols")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayVpnClientConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayVpnClientConfigurationRevokedCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "thumbprint": "thumbprint"},
)
class VirtualNetworkGatewayVpnClientConfigurationRevokedCertificate:
    def __init__(self, *, name: builtins.str, thumbprint: builtins.str) -> None:
        """
        :param name: -
        :param thumbprint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "thumbprint": thumbprint,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayVpnClientConfigurationRevokedCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkGatewayVpnClientConfigurationRootCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "public_cert_data": "publicCertData"},
)
class VirtualNetworkGatewayVpnClientConfigurationRootCertificate:
    def __init__(self, *, name: builtins.str, public_cert_data: builtins.str) -> None:
        """
        :param name: -
        :param public_cert_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "public_cert_data": public_cert_data,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def public_cert_data(self) -> builtins.str:
        result = self._values.get("public_cert_data")
        assert result is not None, "Required property 'public_cert_data' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkGatewayVpnClientConfigurationRootCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualNetworkPeering(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualNetworkPeering",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        remote_virtual_network_id: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_name: builtins.str,
        allow_forwarded_traffic: typing.Optional[builtins.bool] = None,
        allow_gateway_transit: typing.Optional[builtins.bool] = None,
        allow_virtual_network_access: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["VirtualNetworkPeeringTimeouts"] = None,
        use_remote_gateways: typing.Optional[builtins.bool] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param remote_virtual_network_id: -
        :param resource_group_name: -
        :param virtual_network_name: -
        :param allow_forwarded_traffic: -
        :param allow_gateway_transit: -
        :param allow_virtual_network_access: -
        :param timeouts: timeouts block.
        :param use_remote_gateways: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualNetworkPeeringConfig(
            name=name,
            remote_virtual_network_id=remote_virtual_network_id,
            resource_group_name=resource_group_name,
            virtual_network_name=virtual_network_name,
            allow_forwarded_traffic=allow_forwarded_traffic,
            allow_gateway_transit=allow_gateway_transit,
            allow_virtual_network_access=allow_virtual_network_access,
            timeouts=timeouts,
            use_remote_gateways=use_remote_gateways,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualNetworkPeering, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowForwardedTraffic")
    def reset_allow_forwarded_traffic(self) -> None:
        return jsii.invoke(self, "resetAllowForwardedTraffic", [])

    @jsii.member(jsii_name="resetAllowGatewayTransit")
    def reset_allow_gateway_transit(self) -> None:
        return jsii.invoke(self, "resetAllowGatewayTransit", [])

    @jsii.member(jsii_name="resetAllowVirtualNetworkAccess")
    def reset_allow_virtual_network_access(self) -> None:
        return jsii.invoke(self, "resetAllowVirtualNetworkAccess", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetUseRemoteGateways")
    def reset_use_remote_gateways(self) -> None:
        return jsii.invoke(self, "resetUseRemoteGateways", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteVirtualNetworkIdInput")
    def remote_virtual_network_id_input(self) -> builtins.str:
        return jsii.get(self, "remoteVirtualNetworkIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkNameInput")
    def virtual_network_name_input(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowForwardedTrafficInput")
    def allow_forwarded_traffic_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowForwardedTrafficInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowGatewayTransitInput")
    def allow_gateway_transit_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowGatewayTransitInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowVirtualNetworkAccessInput")
    def allow_virtual_network_access_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowVirtualNetworkAccessInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualNetworkPeeringTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useRemoteGatewaysInput")
    def use_remote_gateways_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "useRemoteGatewaysInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowForwardedTraffic")
    def allow_forwarded_traffic(self) -> builtins.bool:
        return jsii.get(self, "allowForwardedTraffic")

    @allow_forwarded_traffic.setter # type: ignore
    def allow_forwarded_traffic(self, value: builtins.bool) -> None:
        jsii.set(self, "allowForwardedTraffic", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowGatewayTransit")
    def allow_gateway_transit(self) -> builtins.bool:
        return jsii.get(self, "allowGatewayTransit")

    @allow_gateway_transit.setter # type: ignore
    def allow_gateway_transit(self, value: builtins.bool) -> None:
        jsii.set(self, "allowGatewayTransit", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowVirtualNetworkAccess")
    def allow_virtual_network_access(self) -> builtins.bool:
        return jsii.get(self, "allowVirtualNetworkAccess")

    @allow_virtual_network_access.setter # type: ignore
    def allow_virtual_network_access(self, value: builtins.bool) -> None:
        jsii.set(self, "allowVirtualNetworkAccess", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteVirtualNetworkId")
    def remote_virtual_network_id(self) -> builtins.str:
        return jsii.get(self, "remoteVirtualNetworkId")

    @remote_virtual_network_id.setter # type: ignore
    def remote_virtual_network_id(self, value: builtins.str) -> None:
        jsii.set(self, "remoteVirtualNetworkId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualNetworkPeeringTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualNetworkPeeringTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="useRemoteGateways")
    def use_remote_gateways(self) -> builtins.bool:
        return jsii.get(self, "useRemoteGateways")

    @use_remote_gateways.setter # type: ignore
    def use_remote_gateways(self, value: builtins.bool) -> None:
        jsii.set(self, "useRemoteGateways", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualNetworkName")
    def virtual_network_name(self) -> builtins.str:
        return jsii.get(self, "virtualNetworkName")

    @virtual_network_name.setter # type: ignore
    def virtual_network_name(self, value: builtins.str) -> None:
        jsii.set(self, "virtualNetworkName", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkPeeringConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "remote_virtual_network_id": "remoteVirtualNetworkId",
        "resource_group_name": "resourceGroupName",
        "virtual_network_name": "virtualNetworkName",
        "allow_forwarded_traffic": "allowForwardedTraffic",
        "allow_gateway_transit": "allowGatewayTransit",
        "allow_virtual_network_access": "allowVirtualNetworkAccess",
        "timeouts": "timeouts",
        "use_remote_gateways": "useRemoteGateways",
    },
)
class VirtualNetworkPeeringConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        remote_virtual_network_id: builtins.str,
        resource_group_name: builtins.str,
        virtual_network_name: builtins.str,
        allow_forwarded_traffic: typing.Optional[builtins.bool] = None,
        allow_gateway_transit: typing.Optional[builtins.bool] = None,
        allow_virtual_network_access: typing.Optional[builtins.bool] = None,
        timeouts: typing.Optional["VirtualNetworkPeeringTimeouts"] = None,
        use_remote_gateways: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param remote_virtual_network_id: -
        :param resource_group_name: -
        :param virtual_network_name: -
        :param allow_forwarded_traffic: -
        :param allow_gateway_transit: -
        :param allow_virtual_network_access: -
        :param timeouts: timeouts block.
        :param use_remote_gateways: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualNetworkPeeringTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "remote_virtual_network_id": remote_virtual_network_id,
            "resource_group_name": resource_group_name,
            "virtual_network_name": virtual_network_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allow_forwarded_traffic is not None:
            self._values["allow_forwarded_traffic"] = allow_forwarded_traffic
        if allow_gateway_transit is not None:
            self._values["allow_gateway_transit"] = allow_gateway_transit
        if allow_virtual_network_access is not None:
            self._values["allow_virtual_network_access"] = allow_virtual_network_access
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if use_remote_gateways is not None:
            self._values["use_remote_gateways"] = use_remote_gateways

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def remote_virtual_network_id(self) -> builtins.str:
        result = self._values.get("remote_virtual_network_id")
        assert result is not None, "Required property 'remote_virtual_network_id' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def virtual_network_name(self) -> builtins.str:
        result = self._values.get("virtual_network_name")
        assert result is not None, "Required property 'virtual_network_name' is missing"
        return result

    @builtins.property
    def allow_forwarded_traffic(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_forwarded_traffic")
        return result

    @builtins.property
    def allow_gateway_transit(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_gateway_transit")
        return result

    @builtins.property
    def allow_virtual_network_access(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_virtual_network_access")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualNetworkPeeringTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def use_remote_gateways(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("use_remote_gateways")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkPeeringConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkPeeringTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualNetworkPeeringTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkPeeringTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkSubnet",
    jsii_struct_bases=[],
    name_mapping={
        "address_prefix": "addressPrefix",
        "id": "id",
        "name": "name",
        "security_group": "securityGroup",
    },
)
class VirtualNetworkSubnet:
    def __init__(
        self,
        *,
        address_prefix: typing.Optional[builtins.str] = None,
        id: typing.Optional[builtins.str] = None,
        name: typing.Optional[builtins.str] = None,
        security_group: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param address_prefix: -
        :param id: -
        :param name: -
        :param security_group: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if address_prefix is not None:
            self._values["address_prefix"] = address_prefix
        if id is not None:
            self._values["id"] = id
        if name is not None:
            self._values["name"] = name
        if security_group is not None:
            self._values["security_group"] = security_group

    @builtins.property
    def address_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("address_prefix")
        return result

    @builtins.property
    def id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("id")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def security_group(self) -> typing.Optional[builtins.str]:
        result = self._values.get("security_group")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkSubnet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualNetworkTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualNetworkTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualNetworkTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VirtualWan(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VirtualWan",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        allow_branch_to_branch_traffic: typing.Optional[builtins.bool] = None,
        allow_vnet_to_vnet_traffic: typing.Optional[builtins.bool] = None,
        disable_vpn_encryption: typing.Optional[builtins.bool] = None,
        office365_local_breakout_category: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualWanTimeouts"] = None,
        type: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param allow_branch_to_branch_traffic: -
        :param allow_vnet_to_vnet_traffic: -
        :param disable_vpn_encryption: -
        :param office365_local_breakout_category: -
        :param tags: -
        :param timeouts: timeouts block.
        :param type: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VirtualWanConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            allow_branch_to_branch_traffic=allow_branch_to_branch_traffic,
            allow_vnet_to_vnet_traffic=allow_vnet_to_vnet_traffic,
            disable_vpn_encryption=disable_vpn_encryption,
            office365_local_breakout_category=office365_local_breakout_category,
            tags=tags,
            timeouts=timeouts,
            type=type,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VirtualWan, self, [scope, id, config])

    @jsii.member(jsii_name="resetAllowBranchToBranchTraffic")
    def reset_allow_branch_to_branch_traffic(self) -> None:
        return jsii.invoke(self, "resetAllowBranchToBranchTraffic", [])

    @jsii.member(jsii_name="resetAllowVnetToVnetTraffic")
    def reset_allow_vnet_to_vnet_traffic(self) -> None:
        return jsii.invoke(self, "resetAllowVnetToVnetTraffic", [])

    @jsii.member(jsii_name="resetDisableVpnEncryption")
    def reset_disable_vpn_encryption(self) -> None:
        return jsii.invoke(self, "resetDisableVpnEncryption", [])

    @jsii.member(jsii_name="resetOffice365LocalBreakoutCategory")
    def reset_office365_local_breakout_category(self) -> None:
        return jsii.invoke(self, "resetOffice365LocalBreakoutCategory", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetType")
    def reset_type(self) -> None:
        return jsii.invoke(self, "resetType", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowBranchToBranchTrafficInput")
    def allow_branch_to_branch_traffic_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowBranchToBranchTrafficInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowVnetToVnetTrafficInput")
    def allow_vnet_to_vnet_traffic_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowVnetToVnetTrafficInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableVpnEncryptionInput")
    def disable_vpn_encryption_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "disableVpnEncryptionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="office365LocalBreakoutCategoryInput")
    def office365_local_breakout_category_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "office365LocalBreakoutCategoryInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VirtualWanTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="typeInput")
    def type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "typeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowBranchToBranchTraffic")
    def allow_branch_to_branch_traffic(self) -> builtins.bool:
        return jsii.get(self, "allowBranchToBranchTraffic")

    @allow_branch_to_branch_traffic.setter # type: ignore
    def allow_branch_to_branch_traffic(self, value: builtins.bool) -> None:
        jsii.set(self, "allowBranchToBranchTraffic", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowVnetToVnetTraffic")
    def allow_vnet_to_vnet_traffic(self) -> builtins.bool:
        return jsii.get(self, "allowVnetToVnetTraffic")

    @allow_vnet_to_vnet_traffic.setter # type: ignore
    def allow_vnet_to_vnet_traffic(self, value: builtins.bool) -> None:
        jsii.set(self, "allowVnetToVnetTraffic", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="disableVpnEncryption")
    def disable_vpn_encryption(self) -> builtins.bool:
        return jsii.get(self, "disableVpnEncryption")

    @disable_vpn_encryption.setter # type: ignore
    def disable_vpn_encryption(self, value: builtins.bool) -> None:
        jsii.set(self, "disableVpnEncryption", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="office365LocalBreakoutCategory")
    def office365_local_breakout_category(self) -> builtins.str:
        return jsii.get(self, "office365LocalBreakoutCategory")

    @office365_local_breakout_category.setter # type: ignore
    def office365_local_breakout_category(self, value: builtins.str) -> None:
        jsii.set(self, "office365LocalBreakoutCategory", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VirtualWanTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VirtualWanTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="type")
    def type(self) -> builtins.str:
        return jsii.get(self, "type")

    @type.setter # type: ignore
    def type(self, value: builtins.str) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(
    jsii_type="azurerm.VirtualWanConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "allow_branch_to_branch_traffic": "allowBranchToBranchTraffic",
        "allow_vnet_to_vnet_traffic": "allowVnetToVnetTraffic",
        "disable_vpn_encryption": "disableVpnEncryption",
        "office365_local_breakout_category": "office365LocalBreakoutCategory",
        "tags": "tags",
        "timeouts": "timeouts",
        "type": "type",
    },
)
class VirtualWanConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        allow_branch_to_branch_traffic: typing.Optional[builtins.bool] = None,
        allow_vnet_to_vnet_traffic: typing.Optional[builtins.bool] = None,
        disable_vpn_encryption: typing.Optional[builtins.bool] = None,
        office365_local_breakout_category: typing.Optional[builtins.str] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VirtualWanTimeouts"] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param allow_branch_to_branch_traffic: -
        :param allow_vnet_to_vnet_traffic: -
        :param disable_vpn_encryption: -
        :param office365_local_breakout_category: -
        :param tags: -
        :param timeouts: timeouts block.
        :param type: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VirtualWanTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if allow_branch_to_branch_traffic is not None:
            self._values["allow_branch_to_branch_traffic"] = allow_branch_to_branch_traffic
        if allow_vnet_to_vnet_traffic is not None:
            self._values["allow_vnet_to_vnet_traffic"] = allow_vnet_to_vnet_traffic
        if disable_vpn_encryption is not None:
            self._values["disable_vpn_encryption"] = disable_vpn_encryption
        if office365_local_breakout_category is not None:
            self._values["office365_local_breakout_category"] = office365_local_breakout_category
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def allow_branch_to_branch_traffic(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_branch_to_branch_traffic")
        return result

    @builtins.property
    def allow_vnet_to_vnet_traffic(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_vnet_to_vnet_traffic")
        return result

    @builtins.property
    def disable_vpn_encryption(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("disable_vpn_encryption")
        return result

    @builtins.property
    def office365_local_breakout_category(self) -> typing.Optional[builtins.str]:
        result = self._values.get("office365_local_breakout_category")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VirtualWanTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualWanConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VirtualWanTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VirtualWanTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VirtualWanTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VpnGateway(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VpnGateway",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_hub_id: builtins.str,
        bgp_settings: typing.Optional[typing.List["VpnGatewayBgpSettings"]] = None,
        scale_unit: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VpnGatewayTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param virtual_hub_id: -
        :param bgp_settings: bgp_settings block.
        :param scale_unit: -
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VpnGatewayConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            virtual_hub_id=virtual_hub_id,
            bgp_settings=bgp_settings,
            scale_unit=scale_unit,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VpnGateway, self, [scope, id, config])

    @jsii.member(jsii_name="resetBgpSettings")
    def reset_bgp_settings(self) -> None:
        return jsii.invoke(self, "resetBgpSettings", [])

    @jsii.member(jsii_name="resetScaleUnit")
    def reset_scale_unit(self) -> None:
        return jsii.invoke(self, "resetScaleUnit", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubIdInput")
    def virtual_hub_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualHubIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpSettingsInput")
    def bgp_settings_input(
        self,
    ) -> typing.Optional[typing.List["VpnGatewayBgpSettings"]]:
        return jsii.get(self, "bgpSettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleUnitInput")
    def scale_unit_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "scaleUnitInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VpnGatewayTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bgpSettings")
    def bgp_settings(self) -> typing.List["VpnGatewayBgpSettings"]:
        return jsii.get(self, "bgpSettings")

    @bgp_settings.setter # type: ignore
    def bgp_settings(self, value: typing.List["VpnGatewayBgpSettings"]) -> None:
        jsii.set(self, "bgpSettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleUnit")
    def scale_unit(self) -> jsii.Number:
        return jsii.get(self, "scaleUnit")

    @scale_unit.setter # type: ignore
    def scale_unit(self, value: jsii.Number) -> None:
        jsii.set(self, "scaleUnit", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VpnGatewayTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VpnGatewayTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualHubId")
    def virtual_hub_id(self) -> builtins.str:
        return jsii.get(self, "virtualHubId")

    @virtual_hub_id.setter # type: ignore
    def virtual_hub_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualHubId", value)


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayBgpSettings",
    jsii_struct_bases=[],
    name_mapping={
        "asn": "asn",
        "peer_weight": "peerWeight",
        "instance0_bgp_peering_address": "instance0BgpPeeringAddress",
        "instance1_bgp_peering_address": "instance1BgpPeeringAddress",
    },
)
class VpnGatewayBgpSettings:
    def __init__(
        self,
        *,
        asn: jsii.Number,
        peer_weight: jsii.Number,
        instance0_bgp_peering_address: typing.Optional[typing.List["VpnGatewayBgpSettingsInstance0BgpPeeringAddress"]] = None,
        instance1_bgp_peering_address: typing.Optional[typing.List["VpnGatewayBgpSettingsInstance1BgpPeeringAddress"]] = None,
    ) -> None:
        """
        :param asn: -
        :param peer_weight: -
        :param instance0_bgp_peering_address: instance_0_bgp_peering_address block.
        :param instance1_bgp_peering_address: instance_1_bgp_peering_address block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "asn": asn,
            "peer_weight": peer_weight,
        }
        if instance0_bgp_peering_address is not None:
            self._values["instance0_bgp_peering_address"] = instance0_bgp_peering_address
        if instance1_bgp_peering_address is not None:
            self._values["instance1_bgp_peering_address"] = instance1_bgp_peering_address

    @builtins.property
    def asn(self) -> jsii.Number:
        result = self._values.get("asn")
        assert result is not None, "Required property 'asn' is missing"
        return result

    @builtins.property
    def peer_weight(self) -> jsii.Number:
        result = self._values.get("peer_weight")
        assert result is not None, "Required property 'peer_weight' is missing"
        return result

    @builtins.property
    def instance0_bgp_peering_address(
        self,
    ) -> typing.Optional[typing.List["VpnGatewayBgpSettingsInstance0BgpPeeringAddress"]]:
        """instance_0_bgp_peering_address block."""
        result = self._values.get("instance0_bgp_peering_address")
        return result

    @builtins.property
    def instance1_bgp_peering_address(
        self,
    ) -> typing.Optional[typing.List["VpnGatewayBgpSettingsInstance1BgpPeeringAddress"]]:
        """instance_1_bgp_peering_address block."""
        result = self._values.get("instance1_bgp_peering_address")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayBgpSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayBgpSettingsInstance0BgpPeeringAddress",
    jsii_struct_bases=[],
    name_mapping={"custom_ips": "customIps"},
)
class VpnGatewayBgpSettingsInstance0BgpPeeringAddress:
    def __init__(self, *, custom_ips: typing.List[builtins.str]) -> None:
        """
        :param custom_ips: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "custom_ips": custom_ips,
        }

    @builtins.property
    def custom_ips(self) -> typing.List[builtins.str]:
        result = self._values.get("custom_ips")
        assert result is not None, "Required property 'custom_ips' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayBgpSettingsInstance0BgpPeeringAddress(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayBgpSettingsInstance1BgpPeeringAddress",
    jsii_struct_bases=[],
    name_mapping={"custom_ips": "customIps"},
)
class VpnGatewayBgpSettingsInstance1BgpPeeringAddress:
    def __init__(self, *, custom_ips: typing.List[builtins.str]) -> None:
        """
        :param custom_ips: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "custom_ips": custom_ips,
        }

    @builtins.property
    def custom_ips(self) -> typing.List[builtins.str]:
        result = self._values.get("custom_ips")
        assert result is not None, "Required property 'custom_ips' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayBgpSettingsInstance1BgpPeeringAddress(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "virtual_hub_id": "virtualHubId",
        "bgp_settings": "bgpSettings",
        "scale_unit": "scaleUnit",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class VpnGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_hub_id: builtins.str,
        bgp_settings: typing.Optional[typing.List[VpnGatewayBgpSettings]] = None,
        scale_unit: typing.Optional[jsii.Number] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VpnGatewayTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param virtual_hub_id: -
        :param bgp_settings: bgp_settings block.
        :param scale_unit: -
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VpnGatewayTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "virtual_hub_id": virtual_hub_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if bgp_settings is not None:
            self._values["bgp_settings"] = bgp_settings
        if scale_unit is not None:
            self._values["scale_unit"] = scale_unit
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def virtual_hub_id(self) -> builtins.str:
        result = self._values.get("virtual_hub_id")
        assert result is not None, "Required property 'virtual_hub_id' is missing"
        return result

    @builtins.property
    def bgp_settings(self) -> typing.Optional[typing.List[VpnGatewayBgpSettings]]:
        """bgp_settings block."""
        result = self._values.get("bgp_settings")
        return result

    @builtins.property
    def scale_unit(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("scale_unit")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VpnGatewayTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VpnGatewayConnection(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VpnGatewayConnection",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        name: builtins.str,
        remote_vpn_site_id: builtins.str,
        vpn_gateway_id: builtins.str,
        vpn_link: typing.List["VpnGatewayConnectionVpnLink"],
        internet_security_enabled: typing.Optional[builtins.bool] = None,
        routing: typing.Optional[typing.List["VpnGatewayConnectionRouting"]] = None,
        timeouts: typing.Optional["VpnGatewayConnectionTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param name: -
        :param remote_vpn_site_id: -
        :param vpn_gateway_id: -
        :param vpn_link: vpn_link block.
        :param internet_security_enabled: -
        :param routing: routing block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VpnGatewayConnectionConfig(
            name=name,
            remote_vpn_site_id=remote_vpn_site_id,
            vpn_gateway_id=vpn_gateway_id,
            vpn_link=vpn_link,
            internet_security_enabled=internet_security_enabled,
            routing=routing,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VpnGatewayConnection, self, [scope, id, config])

    @jsii.member(jsii_name="resetInternetSecurityEnabled")
    def reset_internet_security_enabled(self) -> None:
        return jsii.invoke(self, "resetInternetSecurityEnabled", [])

    @jsii.member(jsii_name="resetRouting")
    def reset_routing(self) -> None:
        return jsii.invoke(self, "resetRouting", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteVpnSiteIdInput")
    def remote_vpn_site_id_input(self) -> builtins.str:
        return jsii.get(self, "remoteVpnSiteIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnGatewayIdInput")
    def vpn_gateway_id_input(self) -> builtins.str:
        return jsii.get(self, "vpnGatewayIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnLinkInput")
    def vpn_link_input(self) -> typing.List["VpnGatewayConnectionVpnLink"]:
        return jsii.get(self, "vpnLinkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetSecurityEnabledInput")
    def internet_security_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "internetSecurityEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routingInput")
    def routing_input(
        self,
    ) -> typing.Optional[typing.List["VpnGatewayConnectionRouting"]]:
        return jsii.get(self, "routingInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VpnGatewayConnectionTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="internetSecurityEnabled")
    def internet_security_enabled(self) -> builtins.bool:
        return jsii.get(self, "internetSecurityEnabled")

    @internet_security_enabled.setter # type: ignore
    def internet_security_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "internetSecurityEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="remoteVpnSiteId")
    def remote_vpn_site_id(self) -> builtins.str:
        return jsii.get(self, "remoteVpnSiteId")

    @remote_vpn_site_id.setter # type: ignore
    def remote_vpn_site_id(self, value: builtins.str) -> None:
        jsii.set(self, "remoteVpnSiteId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="routing")
    def routing(self) -> typing.List["VpnGatewayConnectionRouting"]:
        return jsii.get(self, "routing")

    @routing.setter # type: ignore
    def routing(self, value: typing.List["VpnGatewayConnectionRouting"]) -> None:
        jsii.set(self, "routing", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VpnGatewayConnectionTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VpnGatewayConnectionTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnGatewayId")
    def vpn_gateway_id(self) -> builtins.str:
        return jsii.get(self, "vpnGatewayId")

    @vpn_gateway_id.setter # type: ignore
    def vpn_gateway_id(self, value: builtins.str) -> None:
        jsii.set(self, "vpnGatewayId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnLink")
    def vpn_link(self) -> typing.List["VpnGatewayConnectionVpnLink"]:
        return jsii.get(self, "vpnLink")

    @vpn_link.setter # type: ignore
    def vpn_link(self, value: typing.List["VpnGatewayConnectionVpnLink"]) -> None:
        jsii.set(self, "vpnLink", value)


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayConnectionConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "name": "name",
        "remote_vpn_site_id": "remoteVpnSiteId",
        "vpn_gateway_id": "vpnGatewayId",
        "vpn_link": "vpnLink",
        "internet_security_enabled": "internetSecurityEnabled",
        "routing": "routing",
        "timeouts": "timeouts",
    },
)
class VpnGatewayConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        name: builtins.str,
        remote_vpn_site_id: builtins.str,
        vpn_gateway_id: builtins.str,
        vpn_link: typing.List["VpnGatewayConnectionVpnLink"],
        internet_security_enabled: typing.Optional[builtins.bool] = None,
        routing: typing.Optional[typing.List["VpnGatewayConnectionRouting"]] = None,
        timeouts: typing.Optional["VpnGatewayConnectionTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: -
        :param remote_vpn_site_id: -
        :param vpn_gateway_id: -
        :param vpn_link: vpn_link block.
        :param internet_security_enabled: -
        :param routing: routing block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VpnGatewayConnectionTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "remote_vpn_site_id": remote_vpn_site_id,
            "vpn_gateway_id": vpn_gateway_id,
            "vpn_link": vpn_link,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if internet_security_enabled is not None:
            self._values["internet_security_enabled"] = internet_security_enabled
        if routing is not None:
            self._values["routing"] = routing
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def remote_vpn_site_id(self) -> builtins.str:
        result = self._values.get("remote_vpn_site_id")
        assert result is not None, "Required property 'remote_vpn_site_id' is missing"
        return result

    @builtins.property
    def vpn_gateway_id(self) -> builtins.str:
        result = self._values.get("vpn_gateway_id")
        assert result is not None, "Required property 'vpn_gateway_id' is missing"
        return result

    @builtins.property
    def vpn_link(self) -> typing.List["VpnGatewayConnectionVpnLink"]:
        """vpn_link block."""
        result = self._values.get("vpn_link")
        assert result is not None, "Required property 'vpn_link' is missing"
        return result

    @builtins.property
    def internet_security_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("internet_security_enabled")
        return result

    @builtins.property
    def routing(self) -> typing.Optional[typing.List["VpnGatewayConnectionRouting"]]:
        """routing block."""
        result = self._values.get("routing")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VpnGatewayConnectionTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayConnectionConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayConnectionRouting",
    jsii_struct_bases=[],
    name_mapping={
        "associated_route_table": "associatedRouteTable",
        "propagated_route_tables": "propagatedRouteTables",
    },
)
class VpnGatewayConnectionRouting:
    def __init__(
        self,
        *,
        associated_route_table: builtins.str,
        propagated_route_tables: typing.List[builtins.str],
    ) -> None:
        """
        :param associated_route_table: -
        :param propagated_route_tables: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "associated_route_table": associated_route_table,
            "propagated_route_tables": propagated_route_tables,
        }

    @builtins.property
    def associated_route_table(self) -> builtins.str:
        result = self._values.get("associated_route_table")
        assert result is not None, "Required property 'associated_route_table' is missing"
        return result

    @builtins.property
    def propagated_route_tables(self) -> typing.List[builtins.str]:
        result = self._values.get("propagated_route_tables")
        assert result is not None, "Required property 'propagated_route_tables' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayConnectionRouting(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayConnectionTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VpnGatewayConnectionTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayConnectionTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayConnectionVpnLink",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "vpn_site_link_id": "vpnSiteLinkId",
        "bandwidth_mbps": "bandwidthMbps",
        "bgp_enabled": "bgpEnabled",
        "ipsec_policy": "ipsecPolicy",
        "local_azure_ip_address_enabled": "localAzureIpAddressEnabled",
        "policy_based_traffic_selector_enabled": "policyBasedTrafficSelectorEnabled",
        "protocol": "protocol",
        "ratelimit_enabled": "ratelimitEnabled",
        "route_weight": "routeWeight",
        "shared_key": "sharedKey",
    },
)
class VpnGatewayConnectionVpnLink:
    def __init__(
        self,
        *,
        name: builtins.str,
        vpn_site_link_id: builtins.str,
        bandwidth_mbps: typing.Optional[jsii.Number] = None,
        bgp_enabled: typing.Optional[builtins.bool] = None,
        ipsec_policy: typing.Optional[typing.List["VpnGatewayConnectionVpnLinkIpsecPolicy"]] = None,
        local_azure_ip_address_enabled: typing.Optional[builtins.bool] = None,
        policy_based_traffic_selector_enabled: typing.Optional[builtins.bool] = None,
        protocol: typing.Optional[builtins.str] = None,
        ratelimit_enabled: typing.Optional[builtins.bool] = None,
        route_weight: typing.Optional[jsii.Number] = None,
        shared_key: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param vpn_site_link_id: -
        :param bandwidth_mbps: -
        :param bgp_enabled: -
        :param ipsec_policy: ipsec_policy block.
        :param local_azure_ip_address_enabled: -
        :param policy_based_traffic_selector_enabled: -
        :param protocol: -
        :param ratelimit_enabled: -
        :param route_weight: -
        :param shared_key: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "vpn_site_link_id": vpn_site_link_id,
        }
        if bandwidth_mbps is not None:
            self._values["bandwidth_mbps"] = bandwidth_mbps
        if bgp_enabled is not None:
            self._values["bgp_enabled"] = bgp_enabled
        if ipsec_policy is not None:
            self._values["ipsec_policy"] = ipsec_policy
        if local_azure_ip_address_enabled is not None:
            self._values["local_azure_ip_address_enabled"] = local_azure_ip_address_enabled
        if policy_based_traffic_selector_enabled is not None:
            self._values["policy_based_traffic_selector_enabled"] = policy_based_traffic_selector_enabled
        if protocol is not None:
            self._values["protocol"] = protocol
        if ratelimit_enabled is not None:
            self._values["ratelimit_enabled"] = ratelimit_enabled
        if route_weight is not None:
            self._values["route_weight"] = route_weight
        if shared_key is not None:
            self._values["shared_key"] = shared_key

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def vpn_site_link_id(self) -> builtins.str:
        result = self._values.get("vpn_site_link_id")
        assert result is not None, "Required property 'vpn_site_link_id' is missing"
        return result

    @builtins.property
    def bandwidth_mbps(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("bandwidth_mbps")
        return result

    @builtins.property
    def bgp_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("bgp_enabled")
        return result

    @builtins.property
    def ipsec_policy(
        self,
    ) -> typing.Optional[typing.List["VpnGatewayConnectionVpnLinkIpsecPolicy"]]:
        """ipsec_policy block."""
        result = self._values.get("ipsec_policy")
        return result

    @builtins.property
    def local_azure_ip_address_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("local_azure_ip_address_enabled")
        return result

    @builtins.property
    def policy_based_traffic_selector_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("policy_based_traffic_selector_enabled")
        return result

    @builtins.property
    def protocol(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protocol")
        return result

    @builtins.property
    def ratelimit_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ratelimit_enabled")
        return result

    @builtins.property
    def route_weight(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("route_weight")
        return result

    @builtins.property
    def shared_key(self) -> typing.Optional[builtins.str]:
        result = self._values.get("shared_key")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayConnectionVpnLink(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayConnectionVpnLinkIpsecPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "dh_group": "dhGroup",
        "encryption_algorithm": "encryptionAlgorithm",
        "ike_encryption_algorithm": "ikeEncryptionAlgorithm",
        "ike_integrity_algorithm": "ikeIntegrityAlgorithm",
        "integrity_algorithm": "integrityAlgorithm",
        "pfs_group": "pfsGroup",
        "sa_data_size_kb": "saDataSizeKb",
        "sa_lifetime_sec": "saLifetimeSec",
    },
)
class VpnGatewayConnectionVpnLinkIpsecPolicy:
    def __init__(
        self,
        *,
        dh_group: builtins.str,
        encryption_algorithm: builtins.str,
        ike_encryption_algorithm: builtins.str,
        ike_integrity_algorithm: builtins.str,
        integrity_algorithm: builtins.str,
        pfs_group: builtins.str,
        sa_data_size_kb: jsii.Number,
        sa_lifetime_sec: jsii.Number,
    ) -> None:
        """
        :param dh_group: -
        :param encryption_algorithm: -
        :param ike_encryption_algorithm: -
        :param ike_integrity_algorithm: -
        :param integrity_algorithm: -
        :param pfs_group: -
        :param sa_data_size_kb: -
        :param sa_lifetime_sec: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "dh_group": dh_group,
            "encryption_algorithm": encryption_algorithm,
            "ike_encryption_algorithm": ike_encryption_algorithm,
            "ike_integrity_algorithm": ike_integrity_algorithm,
            "integrity_algorithm": integrity_algorithm,
            "pfs_group": pfs_group,
            "sa_data_size_kb": sa_data_size_kb,
            "sa_lifetime_sec": sa_lifetime_sec,
        }

    @builtins.property
    def dh_group(self) -> builtins.str:
        result = self._values.get("dh_group")
        assert result is not None, "Required property 'dh_group' is missing"
        return result

    @builtins.property
    def encryption_algorithm(self) -> builtins.str:
        result = self._values.get("encryption_algorithm")
        assert result is not None, "Required property 'encryption_algorithm' is missing"
        return result

    @builtins.property
    def ike_encryption_algorithm(self) -> builtins.str:
        result = self._values.get("ike_encryption_algorithm")
        assert result is not None, "Required property 'ike_encryption_algorithm' is missing"
        return result

    @builtins.property
    def ike_integrity_algorithm(self) -> builtins.str:
        result = self._values.get("ike_integrity_algorithm")
        assert result is not None, "Required property 'ike_integrity_algorithm' is missing"
        return result

    @builtins.property
    def integrity_algorithm(self) -> builtins.str:
        result = self._values.get("integrity_algorithm")
        assert result is not None, "Required property 'integrity_algorithm' is missing"
        return result

    @builtins.property
    def pfs_group(self) -> builtins.str:
        result = self._values.get("pfs_group")
        assert result is not None, "Required property 'pfs_group' is missing"
        return result

    @builtins.property
    def sa_data_size_kb(self) -> jsii.Number:
        result = self._values.get("sa_data_size_kb")
        assert result is not None, "Required property 'sa_data_size_kb' is missing"
        return result

    @builtins.property
    def sa_lifetime_sec(self) -> jsii.Number:
        result = self._values.get("sa_lifetime_sec")
        assert result is not None, "Required property 'sa_lifetime_sec' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayConnectionVpnLinkIpsecPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnGatewayTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VpnGatewayTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnGatewayTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VpnServerConfiguration(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VpnServerConfiguration",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        vpn_authentication_types: typing.List[builtins.str],
        azure_active_directory_authentication: typing.Optional[typing.List["VpnServerConfigurationAzureActiveDirectoryAuthentication"]] = None,
        client_revoked_certificate: typing.Optional[typing.List["VpnServerConfigurationClientRevokedCertificate"]] = None,
        client_root_certificate: typing.Optional[typing.List["VpnServerConfigurationClientRootCertificate"]] = None,
        ipsec_policy: typing.Optional[typing.List["VpnServerConfigurationIpsecPolicy"]] = None,
        radius: typing.Optional[typing.List["VpnServerConfigurationRadius"]] = None,
        radius_server: typing.Optional[typing.List["VpnServerConfigurationRadiusServerA"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VpnServerConfigurationTimeouts"] = None,
        vpn_protocols: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param vpn_authentication_types: -
        :param azure_active_directory_authentication: azure_active_directory_authentication block.
        :param client_revoked_certificate: client_revoked_certificate block.
        :param client_root_certificate: client_root_certificate block.
        :param ipsec_policy: ipsec_policy block.
        :param radius: radius block.
        :param radius_server: radius_server block.
        :param tags: -
        :param timeouts: timeouts block.
        :param vpn_protocols: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VpnServerConfigurationConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            vpn_authentication_types=vpn_authentication_types,
            azure_active_directory_authentication=azure_active_directory_authentication,
            client_revoked_certificate=client_revoked_certificate,
            client_root_certificate=client_root_certificate,
            ipsec_policy=ipsec_policy,
            radius=radius,
            radius_server=radius_server,
            tags=tags,
            timeouts=timeouts,
            vpn_protocols=vpn_protocols,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VpnServerConfiguration, self, [scope, id, config])

    @jsii.member(jsii_name="resetAzureActiveDirectoryAuthentication")
    def reset_azure_active_directory_authentication(self) -> None:
        return jsii.invoke(self, "resetAzureActiveDirectoryAuthentication", [])

    @jsii.member(jsii_name="resetClientRevokedCertificate")
    def reset_client_revoked_certificate(self) -> None:
        return jsii.invoke(self, "resetClientRevokedCertificate", [])

    @jsii.member(jsii_name="resetClientRootCertificate")
    def reset_client_root_certificate(self) -> None:
        return jsii.invoke(self, "resetClientRootCertificate", [])

    @jsii.member(jsii_name="resetIpsecPolicy")
    def reset_ipsec_policy(self) -> None:
        return jsii.invoke(self, "resetIpsecPolicy", [])

    @jsii.member(jsii_name="resetRadius")
    def reset_radius(self) -> None:
        return jsii.invoke(self, "resetRadius", [])

    @jsii.member(jsii_name="resetRadiusServer")
    def reset_radius_server(self) -> None:
        return jsii.invoke(self, "resetRadiusServer", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetVpnProtocols")
    def reset_vpn_protocols(self) -> None:
        return jsii.invoke(self, "resetVpnProtocols", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnAuthenticationTypesInput")
    def vpn_authentication_types_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "vpnAuthenticationTypesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureActiveDirectoryAuthenticationInput")
    def azure_active_directory_authentication_input(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationAzureActiveDirectoryAuthentication"]]:
        return jsii.get(self, "azureActiveDirectoryAuthenticationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientRevokedCertificateInput")
    def client_revoked_certificate_input(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationClientRevokedCertificate"]]:
        return jsii.get(self, "clientRevokedCertificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientRootCertificateInput")
    def client_root_certificate_input(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationClientRootCertificate"]]:
        return jsii.get(self, "clientRootCertificateInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipsecPolicyInput")
    def ipsec_policy_input(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationIpsecPolicy"]]:
        return jsii.get(self, "ipsecPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="radiusInput")
    def radius_input(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationRadius"]]:
        return jsii.get(self, "radiusInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="radiusServerInput")
    def radius_server_input(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationRadiusServerA"]]:
        return jsii.get(self, "radiusServerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VpnServerConfigurationTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnProtocolsInput")
    def vpn_protocols_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "vpnProtocolsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="azureActiveDirectoryAuthentication")
    def azure_active_directory_authentication(
        self,
    ) -> typing.List["VpnServerConfigurationAzureActiveDirectoryAuthentication"]:
        return jsii.get(self, "azureActiveDirectoryAuthentication")

    @azure_active_directory_authentication.setter # type: ignore
    def azure_active_directory_authentication(
        self,
        value: typing.List["VpnServerConfigurationAzureActiveDirectoryAuthentication"],
    ) -> None:
        jsii.set(self, "azureActiveDirectoryAuthentication", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientRevokedCertificate")
    def client_revoked_certificate(
        self,
    ) -> typing.List["VpnServerConfigurationClientRevokedCertificate"]:
        return jsii.get(self, "clientRevokedCertificate")

    @client_revoked_certificate.setter # type: ignore
    def client_revoked_certificate(
        self,
        value: typing.List["VpnServerConfigurationClientRevokedCertificate"],
    ) -> None:
        jsii.set(self, "clientRevokedCertificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="clientRootCertificate")
    def client_root_certificate(
        self,
    ) -> typing.List["VpnServerConfigurationClientRootCertificate"]:
        return jsii.get(self, "clientRootCertificate")

    @client_root_certificate.setter # type: ignore
    def client_root_certificate(
        self,
        value: typing.List["VpnServerConfigurationClientRootCertificate"],
    ) -> None:
        jsii.set(self, "clientRootCertificate", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="ipsecPolicy")
    def ipsec_policy(self) -> typing.List["VpnServerConfigurationIpsecPolicy"]:
        return jsii.get(self, "ipsecPolicy")

    @ipsec_policy.setter # type: ignore
    def ipsec_policy(
        self,
        value: typing.List["VpnServerConfigurationIpsecPolicy"],
    ) -> None:
        jsii.set(self, "ipsecPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="radius")
    def radius(self) -> typing.List["VpnServerConfigurationRadius"]:
        return jsii.get(self, "radius")

    @radius.setter # type: ignore
    def radius(self, value: typing.List["VpnServerConfigurationRadius"]) -> None:
        jsii.set(self, "radius", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="radiusServer")
    def radius_server(self) -> typing.List["VpnServerConfigurationRadiusServerA"]:
        return jsii.get(self, "radiusServer")

    @radius_server.setter # type: ignore
    def radius_server(
        self,
        value: typing.List["VpnServerConfigurationRadiusServerA"],
    ) -> None:
        jsii.set(self, "radiusServer", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VpnServerConfigurationTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VpnServerConfigurationTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnAuthenticationTypes")
    def vpn_authentication_types(self) -> typing.List[builtins.str]:
        return jsii.get(self, "vpnAuthenticationTypes")

    @vpn_authentication_types.setter # type: ignore
    def vpn_authentication_types(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "vpnAuthenticationTypes", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="vpnProtocols")
    def vpn_protocols(self) -> typing.List[builtins.str]:
        return jsii.get(self, "vpnProtocols")

    @vpn_protocols.setter # type: ignore
    def vpn_protocols(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "vpnProtocols", value)


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationAzureActiveDirectoryAuthentication",
    jsii_struct_bases=[],
    name_mapping={"audience": "audience", "issuer": "issuer", "tenant": "tenant"},
)
class VpnServerConfigurationAzureActiveDirectoryAuthentication:
    def __init__(
        self,
        *,
        audience: builtins.str,
        issuer: builtins.str,
        tenant: builtins.str,
    ) -> None:
        """
        :param audience: -
        :param issuer: -
        :param tenant: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "audience": audience,
            "issuer": issuer,
            "tenant": tenant,
        }

    @builtins.property
    def audience(self) -> builtins.str:
        result = self._values.get("audience")
        assert result is not None, "Required property 'audience' is missing"
        return result

    @builtins.property
    def issuer(self) -> builtins.str:
        result = self._values.get("issuer")
        assert result is not None, "Required property 'issuer' is missing"
        return result

    @builtins.property
    def tenant(self) -> builtins.str:
        result = self._values.get("tenant")
        assert result is not None, "Required property 'tenant' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationAzureActiveDirectoryAuthentication(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationClientRevokedCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "thumbprint": "thumbprint"},
)
class VpnServerConfigurationClientRevokedCertificate:
    def __init__(self, *, name: builtins.str, thumbprint: builtins.str) -> None:
        """
        :param name: -
        :param thumbprint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "thumbprint": thumbprint,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationClientRevokedCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationClientRootCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "public_cert_data": "publicCertData"},
)
class VpnServerConfigurationClientRootCertificate:
    def __init__(self, *, name: builtins.str, public_cert_data: builtins.str) -> None:
        """
        :param name: -
        :param public_cert_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "public_cert_data": public_cert_data,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def public_cert_data(self) -> builtins.str:
        result = self._values.get("public_cert_data")
        assert result is not None, "Required property 'public_cert_data' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationClientRootCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "vpn_authentication_types": "vpnAuthenticationTypes",
        "azure_active_directory_authentication": "azureActiveDirectoryAuthentication",
        "client_revoked_certificate": "clientRevokedCertificate",
        "client_root_certificate": "clientRootCertificate",
        "ipsec_policy": "ipsecPolicy",
        "radius": "radius",
        "radius_server": "radiusServer",
        "tags": "tags",
        "timeouts": "timeouts",
        "vpn_protocols": "vpnProtocols",
    },
)
class VpnServerConfigurationConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        vpn_authentication_types: typing.List[builtins.str],
        azure_active_directory_authentication: typing.Optional[typing.List[VpnServerConfigurationAzureActiveDirectoryAuthentication]] = None,
        client_revoked_certificate: typing.Optional[typing.List[VpnServerConfigurationClientRevokedCertificate]] = None,
        client_root_certificate: typing.Optional[typing.List[VpnServerConfigurationClientRootCertificate]] = None,
        ipsec_policy: typing.Optional[typing.List["VpnServerConfigurationIpsecPolicy"]] = None,
        radius: typing.Optional[typing.List["VpnServerConfigurationRadius"]] = None,
        radius_server: typing.Optional[typing.List["VpnServerConfigurationRadiusServerA"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VpnServerConfigurationTimeouts"] = None,
        vpn_protocols: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param vpn_authentication_types: -
        :param azure_active_directory_authentication: azure_active_directory_authentication block.
        :param client_revoked_certificate: client_revoked_certificate block.
        :param client_root_certificate: client_root_certificate block.
        :param ipsec_policy: ipsec_policy block.
        :param radius: radius block.
        :param radius_server: radius_server block.
        :param tags: -
        :param timeouts: timeouts block.
        :param vpn_protocols: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VpnServerConfigurationTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "vpn_authentication_types": vpn_authentication_types,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if azure_active_directory_authentication is not None:
            self._values["azure_active_directory_authentication"] = azure_active_directory_authentication
        if client_revoked_certificate is not None:
            self._values["client_revoked_certificate"] = client_revoked_certificate
        if client_root_certificate is not None:
            self._values["client_root_certificate"] = client_root_certificate
        if ipsec_policy is not None:
            self._values["ipsec_policy"] = ipsec_policy
        if radius is not None:
            self._values["radius"] = radius
        if radius_server is not None:
            self._values["radius_server"] = radius_server
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if vpn_protocols is not None:
            self._values["vpn_protocols"] = vpn_protocols

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def vpn_authentication_types(self) -> typing.List[builtins.str]:
        result = self._values.get("vpn_authentication_types")
        assert result is not None, "Required property 'vpn_authentication_types' is missing"
        return result

    @builtins.property
    def azure_active_directory_authentication(
        self,
    ) -> typing.Optional[typing.List[VpnServerConfigurationAzureActiveDirectoryAuthentication]]:
        """azure_active_directory_authentication block."""
        result = self._values.get("azure_active_directory_authentication")
        return result

    @builtins.property
    def client_revoked_certificate(
        self,
    ) -> typing.Optional[typing.List[VpnServerConfigurationClientRevokedCertificate]]:
        """client_revoked_certificate block."""
        result = self._values.get("client_revoked_certificate")
        return result

    @builtins.property
    def client_root_certificate(
        self,
    ) -> typing.Optional[typing.List[VpnServerConfigurationClientRootCertificate]]:
        """client_root_certificate block."""
        result = self._values.get("client_root_certificate")
        return result

    @builtins.property
    def ipsec_policy(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationIpsecPolicy"]]:
        """ipsec_policy block."""
        result = self._values.get("ipsec_policy")
        return result

    @builtins.property
    def radius(self) -> typing.Optional[typing.List["VpnServerConfigurationRadius"]]:
        """radius block."""
        result = self._values.get("radius")
        return result

    @builtins.property
    def radius_server(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationRadiusServerA"]]:
        """radius_server block."""
        result = self._values.get("radius_server")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VpnServerConfigurationTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def vpn_protocols(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("vpn_protocols")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationIpsecPolicy",
    jsii_struct_bases=[],
    name_mapping={
        "dh_group": "dhGroup",
        "ike_encryption": "ikeEncryption",
        "ike_integrity": "ikeIntegrity",
        "ipsec_encryption": "ipsecEncryption",
        "ipsec_integrity": "ipsecIntegrity",
        "pfs_group": "pfsGroup",
        "sa_data_size_kilobytes": "saDataSizeKilobytes",
        "sa_lifetime_seconds": "saLifetimeSeconds",
    },
)
class VpnServerConfigurationIpsecPolicy:
    def __init__(
        self,
        *,
        dh_group: builtins.str,
        ike_encryption: builtins.str,
        ike_integrity: builtins.str,
        ipsec_encryption: builtins.str,
        ipsec_integrity: builtins.str,
        pfs_group: builtins.str,
        sa_data_size_kilobytes: jsii.Number,
        sa_lifetime_seconds: jsii.Number,
    ) -> None:
        """
        :param dh_group: -
        :param ike_encryption: -
        :param ike_integrity: -
        :param ipsec_encryption: -
        :param ipsec_integrity: -
        :param pfs_group: -
        :param sa_data_size_kilobytes: -
        :param sa_lifetime_seconds: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "dh_group": dh_group,
            "ike_encryption": ike_encryption,
            "ike_integrity": ike_integrity,
            "ipsec_encryption": ipsec_encryption,
            "ipsec_integrity": ipsec_integrity,
            "pfs_group": pfs_group,
            "sa_data_size_kilobytes": sa_data_size_kilobytes,
            "sa_lifetime_seconds": sa_lifetime_seconds,
        }

    @builtins.property
    def dh_group(self) -> builtins.str:
        result = self._values.get("dh_group")
        assert result is not None, "Required property 'dh_group' is missing"
        return result

    @builtins.property
    def ike_encryption(self) -> builtins.str:
        result = self._values.get("ike_encryption")
        assert result is not None, "Required property 'ike_encryption' is missing"
        return result

    @builtins.property
    def ike_integrity(self) -> builtins.str:
        result = self._values.get("ike_integrity")
        assert result is not None, "Required property 'ike_integrity' is missing"
        return result

    @builtins.property
    def ipsec_encryption(self) -> builtins.str:
        result = self._values.get("ipsec_encryption")
        assert result is not None, "Required property 'ipsec_encryption' is missing"
        return result

    @builtins.property
    def ipsec_integrity(self) -> builtins.str:
        result = self._values.get("ipsec_integrity")
        assert result is not None, "Required property 'ipsec_integrity' is missing"
        return result

    @builtins.property
    def pfs_group(self) -> builtins.str:
        result = self._values.get("pfs_group")
        assert result is not None, "Required property 'pfs_group' is missing"
        return result

    @builtins.property
    def sa_data_size_kilobytes(self) -> jsii.Number:
        result = self._values.get("sa_data_size_kilobytes")
        assert result is not None, "Required property 'sa_data_size_kilobytes' is missing"
        return result

    @builtins.property
    def sa_lifetime_seconds(self) -> jsii.Number:
        result = self._values.get("sa_lifetime_seconds")
        assert result is not None, "Required property 'sa_lifetime_seconds' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationIpsecPolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationRadius",
    jsii_struct_bases=[],
    name_mapping={
        "server_root_certificate": "serverRootCertificate",
        "client_root_certificate": "clientRootCertificate",
        "server": "server",
    },
)
class VpnServerConfigurationRadius:
    def __init__(
        self,
        *,
        server_root_certificate: typing.List["VpnServerConfigurationRadiusServerRootCertificate"],
        client_root_certificate: typing.Optional[typing.List["VpnServerConfigurationRadiusClientRootCertificate"]] = None,
        server: typing.Optional[typing.List["VpnServerConfigurationRadiusServer"]] = None,
    ) -> None:
        """
        :param server_root_certificate: server_root_certificate block.
        :param client_root_certificate: client_root_certificate block.
        :param server: server block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "server_root_certificate": server_root_certificate,
        }
        if client_root_certificate is not None:
            self._values["client_root_certificate"] = client_root_certificate
        if server is not None:
            self._values["server"] = server

    @builtins.property
    def server_root_certificate(
        self,
    ) -> typing.List["VpnServerConfigurationRadiusServerRootCertificate"]:
        """server_root_certificate block."""
        result = self._values.get("server_root_certificate")
        assert result is not None, "Required property 'server_root_certificate' is missing"
        return result

    @builtins.property
    def client_root_certificate(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationRadiusClientRootCertificate"]]:
        """client_root_certificate block."""
        result = self._values.get("client_root_certificate")
        return result

    @builtins.property
    def server(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationRadiusServer"]]:
        """server block."""
        result = self._values.get("server")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationRadius(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationRadiusClientRootCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "thumbprint": "thumbprint"},
)
class VpnServerConfigurationRadiusClientRootCertificate:
    def __init__(self, *, name: builtins.str, thumbprint: builtins.str) -> None:
        """
        :param name: -
        :param thumbprint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "thumbprint": thumbprint,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationRadiusClientRootCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationRadiusServer",
    jsii_struct_bases=[],
    name_mapping={"address": "address", "score": "score", "secret": "secret"},
)
class VpnServerConfigurationRadiusServer:
    def __init__(
        self,
        *,
        address: builtins.str,
        score: jsii.Number,
        secret: builtins.str,
    ) -> None:
        """
        :param address: -
        :param score: -
        :param secret: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "address": address,
            "score": score,
            "secret": secret,
        }

    @builtins.property
    def address(self) -> builtins.str:
        result = self._values.get("address")
        assert result is not None, "Required property 'address' is missing"
        return result

    @builtins.property
    def score(self) -> jsii.Number:
        result = self._values.get("score")
        assert result is not None, "Required property 'score' is missing"
        return result

    @builtins.property
    def secret(self) -> builtins.str:
        result = self._values.get("secret")
        assert result is not None, "Required property 'secret' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationRadiusServer(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationRadiusServerA",
    jsii_struct_bases=[],
    name_mapping={
        "address": "address",
        "secret": "secret",
        "server_root_certificate": "serverRootCertificate",
        "client_root_certificate": "clientRootCertificate",
    },
)
class VpnServerConfigurationRadiusServerA:
    def __init__(
        self,
        *,
        address: builtins.str,
        secret: builtins.str,
        server_root_certificate: typing.List["VpnServerConfigurationRadiusServerServerRootCertificate"],
        client_root_certificate: typing.Optional[typing.List["VpnServerConfigurationRadiusServerClientRootCertificate"]] = None,
    ) -> None:
        """
        :param address: -
        :param secret: -
        :param server_root_certificate: server_root_certificate block.
        :param client_root_certificate: client_root_certificate block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "address": address,
            "secret": secret,
            "server_root_certificate": server_root_certificate,
        }
        if client_root_certificate is not None:
            self._values["client_root_certificate"] = client_root_certificate

    @builtins.property
    def address(self) -> builtins.str:
        result = self._values.get("address")
        assert result is not None, "Required property 'address' is missing"
        return result

    @builtins.property
    def secret(self) -> builtins.str:
        result = self._values.get("secret")
        assert result is not None, "Required property 'secret' is missing"
        return result

    @builtins.property
    def server_root_certificate(
        self,
    ) -> typing.List["VpnServerConfigurationRadiusServerServerRootCertificate"]:
        """server_root_certificate block."""
        result = self._values.get("server_root_certificate")
        assert result is not None, "Required property 'server_root_certificate' is missing"
        return result

    @builtins.property
    def client_root_certificate(
        self,
    ) -> typing.Optional[typing.List["VpnServerConfigurationRadiusServerClientRootCertificate"]]:
        """client_root_certificate block."""
        result = self._values.get("client_root_certificate")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationRadiusServerA(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationRadiusServerClientRootCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "thumbprint": "thumbprint"},
)
class VpnServerConfigurationRadiusServerClientRootCertificate:
    def __init__(self, *, name: builtins.str, thumbprint: builtins.str) -> None:
        """
        :param name: -
        :param thumbprint: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "thumbprint": thumbprint,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def thumbprint(self) -> builtins.str:
        result = self._values.get("thumbprint")
        assert result is not None, "Required property 'thumbprint' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationRadiusServerClientRootCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationRadiusServerRootCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "public_cert_data": "publicCertData"},
)
class VpnServerConfigurationRadiusServerRootCertificate:
    def __init__(self, *, name: builtins.str, public_cert_data: builtins.str) -> None:
        """
        :param name: -
        :param public_cert_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "public_cert_data": public_cert_data,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def public_cert_data(self) -> builtins.str:
        result = self._values.get("public_cert_data")
        assert result is not None, "Required property 'public_cert_data' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationRadiusServerRootCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationRadiusServerServerRootCertificate",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "public_cert_data": "publicCertData"},
)
class VpnServerConfigurationRadiusServerServerRootCertificate:
    def __init__(self, *, name: builtins.str, public_cert_data: builtins.str) -> None:
        """
        :param name: -
        :param public_cert_data: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "public_cert_data": public_cert_data,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def public_cert_data(self) -> builtins.str:
        result = self._values.get("public_cert_data")
        assert result is not None, "Required property 'public_cert_data' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationRadiusServerServerRootCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnServerConfigurationTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VpnServerConfigurationTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnServerConfigurationTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class VpnSite(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.VpnSite",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_wan_id: builtins.str,
        address_cidrs: typing.Optional[typing.List[builtins.str]] = None,
        device_model: typing.Optional[builtins.str] = None,
        device_vendor: typing.Optional[builtins.str] = None,
        link: typing.Optional[typing.List["VpnSiteLink"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VpnSiteTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param virtual_wan_id: -
        :param address_cidrs: -
        :param device_model: -
        :param device_vendor: -
        :param link: link block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VpnSiteConfig(
            location=location,
            name=name,
            resource_group_name=resource_group_name,
            virtual_wan_id=virtual_wan_id,
            address_cidrs=address_cidrs,
            device_model=device_model,
            device_vendor=device_vendor,
            link=link,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(VpnSite, self, [scope, id, config])

    @jsii.member(jsii_name="resetAddressCidrs")
    def reset_address_cidrs(self) -> None:
        return jsii.invoke(self, "resetAddressCidrs", [])

    @jsii.member(jsii_name="resetDeviceModel")
    def reset_device_model(self) -> None:
        return jsii.invoke(self, "resetDeviceModel", [])

    @jsii.member(jsii_name="resetDeviceVendor")
    def reset_device_vendor(self) -> None:
        return jsii.invoke(self, "resetDeviceVendor", [])

    @jsii.member(jsii_name="resetLink")
    def reset_link(self) -> None:
        return jsii.invoke(self, "resetLink", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualWanIdInput")
    def virtual_wan_id_input(self) -> builtins.str:
        return jsii.get(self, "virtualWanIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressCidrsInput")
    def address_cidrs_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "addressCidrsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceModelInput")
    def device_model_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "deviceModelInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceVendorInput")
    def device_vendor_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "deviceVendorInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="linkInput")
    def link_input(self) -> typing.Optional[typing.List["VpnSiteLink"]]:
        return jsii.get(self, "linkInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["VpnSiteTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="addressCidrs")
    def address_cidrs(self) -> typing.List[builtins.str]:
        return jsii.get(self, "addressCidrs")

    @address_cidrs.setter # type: ignore
    def address_cidrs(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "addressCidrs", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceModel")
    def device_model(self) -> builtins.str:
        return jsii.get(self, "deviceModel")

    @device_model.setter # type: ignore
    def device_model(self, value: builtins.str) -> None:
        jsii.set(self, "deviceModel", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="deviceVendor")
    def device_vendor(self) -> builtins.str:
        return jsii.get(self, "deviceVendor")

    @device_vendor.setter # type: ignore
    def device_vendor(self, value: builtins.str) -> None:
        jsii.set(self, "deviceVendor", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="link")
    def link(self) -> typing.List["VpnSiteLink"]:
        return jsii.get(self, "link")

    @link.setter # type: ignore
    def link(self, value: typing.List["VpnSiteLink"]) -> None:
        jsii.set(self, "link", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "VpnSiteTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "VpnSiteTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualWanId")
    def virtual_wan_id(self) -> builtins.str:
        return jsii.get(self, "virtualWanId")

    @virtual_wan_id.setter # type: ignore
    def virtual_wan_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualWanId", value)


@jsii.data_type(
    jsii_type="azurerm.VpnSiteConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "virtual_wan_id": "virtualWanId",
        "address_cidrs": "addressCidrs",
        "device_model": "deviceModel",
        "device_vendor": "deviceVendor",
        "link": "link",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class VpnSiteConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        name: builtins.str,
        resource_group_name: builtins.str,
        virtual_wan_id: builtins.str,
        address_cidrs: typing.Optional[typing.List[builtins.str]] = None,
        device_model: typing.Optional[builtins.str] = None,
        device_vendor: typing.Optional[builtins.str] = None,
        link: typing.Optional[typing.List["VpnSiteLink"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["VpnSiteTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param name: -
        :param resource_group_name: -
        :param virtual_wan_id: -
        :param address_cidrs: -
        :param device_model: -
        :param device_vendor: -
        :param link: link block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = VpnSiteTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "name": name,
            "resource_group_name": resource_group_name,
            "virtual_wan_id": virtual_wan_id,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if address_cidrs is not None:
            self._values["address_cidrs"] = address_cidrs
        if device_model is not None:
            self._values["device_model"] = device_model
        if device_vendor is not None:
            self._values["device_vendor"] = device_vendor
        if link is not None:
            self._values["link"] = link
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def virtual_wan_id(self) -> builtins.str:
        result = self._values.get("virtual_wan_id")
        assert result is not None, "Required property 'virtual_wan_id' is missing"
        return result

    @builtins.property
    def address_cidrs(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("address_cidrs")
        return result

    @builtins.property
    def device_model(self) -> typing.Optional[builtins.str]:
        result = self._values.get("device_model")
        return result

    @builtins.property
    def device_vendor(self) -> typing.Optional[builtins.str]:
        result = self._values.get("device_vendor")
        return result

    @builtins.property
    def link(self) -> typing.Optional[typing.List["VpnSiteLink"]]:
        """link block."""
        result = self._values.get("link")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["VpnSiteTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnSiteConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnSiteLink",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "bgp": "bgp",
        "fqdn": "fqdn",
        "ip_address": "ipAddress",
        "provider_name": "providerName",
        "speed_in_mbps": "speedInMbps",
    },
)
class VpnSiteLink:
    def __init__(
        self,
        *,
        name: builtins.str,
        bgp: typing.Optional[typing.List["VpnSiteLinkBgp"]] = None,
        fqdn: typing.Optional[builtins.str] = None,
        ip_address: typing.Optional[builtins.str] = None,
        provider_name: typing.Optional[builtins.str] = None,
        speed_in_mbps: typing.Optional[jsii.Number] = None,
    ) -> None:
        """
        :param name: -
        :param bgp: bgp block.
        :param fqdn: -
        :param ip_address: -
        :param provider_name: -
        :param speed_in_mbps: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if bgp is not None:
            self._values["bgp"] = bgp
        if fqdn is not None:
            self._values["fqdn"] = fqdn
        if ip_address is not None:
            self._values["ip_address"] = ip_address
        if provider_name is not None:
            self._values["provider_name"] = provider_name
        if speed_in_mbps is not None:
            self._values["speed_in_mbps"] = speed_in_mbps

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def bgp(self) -> typing.Optional[typing.List["VpnSiteLinkBgp"]]:
        """bgp block."""
        result = self._values.get("bgp")
        return result

    @builtins.property
    def fqdn(self) -> typing.Optional[builtins.str]:
        result = self._values.get("fqdn")
        return result

    @builtins.property
    def ip_address(self) -> typing.Optional[builtins.str]:
        result = self._values.get("ip_address")
        return result

    @builtins.property
    def provider_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("provider_name")
        return result

    @builtins.property
    def speed_in_mbps(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("speed_in_mbps")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnSiteLink(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnSiteLinkBgp",
    jsii_struct_bases=[],
    name_mapping={"asn": "asn", "peering_address": "peeringAddress"},
)
class VpnSiteLinkBgp:
    def __init__(self, *, asn: jsii.Number, peering_address: builtins.str) -> None:
        """
        :param asn: -
        :param peering_address: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "asn": asn,
            "peering_address": peering_address,
        }

    @builtins.property
    def asn(self) -> jsii.Number:
        result = self._values.get("asn")
        assert result is not None, "Required property 'asn' is missing"
        return result

    @builtins.property
    def peering_address(self) -> builtins.str:
        result = self._values.get("peering_address")
        assert result is not None, "Required property 'peering_address' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnSiteLinkBgp(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.VpnSiteTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class VpnSiteTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "VpnSiteTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class WebApplicationFirewallPolicy(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.WebApplicationFirewallPolicy",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        location: builtins.str,
        managed_rules: typing.List["WebApplicationFirewallPolicyManagedRules"],
        name: builtins.str,
        resource_group_name: builtins.str,
        custom_rules: typing.Optional[typing.List["WebApplicationFirewallPolicyCustomRules"]] = None,
        policy_settings: typing.Optional[typing.List["WebApplicationFirewallPolicyPolicySettings"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["WebApplicationFirewallPolicyTimeouts"] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param location: -
        :param managed_rules: managed_rules block.
        :param name: -
        :param resource_group_name: -
        :param custom_rules: custom_rules block.
        :param policy_settings: policy_settings block.
        :param tags: -
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = WebApplicationFirewallPolicyConfig(
            location=location,
            managed_rules=managed_rules,
            name=name,
            resource_group_name=resource_group_name,
            custom_rules=custom_rules,
            policy_settings=policy_settings,
            tags=tags,
            timeouts=timeouts,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(WebApplicationFirewallPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="resetCustomRules")
    def reset_custom_rules(self) -> None:
        return jsii.invoke(self, "resetCustomRules", [])

    @jsii.member(jsii_name="resetPolicySettings")
    def reset_policy_settings(self) -> None:
        return jsii.invoke(self, "resetPolicySettings", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedRulesInput")
    def managed_rules_input(
        self,
    ) -> typing.List["WebApplicationFirewallPolicyManagedRules"]:
        return jsii.get(self, "managedRulesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customRulesInput")
    def custom_rules_input(
        self,
    ) -> typing.Optional[typing.List["WebApplicationFirewallPolicyCustomRules"]]:
        return jsii.get(self, "customRulesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policySettingsInput")
    def policy_settings_input(
        self,
    ) -> typing.Optional[typing.List["WebApplicationFirewallPolicyPolicySettings"]]:
        return jsii.get(self, "policySettingsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["WebApplicationFirewallPolicyTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customRules")
    def custom_rules(self) -> typing.List["WebApplicationFirewallPolicyCustomRules"]:
        return jsii.get(self, "customRules")

    @custom_rules.setter # type: ignore
    def custom_rules(
        self,
        value: typing.List["WebApplicationFirewallPolicyCustomRules"],
    ) -> None:
        jsii.set(self, "customRules", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="managedRules")
    def managed_rules(self) -> typing.List["WebApplicationFirewallPolicyManagedRules"]:
        return jsii.get(self, "managedRules")

    @managed_rules.setter # type: ignore
    def managed_rules(
        self,
        value: typing.List["WebApplicationFirewallPolicyManagedRules"],
    ) -> None:
        jsii.set(self, "managedRules", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="policySettings")
    def policy_settings(
        self,
    ) -> typing.List["WebApplicationFirewallPolicyPolicySettings"]:
        return jsii.get(self, "policySettings")

    @policy_settings.setter # type: ignore
    def policy_settings(
        self,
        value: typing.List["WebApplicationFirewallPolicyPolicySettings"],
    ) -> None:
        jsii.set(self, "policySettings", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "WebApplicationFirewallPolicyTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "WebApplicationFirewallPolicyTimeouts") -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "location": "location",
        "managed_rules": "managedRules",
        "name": "name",
        "resource_group_name": "resourceGroupName",
        "custom_rules": "customRules",
        "policy_settings": "policySettings",
        "tags": "tags",
        "timeouts": "timeouts",
    },
)
class WebApplicationFirewallPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        location: builtins.str,
        managed_rules: typing.List["WebApplicationFirewallPolicyManagedRules"],
        name: builtins.str,
        resource_group_name: builtins.str,
        custom_rules: typing.Optional[typing.List["WebApplicationFirewallPolicyCustomRules"]] = None,
        policy_settings: typing.Optional[typing.List["WebApplicationFirewallPolicyPolicySettings"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["WebApplicationFirewallPolicyTimeouts"] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: -
        :param managed_rules: managed_rules block.
        :param name: -
        :param resource_group_name: -
        :param custom_rules: custom_rules block.
        :param policy_settings: policy_settings block.
        :param tags: -
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = WebApplicationFirewallPolicyTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "location": location,
            "managed_rules": managed_rules,
            "name": name,
            "resource_group_name": resource_group_name,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if custom_rules is not None:
            self._values["custom_rules"] = custom_rules
        if policy_settings is not None:
            self._values["policy_settings"] = policy_settings
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def managed_rules(self) -> typing.List["WebApplicationFirewallPolicyManagedRules"]:
        """managed_rules block."""
        result = self._values.get("managed_rules")
        assert result is not None, "Required property 'managed_rules' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def custom_rules(
        self,
    ) -> typing.Optional[typing.List["WebApplicationFirewallPolicyCustomRules"]]:
        """custom_rules block."""
        result = self._values.get("custom_rules")
        return result

    @builtins.property
    def policy_settings(
        self,
    ) -> typing.Optional[typing.List["WebApplicationFirewallPolicyPolicySettings"]]:
        """policy_settings block."""
        result = self._values.get("policy_settings")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["WebApplicationFirewallPolicyTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyCustomRules",
    jsii_struct_bases=[],
    name_mapping={
        "action": "action",
        "match_conditions": "matchConditions",
        "priority": "priority",
        "rule_type": "ruleType",
        "name": "name",
    },
)
class WebApplicationFirewallPolicyCustomRules:
    def __init__(
        self,
        *,
        action: builtins.str,
        match_conditions: typing.List["WebApplicationFirewallPolicyCustomRulesMatchConditions"],
        priority: jsii.Number,
        rule_type: builtins.str,
        name: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param action: -
        :param match_conditions: match_conditions block.
        :param priority: -
        :param rule_type: -
        :param name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "action": action,
            "match_conditions": match_conditions,
            "priority": priority,
            "rule_type": rule_type,
        }
        if name is not None:
            self._values["name"] = name

    @builtins.property
    def action(self) -> builtins.str:
        result = self._values.get("action")
        assert result is not None, "Required property 'action' is missing"
        return result

    @builtins.property
    def match_conditions(
        self,
    ) -> typing.List["WebApplicationFirewallPolicyCustomRulesMatchConditions"]:
        """match_conditions block."""
        result = self._values.get("match_conditions")
        assert result is not None, "Required property 'match_conditions' is missing"
        return result

    @builtins.property
    def priority(self) -> jsii.Number:
        result = self._values.get("priority")
        assert result is not None, "Required property 'priority' is missing"
        return result

    @builtins.property
    def rule_type(self) -> builtins.str:
        result = self._values.get("rule_type")
        assert result is not None, "Required property 'rule_type' is missing"
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyCustomRules(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyCustomRulesMatchConditions",
    jsii_struct_bases=[],
    name_mapping={
        "match_values": "matchValues",
        "match_variables": "matchVariables",
        "operator": "operator",
        "negation_condition": "negationCondition",
        "transforms": "transforms",
    },
)
class WebApplicationFirewallPolicyCustomRulesMatchConditions:
    def __init__(
        self,
        *,
        match_values: typing.List[builtins.str],
        match_variables: typing.List["WebApplicationFirewallPolicyCustomRulesMatchConditionsMatchVariables"],
        operator: builtins.str,
        negation_condition: typing.Optional[builtins.bool] = None,
        transforms: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param match_values: -
        :param match_variables: match_variables block.
        :param operator: -
        :param negation_condition: -
        :param transforms: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_values": match_values,
            "match_variables": match_variables,
            "operator": operator,
        }
        if negation_condition is not None:
            self._values["negation_condition"] = negation_condition
        if transforms is not None:
            self._values["transforms"] = transforms

    @builtins.property
    def match_values(self) -> typing.List[builtins.str]:
        result = self._values.get("match_values")
        assert result is not None, "Required property 'match_values' is missing"
        return result

    @builtins.property
    def match_variables(
        self,
    ) -> typing.List["WebApplicationFirewallPolicyCustomRulesMatchConditionsMatchVariables"]:
        """match_variables block."""
        result = self._values.get("match_variables")
        assert result is not None, "Required property 'match_variables' is missing"
        return result

    @builtins.property
    def operator(self) -> builtins.str:
        result = self._values.get("operator")
        assert result is not None, "Required property 'operator' is missing"
        return result

    @builtins.property
    def negation_condition(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("negation_condition")
        return result

    @builtins.property
    def transforms(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("transforms")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyCustomRulesMatchConditions(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyCustomRulesMatchConditionsMatchVariables",
    jsii_struct_bases=[],
    name_mapping={"variable_name": "variableName", "selector": "selector"},
)
class WebApplicationFirewallPolicyCustomRulesMatchConditionsMatchVariables:
    def __init__(
        self,
        *,
        variable_name: builtins.str,
        selector: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param variable_name: -
        :param selector: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "variable_name": variable_name,
        }
        if selector is not None:
            self._values["selector"] = selector

    @builtins.property
    def variable_name(self) -> builtins.str:
        result = self._values.get("variable_name")
        assert result is not None, "Required property 'variable_name' is missing"
        return result

    @builtins.property
    def selector(self) -> typing.Optional[builtins.str]:
        result = self._values.get("selector")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyCustomRulesMatchConditionsMatchVariables(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyManagedRules",
    jsii_struct_bases=[],
    name_mapping={"managed_rule_set": "managedRuleSet", "exclusion": "exclusion"},
)
class WebApplicationFirewallPolicyManagedRules:
    def __init__(
        self,
        *,
        managed_rule_set: typing.List["WebApplicationFirewallPolicyManagedRulesManagedRuleSet"],
        exclusion: typing.Optional[typing.List["WebApplicationFirewallPolicyManagedRulesExclusion"]] = None,
    ) -> None:
        """
        :param managed_rule_set: managed_rule_set block.
        :param exclusion: exclusion block.
        """
        self._values: typing.Dict[str, typing.Any] = {
            "managed_rule_set": managed_rule_set,
        }
        if exclusion is not None:
            self._values["exclusion"] = exclusion

    @builtins.property
    def managed_rule_set(
        self,
    ) -> typing.List["WebApplicationFirewallPolicyManagedRulesManagedRuleSet"]:
        """managed_rule_set block."""
        result = self._values.get("managed_rule_set")
        assert result is not None, "Required property 'managed_rule_set' is missing"
        return result

    @builtins.property
    def exclusion(
        self,
    ) -> typing.Optional[typing.List["WebApplicationFirewallPolicyManagedRulesExclusion"]]:
        """exclusion block."""
        result = self._values.get("exclusion")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyManagedRules(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyManagedRulesExclusion",
    jsii_struct_bases=[],
    name_mapping={
        "match_variable": "matchVariable",
        "selector": "selector",
        "selector_match_operator": "selectorMatchOperator",
    },
)
class WebApplicationFirewallPolicyManagedRulesExclusion:
    def __init__(
        self,
        *,
        match_variable: builtins.str,
        selector: builtins.str,
        selector_match_operator: builtins.str,
    ) -> None:
        """
        :param match_variable: -
        :param selector: -
        :param selector_match_operator: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "match_variable": match_variable,
            "selector": selector,
            "selector_match_operator": selector_match_operator,
        }

    @builtins.property
    def match_variable(self) -> builtins.str:
        result = self._values.get("match_variable")
        assert result is not None, "Required property 'match_variable' is missing"
        return result

    @builtins.property
    def selector(self) -> builtins.str:
        result = self._values.get("selector")
        assert result is not None, "Required property 'selector' is missing"
        return result

    @builtins.property
    def selector_match_operator(self) -> builtins.str:
        result = self._values.get("selector_match_operator")
        assert result is not None, "Required property 'selector_match_operator' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyManagedRulesExclusion(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyManagedRulesManagedRuleSet",
    jsii_struct_bases=[],
    name_mapping={
        "version": "version",
        "rule_group_override": "ruleGroupOverride",
        "type": "type",
    },
)
class WebApplicationFirewallPolicyManagedRulesManagedRuleSet:
    def __init__(
        self,
        *,
        version: builtins.str,
        rule_group_override: typing.Optional[typing.List["WebApplicationFirewallPolicyManagedRulesManagedRuleSetRuleGroupOverride"]] = None,
        type: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param version: -
        :param rule_group_override: rule_group_override block.
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "version": version,
        }
        if rule_group_override is not None:
            self._values["rule_group_override"] = rule_group_override
        if type is not None:
            self._values["type"] = type

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    @builtins.property
    def rule_group_override(
        self,
    ) -> typing.Optional[typing.List["WebApplicationFirewallPolicyManagedRulesManagedRuleSetRuleGroupOverride"]]:
        """rule_group_override block."""
        result = self._values.get("rule_group_override")
        return result

    @builtins.property
    def type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("type")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyManagedRulesManagedRuleSet(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyManagedRulesManagedRuleSetRuleGroupOverride",
    jsii_struct_bases=[],
    name_mapping={
        "disabled_rules": "disabledRules",
        "rule_group_name": "ruleGroupName",
    },
)
class WebApplicationFirewallPolicyManagedRulesManagedRuleSetRuleGroupOverride:
    def __init__(
        self,
        *,
        disabled_rules: typing.List[builtins.str],
        rule_group_name: builtins.str,
    ) -> None:
        """
        :param disabled_rules: -
        :param rule_group_name: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "disabled_rules": disabled_rules,
            "rule_group_name": rule_group_name,
        }

    @builtins.property
    def disabled_rules(self) -> typing.List[builtins.str]:
        result = self._values.get("disabled_rules")
        assert result is not None, "Required property 'disabled_rules' is missing"
        return result

    @builtins.property
    def rule_group_name(self) -> builtins.str:
        result = self._values.get("rule_group_name")
        assert result is not None, "Required property 'rule_group_name' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyManagedRulesManagedRuleSetRuleGroupOverride(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyPolicySettings",
    jsii_struct_bases=[],
    name_mapping={
        "enabled": "enabled",
        "file_upload_limit_in_mb": "fileUploadLimitInMb",
        "max_request_body_size_in_kb": "maxRequestBodySizeInKb",
        "mode": "mode",
        "request_body_check": "requestBodyCheck",
    },
)
class WebApplicationFirewallPolicyPolicySettings:
    def __init__(
        self,
        *,
        enabled: typing.Optional[builtins.bool] = None,
        file_upload_limit_in_mb: typing.Optional[jsii.Number] = None,
        max_request_body_size_in_kb: typing.Optional[jsii.Number] = None,
        mode: typing.Optional[builtins.str] = None,
        request_body_check: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param enabled: -
        :param file_upload_limit_in_mb: -
        :param max_request_body_size_in_kb: -
        :param mode: -
        :param request_body_check: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if enabled is not None:
            self._values["enabled"] = enabled
        if file_upload_limit_in_mb is not None:
            self._values["file_upload_limit_in_mb"] = file_upload_limit_in_mb
        if max_request_body_size_in_kb is not None:
            self._values["max_request_body_size_in_kb"] = max_request_body_size_in_kb
        if mode is not None:
            self._values["mode"] = mode
        if request_body_check is not None:
            self._values["request_body_check"] = request_body_check

    @builtins.property
    def enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enabled")
        return result

    @builtins.property
    def file_upload_limit_in_mb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("file_upload_limit_in_mb")
        return result

    @builtins.property
    def max_request_body_size_in_kb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_request_body_size_in_kb")
        return result

    @builtins.property
    def mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("mode")
        return result

    @builtins.property
    def request_body_check(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("request_body_check")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyPolicySettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WebApplicationFirewallPolicyTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class WebApplicationFirewallPolicyTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WebApplicationFirewallPolicyTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class WindowsVirtualMachine(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.WindowsVirtualMachine",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        admin_password: builtins.str,
        admin_username: builtins.str,
        location: builtins.str,
        name: builtins.str,
        network_interface_ids: typing.List[builtins.str],
        os_disk: typing.List["WindowsVirtualMachineOsDisk"],
        resource_group_name: builtins.str,
        size: builtins.str,
        additional_capabilities: typing.Optional[typing.List["WindowsVirtualMachineAdditionalCapabilities"]] = None,
        additional_unattend_content: typing.Optional[typing.List["WindowsVirtualMachineAdditionalUnattendContent"]] = None,
        allow_extension_operations: typing.Optional[builtins.bool] = None,
        availability_set_id: typing.Optional[builtins.str] = None,
        boot_diagnostics: typing.Optional[typing.List["WindowsVirtualMachineBootDiagnostics"]] = None,
        computer_name: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        dedicated_host_id: typing.Optional[builtins.str] = None,
        enable_automatic_updates: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extensions_time_budget: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["WindowsVirtualMachineIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        patch_mode: typing.Optional[builtins.str] = None,
        plan: typing.Optional[typing.List["WindowsVirtualMachinePlan"]] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["WindowsVirtualMachineSecret"]] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["WindowsVirtualMachineSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["WindowsVirtualMachineTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        virtual_machine_scale_set_id: typing.Optional[builtins.str] = None,
        winrm_listener: typing.Optional[typing.List["WindowsVirtualMachineWinrmListener"]] = None,
        zone: typing.Optional[builtins.str] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param admin_password: -
        :param admin_username: -
        :param location: -
        :param name: -
        :param network_interface_ids: -
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param size: -
        :param additional_capabilities: additional_capabilities block.
        :param additional_unattend_content: additional_unattend_content block.
        :param allow_extension_operations: -
        :param availability_set_id: -
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name: -
        :param custom_data: -
        :param dedicated_host_id: -
        :param enable_automatic_updates: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extensions_time_budget: -
        :param identity: identity block.
        :param license_type: -
        :param max_bid_price: -
        :param patch_mode: -
        :param plan: plan block.
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param secret: secret block.
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param timezone: -
        :param virtual_machine_scale_set_id: -
        :param winrm_listener: winrm_listener block.
        :param zone: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = WindowsVirtualMachineConfig(
            admin_password=admin_password,
            admin_username=admin_username,
            location=location,
            name=name,
            network_interface_ids=network_interface_ids,
            os_disk=os_disk,
            resource_group_name=resource_group_name,
            size=size,
            additional_capabilities=additional_capabilities,
            additional_unattend_content=additional_unattend_content,
            allow_extension_operations=allow_extension_operations,
            availability_set_id=availability_set_id,
            boot_diagnostics=boot_diagnostics,
            computer_name=computer_name,
            custom_data=custom_data,
            dedicated_host_id=dedicated_host_id,
            enable_automatic_updates=enable_automatic_updates,
            encryption_at_host_enabled=encryption_at_host_enabled,
            eviction_policy=eviction_policy,
            extensions_time_budget=extensions_time_budget,
            identity=identity,
            license_type=license_type,
            max_bid_price=max_bid_price,
            patch_mode=patch_mode,
            plan=plan,
            priority=priority,
            provision_vm_agent=provision_vm_agent,
            proximity_placement_group_id=proximity_placement_group_id,
            secret=secret,
            source_image_id=source_image_id,
            source_image_reference=source_image_reference,
            tags=tags,
            timeouts=timeouts,
            timezone=timezone,
            virtual_machine_scale_set_id=virtual_machine_scale_set_id,
            winrm_listener=winrm_listener,
            zone=zone,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(WindowsVirtualMachine, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalCapabilities")
    def reset_additional_capabilities(self) -> None:
        return jsii.invoke(self, "resetAdditionalCapabilities", [])

    @jsii.member(jsii_name="resetAdditionalUnattendContent")
    def reset_additional_unattend_content(self) -> None:
        return jsii.invoke(self, "resetAdditionalUnattendContent", [])

    @jsii.member(jsii_name="resetAllowExtensionOperations")
    def reset_allow_extension_operations(self) -> None:
        return jsii.invoke(self, "resetAllowExtensionOperations", [])

    @jsii.member(jsii_name="resetAvailabilitySetId")
    def reset_availability_set_id(self) -> None:
        return jsii.invoke(self, "resetAvailabilitySetId", [])

    @jsii.member(jsii_name="resetBootDiagnostics")
    def reset_boot_diagnostics(self) -> None:
        return jsii.invoke(self, "resetBootDiagnostics", [])

    @jsii.member(jsii_name="resetComputerName")
    def reset_computer_name(self) -> None:
        return jsii.invoke(self, "resetComputerName", [])

    @jsii.member(jsii_name="resetCustomData")
    def reset_custom_data(self) -> None:
        return jsii.invoke(self, "resetCustomData", [])

    @jsii.member(jsii_name="resetDedicatedHostId")
    def reset_dedicated_host_id(self) -> None:
        return jsii.invoke(self, "resetDedicatedHostId", [])

    @jsii.member(jsii_name="resetEnableAutomaticUpdates")
    def reset_enable_automatic_updates(self) -> None:
        return jsii.invoke(self, "resetEnableAutomaticUpdates", [])

    @jsii.member(jsii_name="resetEncryptionAtHostEnabled")
    def reset_encryption_at_host_enabled(self) -> None:
        return jsii.invoke(self, "resetEncryptionAtHostEnabled", [])

    @jsii.member(jsii_name="resetEvictionPolicy")
    def reset_eviction_policy(self) -> None:
        return jsii.invoke(self, "resetEvictionPolicy", [])

    @jsii.member(jsii_name="resetExtensionsTimeBudget")
    def reset_extensions_time_budget(self) -> None:
        return jsii.invoke(self, "resetExtensionsTimeBudget", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetMaxBidPrice")
    def reset_max_bid_price(self) -> None:
        return jsii.invoke(self, "resetMaxBidPrice", [])

    @jsii.member(jsii_name="resetPatchMode")
    def reset_patch_mode(self) -> None:
        return jsii.invoke(self, "resetPatchMode", [])

    @jsii.member(jsii_name="resetPlan")
    def reset_plan(self) -> None:
        return jsii.invoke(self, "resetPlan", [])

    @jsii.member(jsii_name="resetPriority")
    def reset_priority(self) -> None:
        return jsii.invoke(self, "resetPriority", [])

    @jsii.member(jsii_name="resetProvisionVmAgent")
    def reset_provision_vm_agent(self) -> None:
        return jsii.invoke(self, "resetProvisionVmAgent", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetSecret")
    def reset_secret(self) -> None:
        return jsii.invoke(self, "resetSecret", [])

    @jsii.member(jsii_name="resetSourceImageId")
    def reset_source_image_id(self) -> None:
        return jsii.invoke(self, "resetSourceImageId", [])

    @jsii.member(jsii_name="resetSourceImageReference")
    def reset_source_image_reference(self) -> None:
        return jsii.invoke(self, "resetSourceImageReference", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTimezone")
    def reset_timezone(self) -> None:
        return jsii.invoke(self, "resetTimezone", [])

    @jsii.member(jsii_name="resetVirtualMachineScaleSetId")
    def reset_virtual_machine_scale_set_id(self) -> None:
        return jsii.invoke(self, "resetVirtualMachineScaleSetId", [])

    @jsii.member(jsii_name="resetWinrmListener")
    def reset_winrm_listener(self) -> None:
        return jsii.invoke(self, "resetWinrmListener", [])

    @jsii.member(jsii_name="resetZone")
    def reset_zone(self) -> None:
        return jsii.invoke(self, "resetZone", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPasswordInput")
    def admin_password_input(self) -> builtins.str:
        return jsii.get(self, "adminPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsernameInput")
    def admin_username_input(self) -> builtins.str:
        return jsii.get(self, "adminUsernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIdsInput")
    def network_interface_ids_input(self) -> typing.List[builtins.str]:
        return jsii.get(self, "networkInterfaceIdsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskInput")
    def os_disk_input(self) -> typing.List["WindowsVirtualMachineOsDisk"]:
        return jsii.get(self, "osDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> builtins.str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="privateIpAddresses")
    def private_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "privateIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddress")
    def public_ip_address(self) -> builtins.str:
        return jsii.get(self, "publicIpAddress")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="publicIpAddresses")
    def public_ip_addresses(self) -> typing.List[builtins.str]:
        return jsii.get(self, "publicIpAddresses")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sizeInput")
    def size_input(self) -> builtins.str:
        return jsii.get(self, "sizeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineId")
    def virtual_machine_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilitiesInput")
    def additional_capabilities_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineAdditionalCapabilities"]]:
        return jsii.get(self, "additionalCapabilitiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalUnattendContentInput")
    def additional_unattend_content_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineAdditionalUnattendContent"]]:
        return jsii.get(self, "additionalUnattendContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowExtensionOperationsInput")
    def allow_extension_operations_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "allowExtensionOperationsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilitySetIdInput")
    def availability_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "availabilitySetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnosticsInput")
    def boot_diagnostics_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineBootDiagnostics"]]:
        return jsii.get(self, "bootDiagnosticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerNameInput")
    def computer_name_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "computerNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDataInput")
    def custom_data_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "customDataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostIdInput")
    def dedicated_host_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "dedicatedHostIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutomaticUpdatesInput")
    def enable_automatic_updates_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableAutomaticUpdatesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabledInput")
    def encryption_at_host_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptionAtHostEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicyInput")
    def eviction_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "evictionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extensionsTimeBudgetInput")
    def extensions_time_budget_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "extensionsTimeBudgetInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPriceInput")
    def max_bid_price_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxBidPriceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="patchModeInput")
    def patch_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "patchModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(self) -> typing.Optional[typing.List["WindowsVirtualMachinePlan"]]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgentInput")
    def provision_vm_agent_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "provisionVmAgentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretInput")
    def secret_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineSecret"]]:
        return jsii.get(self, "secretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageIdInput")
    def source_image_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceImageIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReferenceInput")
    def source_image_reference_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineSourceImageReference"]]:
        return jsii.get(self, "sourceImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(self) -> typing.Optional["WindowsVirtualMachineTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezoneInput")
    def timezone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "timezoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineScaleSetIdInput")
    def virtual_machine_scale_set_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "virtualMachineScaleSetIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="winrmListenerInput")
    def winrm_listener_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineWinrmListener"]]:
        return jsii.get(self, "winrmListenerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneInput")
    def zone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "zoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilities")
    def additional_capabilities(
        self,
    ) -> typing.List["WindowsVirtualMachineAdditionalCapabilities"]:
        return jsii.get(self, "additionalCapabilities")

    @additional_capabilities.setter # type: ignore
    def additional_capabilities(
        self,
        value: typing.List["WindowsVirtualMachineAdditionalCapabilities"],
    ) -> None:
        jsii.set(self, "additionalCapabilities", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalUnattendContent")
    def additional_unattend_content(
        self,
    ) -> typing.List["WindowsVirtualMachineAdditionalUnattendContent"]:
        return jsii.get(self, "additionalUnattendContent")

    @additional_unattend_content.setter # type: ignore
    def additional_unattend_content(
        self,
        value: typing.List["WindowsVirtualMachineAdditionalUnattendContent"],
    ) -> None:
        jsii.set(self, "additionalUnattendContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPassword")
    def admin_password(self) -> builtins.str:
        return jsii.get(self, "adminPassword")

    @admin_password.setter # type: ignore
    def admin_password(self, value: builtins.str) -> None:
        jsii.set(self, "adminPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")

    @admin_username.setter # type: ignore
    def admin_username(self, value: builtins.str) -> None:
        jsii.set(self, "adminUsername", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="allowExtensionOperations")
    def allow_extension_operations(self) -> builtins.bool:
        return jsii.get(self, "allowExtensionOperations")

    @allow_extension_operations.setter # type: ignore
    def allow_extension_operations(self, value: builtins.bool) -> None:
        jsii.set(self, "allowExtensionOperations", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="availabilitySetId")
    def availability_set_id(self) -> builtins.str:
        return jsii.get(self, "availabilitySetId")

    @availability_set_id.setter # type: ignore
    def availability_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "availabilitySetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnostics")
    def boot_diagnostics(self) -> typing.List["WindowsVirtualMachineBootDiagnostics"]:
        return jsii.get(self, "bootDiagnostics")

    @boot_diagnostics.setter # type: ignore
    def boot_diagnostics(
        self,
        value: typing.List["WindowsVirtualMachineBootDiagnostics"],
    ) -> None:
        jsii.set(self, "bootDiagnostics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerName")
    def computer_name(self) -> builtins.str:
        return jsii.get(self, "computerName")

    @computer_name.setter # type: ignore
    def computer_name(self, value: builtins.str) -> None:
        jsii.set(self, "computerName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customData")
    def custom_data(self) -> builtins.str:
        return jsii.get(self, "customData")

    @custom_data.setter # type: ignore
    def custom_data(self, value: builtins.str) -> None:
        jsii.set(self, "customData", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dedicatedHostId")
    def dedicated_host_id(self) -> builtins.str:
        return jsii.get(self, "dedicatedHostId")

    @dedicated_host_id.setter # type: ignore
    def dedicated_host_id(self, value: builtins.str) -> None:
        jsii.set(self, "dedicatedHostId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutomaticUpdates")
    def enable_automatic_updates(self) -> builtins.bool:
        return jsii.get(self, "enableAutomaticUpdates")

    @enable_automatic_updates.setter # type: ignore
    def enable_automatic_updates(self, value: builtins.bool) -> None:
        jsii.set(self, "enableAutomaticUpdates", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabled")
    def encryption_at_host_enabled(self) -> builtins.bool:
        return jsii.get(self, "encryptionAtHostEnabled")

    @encryption_at_host_enabled.setter # type: ignore
    def encryption_at_host_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "encryptionAtHostEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicy")
    def eviction_policy(self) -> builtins.str:
        return jsii.get(self, "evictionPolicy")

    @eviction_policy.setter # type: ignore
    def eviction_policy(self, value: builtins.str) -> None:
        jsii.set(self, "evictionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extensionsTimeBudget")
    def extensions_time_budget(self) -> builtins.str:
        return jsii.get(self, "extensionsTimeBudget")

    @extensions_time_budget.setter # type: ignore
    def extensions_time_budget(self, value: builtins.str) -> None:
        jsii.set(self, "extensionsTimeBudget", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["WindowsVirtualMachineIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(self, value: typing.List["WindowsVirtualMachineIdentity"]) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPrice")
    def max_bid_price(self) -> jsii.Number:
        return jsii.get(self, "maxBidPrice")

    @max_bid_price.setter # type: ignore
    def max_bid_price(self, value: jsii.Number) -> None:
        jsii.set(self, "maxBidPrice", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceIds")
    def network_interface_ids(self) -> typing.List[builtins.str]:
        return jsii.get(self, "networkInterfaceIds")

    @network_interface_ids.setter # type: ignore
    def network_interface_ids(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "networkInterfaceIds", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDisk")
    def os_disk(self) -> typing.List["WindowsVirtualMachineOsDisk"]:
        return jsii.get(self, "osDisk")

    @os_disk.setter # type: ignore
    def os_disk(self, value: typing.List["WindowsVirtualMachineOsDisk"]) -> None:
        jsii.set(self, "osDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="patchMode")
    def patch_mode(self) -> builtins.str:
        return jsii.get(self, "patchMode")

    @patch_mode.setter # type: ignore
    def patch_mode(self, value: builtins.str) -> None:
        jsii.set(self, "patchMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["WindowsVirtualMachinePlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["WindowsVirtualMachinePlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> builtins.str:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: builtins.str) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgent")
    def provision_vm_agent(self) -> builtins.bool:
        return jsii.get(self, "provisionVmAgent")

    @provision_vm_agent.setter # type: ignore
    def provision_vm_agent(self, value: builtins.bool) -> None:
        jsii.set(self, "provisionVmAgent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> typing.List["WindowsVirtualMachineSecret"]:
        return jsii.get(self, "secret")

    @secret.setter # type: ignore
    def secret(self, value: typing.List["WindowsVirtualMachineSecret"]) -> None:
        jsii.set(self, "secret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="size")
    def size(self) -> builtins.str:
        return jsii.get(self, "size")

    @size.setter # type: ignore
    def size(self, value: builtins.str) -> None:
        jsii.set(self, "size", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageId")
    def source_image_id(self) -> builtins.str:
        return jsii.get(self, "sourceImageId")

    @source_image_id.setter # type: ignore
    def source_image_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceImageId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReference")
    def source_image_reference(
        self,
    ) -> typing.List["WindowsVirtualMachineSourceImageReference"]:
        return jsii.get(self, "sourceImageReference")

    @source_image_reference.setter # type: ignore
    def source_image_reference(
        self,
        value: typing.List["WindowsVirtualMachineSourceImageReference"],
    ) -> None:
        jsii.set(self, "sourceImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "WindowsVirtualMachineTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "WindowsVirtualMachineTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezone")
    def timezone(self) -> builtins.str:
        return jsii.get(self, "timezone")

    @timezone.setter # type: ignore
    def timezone(self, value: builtins.str) -> None:
        jsii.set(self, "timezone", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="virtualMachineScaleSetId")
    def virtual_machine_scale_set_id(self) -> builtins.str:
        return jsii.get(self, "virtualMachineScaleSetId")

    @virtual_machine_scale_set_id.setter # type: ignore
    def virtual_machine_scale_set_id(self, value: builtins.str) -> None:
        jsii.set(self, "virtualMachineScaleSetId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="winrmListener")
    def winrm_listener(self) -> typing.List["WindowsVirtualMachineWinrmListener"]:
        return jsii.get(self, "winrmListener")

    @winrm_listener.setter # type: ignore
    def winrm_listener(
        self,
        value: typing.List["WindowsVirtualMachineWinrmListener"],
    ) -> None:
        jsii.set(self, "winrmListener", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zone")
    def zone(self) -> builtins.str:
        return jsii.get(self, "zone")

    @zone.setter # type: ignore
    def zone(self, value: builtins.str) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineAdditionalCapabilities",
    jsii_struct_bases=[],
    name_mapping={"ultra_ssd_enabled": "ultraSsdEnabled"},
)
class WindowsVirtualMachineAdditionalCapabilities:
    def __init__(
        self,
        *,
        ultra_ssd_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param ultra_ssd_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ultra_ssd_enabled is not None:
            self._values["ultra_ssd_enabled"] = ultra_ssd_enabled

    @builtins.property
    def ultra_ssd_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ultra_ssd_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineAdditionalCapabilities(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineAdditionalUnattendContent",
    jsii_struct_bases=[],
    name_mapping={"content": "content", "setting": "setting"},
)
class WindowsVirtualMachineAdditionalUnattendContent:
    def __init__(self, *, content: builtins.str, setting: builtins.str) -> None:
        """
        :param content: -
        :param setting: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "content": content,
            "setting": setting,
        }

    @builtins.property
    def content(self) -> builtins.str:
        result = self._values.get("content")
        assert result is not None, "Required property 'content' is missing"
        return result

    @builtins.property
    def setting(self) -> builtins.str:
        result = self._values.get("setting")
        assert result is not None, "Required property 'setting' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineAdditionalUnattendContent(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineBootDiagnostics",
    jsii_struct_bases=[],
    name_mapping={"storage_account_uri": "storageAccountUri"},
)
class WindowsVirtualMachineBootDiagnostics:
    def __init__(
        self,
        *,
        storage_account_uri: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param storage_account_uri: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if storage_account_uri is not None:
            self._values["storage_account_uri"] = storage_account_uri

    @builtins.property
    def storage_account_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_uri")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineBootDiagnostics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "admin_password": "adminPassword",
        "admin_username": "adminUsername",
        "location": "location",
        "name": "name",
        "network_interface_ids": "networkInterfaceIds",
        "os_disk": "osDisk",
        "resource_group_name": "resourceGroupName",
        "size": "size",
        "additional_capabilities": "additionalCapabilities",
        "additional_unattend_content": "additionalUnattendContent",
        "allow_extension_operations": "allowExtensionOperations",
        "availability_set_id": "availabilitySetId",
        "boot_diagnostics": "bootDiagnostics",
        "computer_name": "computerName",
        "custom_data": "customData",
        "dedicated_host_id": "dedicatedHostId",
        "enable_automatic_updates": "enableAutomaticUpdates",
        "encryption_at_host_enabled": "encryptionAtHostEnabled",
        "eviction_policy": "evictionPolicy",
        "extensions_time_budget": "extensionsTimeBudget",
        "identity": "identity",
        "license_type": "licenseType",
        "max_bid_price": "maxBidPrice",
        "patch_mode": "patchMode",
        "plan": "plan",
        "priority": "priority",
        "provision_vm_agent": "provisionVmAgent",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "secret": "secret",
        "source_image_id": "sourceImageId",
        "source_image_reference": "sourceImageReference",
        "tags": "tags",
        "timeouts": "timeouts",
        "timezone": "timezone",
        "virtual_machine_scale_set_id": "virtualMachineScaleSetId",
        "winrm_listener": "winrmListener",
        "zone": "zone",
    },
)
class WindowsVirtualMachineConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        admin_password: builtins.str,
        admin_username: builtins.str,
        location: builtins.str,
        name: builtins.str,
        network_interface_ids: typing.List[builtins.str],
        os_disk: typing.List["WindowsVirtualMachineOsDisk"],
        resource_group_name: builtins.str,
        size: builtins.str,
        additional_capabilities: typing.Optional[typing.List[WindowsVirtualMachineAdditionalCapabilities]] = None,
        additional_unattend_content: typing.Optional[typing.List[WindowsVirtualMachineAdditionalUnattendContent]] = None,
        allow_extension_operations: typing.Optional[builtins.bool] = None,
        availability_set_id: typing.Optional[builtins.str] = None,
        boot_diagnostics: typing.Optional[typing.List[WindowsVirtualMachineBootDiagnostics]] = None,
        computer_name: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        dedicated_host_id: typing.Optional[builtins.str] = None,
        enable_automatic_updates: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extensions_time_budget: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["WindowsVirtualMachineIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        patch_mode: typing.Optional[builtins.str] = None,
        plan: typing.Optional[typing.List["WindowsVirtualMachinePlan"]] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["WindowsVirtualMachineSecret"]] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["WindowsVirtualMachineSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        timeouts: typing.Optional["WindowsVirtualMachineTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        virtual_machine_scale_set_id: typing.Optional[builtins.str] = None,
        winrm_listener: typing.Optional[typing.List["WindowsVirtualMachineWinrmListener"]] = None,
        zone: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param admin_password: -
        :param admin_username: -
        :param location: -
        :param name: -
        :param network_interface_ids: -
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param size: -
        :param additional_capabilities: additional_capabilities block.
        :param additional_unattend_content: additional_unattend_content block.
        :param allow_extension_operations: -
        :param availability_set_id: -
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name: -
        :param custom_data: -
        :param dedicated_host_id: -
        :param enable_automatic_updates: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extensions_time_budget: -
        :param identity: identity block.
        :param license_type: -
        :param max_bid_price: -
        :param patch_mode: -
        :param plan: plan block.
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param secret: secret block.
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param timeouts: timeouts block.
        :param timezone: -
        :param virtual_machine_scale_set_id: -
        :param winrm_listener: winrm_listener block.
        :param zone: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = WindowsVirtualMachineTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "admin_password": admin_password,
            "admin_username": admin_username,
            "location": location,
            "name": name,
            "network_interface_ids": network_interface_ids,
            "os_disk": os_disk,
            "resource_group_name": resource_group_name,
            "size": size,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_capabilities is not None:
            self._values["additional_capabilities"] = additional_capabilities
        if additional_unattend_content is not None:
            self._values["additional_unattend_content"] = additional_unattend_content
        if allow_extension_operations is not None:
            self._values["allow_extension_operations"] = allow_extension_operations
        if availability_set_id is not None:
            self._values["availability_set_id"] = availability_set_id
        if boot_diagnostics is not None:
            self._values["boot_diagnostics"] = boot_diagnostics
        if computer_name is not None:
            self._values["computer_name"] = computer_name
        if custom_data is not None:
            self._values["custom_data"] = custom_data
        if dedicated_host_id is not None:
            self._values["dedicated_host_id"] = dedicated_host_id
        if enable_automatic_updates is not None:
            self._values["enable_automatic_updates"] = enable_automatic_updates
        if encryption_at_host_enabled is not None:
            self._values["encryption_at_host_enabled"] = encryption_at_host_enabled
        if eviction_policy is not None:
            self._values["eviction_policy"] = eviction_policy
        if extensions_time_budget is not None:
            self._values["extensions_time_budget"] = extensions_time_budget
        if identity is not None:
            self._values["identity"] = identity
        if license_type is not None:
            self._values["license_type"] = license_type
        if max_bid_price is not None:
            self._values["max_bid_price"] = max_bid_price
        if patch_mode is not None:
            self._values["patch_mode"] = patch_mode
        if plan is not None:
            self._values["plan"] = plan
        if priority is not None:
            self._values["priority"] = priority
        if provision_vm_agent is not None:
            self._values["provision_vm_agent"] = provision_vm_agent
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if secret is not None:
            self._values["secret"] = secret
        if source_image_id is not None:
            self._values["source_image_id"] = source_image_id
        if source_image_reference is not None:
            self._values["source_image_reference"] = source_image_reference
        if tags is not None:
            self._values["tags"] = tags
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if timezone is not None:
            self._values["timezone"] = timezone
        if virtual_machine_scale_set_id is not None:
            self._values["virtual_machine_scale_set_id"] = virtual_machine_scale_set_id
        if winrm_listener is not None:
            self._values["winrm_listener"] = winrm_listener
        if zone is not None:
            self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def admin_password(self) -> builtins.str:
        result = self._values.get("admin_password")
        assert result is not None, "Required property 'admin_password' is missing"
        return result

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_interface_ids(self) -> typing.List[builtins.str]:
        result = self._values.get("network_interface_ids")
        assert result is not None, "Required property 'network_interface_ids' is missing"
        return result

    @builtins.property
    def os_disk(self) -> typing.List["WindowsVirtualMachineOsDisk"]:
        """os_disk block."""
        result = self._values.get("os_disk")
        assert result is not None, "Required property 'os_disk' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def size(self) -> builtins.str:
        result = self._values.get("size")
        assert result is not None, "Required property 'size' is missing"
        return result

    @builtins.property
    def additional_capabilities(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineAdditionalCapabilities]]:
        """additional_capabilities block."""
        result = self._values.get("additional_capabilities")
        return result

    @builtins.property
    def additional_unattend_content(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineAdditionalUnattendContent]]:
        """additional_unattend_content block."""
        result = self._values.get("additional_unattend_content")
        return result

    @builtins.property
    def allow_extension_operations(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("allow_extension_operations")
        return result

    @builtins.property
    def availability_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("availability_set_id")
        return result

    @builtins.property
    def boot_diagnostics(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineBootDiagnostics]]:
        """boot_diagnostics block."""
        result = self._values.get("boot_diagnostics")
        return result

    @builtins.property
    def computer_name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("computer_name")
        return result

    @builtins.property
    def custom_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_data")
        return result

    @builtins.property
    def dedicated_host_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("dedicated_host_id")
        return result

    @builtins.property
    def enable_automatic_updates(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_automatic_updates")
        return result

    @builtins.property
    def encryption_at_host_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encryption_at_host_enabled")
        return result

    @builtins.property
    def eviction_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eviction_policy")
        return result

    @builtins.property
    def extensions_time_budget(self) -> typing.Optional[builtins.str]:
        result = self._values.get("extensions_time_budget")
        return result

    @builtins.property
    def identity(self) -> typing.Optional[typing.List["WindowsVirtualMachineIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def max_bid_price(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_bid_price")
        return result

    @builtins.property
    def patch_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("patch_mode")
        return result

    @builtins.property
    def plan(self) -> typing.Optional[typing.List["WindowsVirtualMachinePlan"]]:
        """plan block."""
        result = self._values.get("plan")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def provision_vm_agent(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("provision_vm_agent")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def secret(self) -> typing.Optional[typing.List["WindowsVirtualMachineSecret"]]:
        """secret block."""
        result = self._values.get("secret")
        return result

    @builtins.property
    def source_image_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_image_id")
        return result

    @builtins.property
    def source_image_reference(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineSourceImageReference"]]:
        """source_image_reference block."""
        result = self._values.get("source_image_reference")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["WindowsVirtualMachineTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    @builtins.property
    def virtual_machine_scale_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("virtual_machine_scale_set_id")
        return result

    @builtins.property
    def winrm_listener(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineWinrmListener"]]:
        """winrm_listener block."""
        result = self._values.get("winrm_listener")
        return result

    @builtins.property
    def zone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("zone")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class WindowsVirtualMachineIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineOsDisk",
    jsii_struct_bases=[],
    name_mapping={
        "caching": "caching",
        "storage_account_type": "storageAccountType",
        "diff_disk_settings": "diffDiskSettings",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "disk_size_gb": "diskSizeGb",
        "name": "name",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class WindowsVirtualMachineOsDisk:
    def __init__(
        self,
        *,
        caching: builtins.str,
        storage_account_type: builtins.str,
        diff_disk_settings: typing.Optional[typing.List["WindowsVirtualMachineOsDiskDiffDiskSettings"]] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        name: typing.Optional[builtins.str] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param caching: -
        :param storage_account_type: -
        :param diff_disk_settings: diff_disk_settings block.
        :param disk_encryption_set_id: -
        :param disk_size_gb: -
        :param name: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "caching": caching,
            "storage_account_type": storage_account_type,
        }
        if diff_disk_settings is not None:
            self._values["diff_disk_settings"] = diff_disk_settings
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if name is not None:
            self._values["name"] = name
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def caching(self) -> builtins.str:
        result = self._values.get("caching")
        assert result is not None, "Required property 'caching' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> builtins.str:
        result = self._values.get("storage_account_type")
        assert result is not None, "Required property 'storage_account_type' is missing"
        return result

    @builtins.property
    def diff_disk_settings(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineOsDiskDiffDiskSettings"]]:
        """diff_disk_settings block."""
        result = self._values.get("diff_disk_settings")
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def name(self) -> typing.Optional[builtins.str]:
        result = self._values.get("name")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineOsDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineOsDiskDiffDiskSettings",
    jsii_struct_bases=[],
    name_mapping={"option": "option"},
)
class WindowsVirtualMachineOsDiskDiffDiskSettings:
    def __init__(self, *, option: builtins.str) -> None:
        """
        :param option: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "option": option,
        }

    @builtins.property
    def option(self) -> builtins.str:
        result = self._values.get("option")
        assert result is not None, "Required property 'option' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineOsDiskDiffDiskSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachinePlan",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "product": "product", "publisher": "publisher"},
)
class WindowsVirtualMachinePlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: builtins.str,
        publisher: builtins.str,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "product": product,
            "publisher": publisher,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachinePlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


class WindowsVirtualMachineScaleSet(
    cdktf.TerraformResource,
    metaclass=jsii.JSIIMeta,
    jsii_type="azurerm.WindowsVirtualMachineScaleSet",
):
    def __init__(
        self,
        scope: constructs.Construct,
        id: builtins.str,
        *,
        admin_password: builtins.str,
        admin_username: builtins.str,
        instances: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        network_interface: typing.List["WindowsVirtualMachineScaleSetNetworkInterface"],
        os_disk: typing.List["WindowsVirtualMachineScaleSetOsDisk"],
        resource_group_name: builtins.str,
        sku: builtins.str,
        additional_capabilities: typing.Optional[typing.List["WindowsVirtualMachineScaleSetAdditionalCapabilities"]] = None,
        additional_unattend_content: typing.Optional[typing.List["WindowsVirtualMachineScaleSetAdditionalUnattendContent"]] = None,
        automatic_instance_repair: typing.Optional[typing.List["WindowsVirtualMachineScaleSetAutomaticInstanceRepair"]] = None,
        automatic_os_upgrade_policy: typing.Optional[typing.List["WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy"]] = None,
        boot_diagnostics: typing.Optional[typing.List["WindowsVirtualMachineScaleSetBootDiagnostics"]] = None,
        computer_name_prefix: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        data_disk: typing.Optional[typing.List["WindowsVirtualMachineScaleSetDataDisk"]] = None,
        do_not_run_extensions_on_overprovisioned_machines: typing.Optional[builtins.bool] = None,
        enable_automatic_updates: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extension: typing.Optional[typing.List["WindowsVirtualMachineScaleSetExtension"]] = None,
        health_probe_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["WindowsVirtualMachineScaleSetIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        overprovision: typing.Optional[builtins.bool] = None,
        plan: typing.Optional[typing.List["WindowsVirtualMachineScaleSetPlan"]] = None,
        platform_fault_domain_count: typing.Optional[jsii.Number] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        rolling_upgrade_policy: typing.Optional[typing.List["WindowsVirtualMachineScaleSetRollingUpgradePolicy"]] = None,
        scale_in_policy: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["WindowsVirtualMachineScaleSetSecret"]] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["WindowsVirtualMachineScaleSetSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        terminate_notification: typing.Optional[typing.List["WindowsVirtualMachineScaleSetTerminateNotification"]] = None,
        timeouts: typing.Optional["WindowsVirtualMachineScaleSetTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        upgrade_mode: typing.Optional[builtins.str] = None,
        winrm_listener: typing.Optional[typing.List["WindowsVirtualMachineScaleSetWinrmListener"]] = None,
        zone_balance: typing.Optional[builtins.bool] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
    ) -> None:
        """
        :param scope: -
        :param id: -
        :param admin_password: -
        :param admin_username: -
        :param instances: -
        :param location: -
        :param name: -
        :param network_interface: network_interface block.
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param sku: -
        :param additional_capabilities: additional_capabilities block.
        :param additional_unattend_content: additional_unattend_content block.
        :param automatic_instance_repair: automatic_instance_repair block.
        :param automatic_os_upgrade_policy: automatic_os_upgrade_policy block.
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name_prefix: -
        :param custom_data: -
        :param data_disk: data_disk block.
        :param do_not_run_extensions_on_overprovisioned_machines: -
        :param enable_automatic_updates: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extension: extension block.
        :param health_probe_id: -
        :param identity: identity block.
        :param license_type: -
        :param max_bid_price: -
        :param overprovision: -
        :param plan: plan block.
        :param platform_fault_domain_count: -
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param rolling_upgrade_policy: rolling_upgrade_policy block.
        :param scale_in_policy: -
        :param secret: secret block.
        :param single_placement_group: -
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param terminate_notification: terminate_notification block.
        :param timeouts: timeouts block.
        :param timezone: -
        :param upgrade_mode: -
        :param winrm_listener: winrm_listener block.
        :param zone_balance: -
        :param zones: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = WindowsVirtualMachineScaleSetConfig(
            admin_password=admin_password,
            admin_username=admin_username,
            instances=instances,
            location=location,
            name=name,
            network_interface=network_interface,
            os_disk=os_disk,
            resource_group_name=resource_group_name,
            sku=sku,
            additional_capabilities=additional_capabilities,
            additional_unattend_content=additional_unattend_content,
            automatic_instance_repair=automatic_instance_repair,
            automatic_os_upgrade_policy=automatic_os_upgrade_policy,
            boot_diagnostics=boot_diagnostics,
            computer_name_prefix=computer_name_prefix,
            custom_data=custom_data,
            data_disk=data_disk,
            do_not_run_extensions_on_overprovisioned_machines=do_not_run_extensions_on_overprovisioned_machines,
            enable_automatic_updates=enable_automatic_updates,
            encryption_at_host_enabled=encryption_at_host_enabled,
            eviction_policy=eviction_policy,
            extension=extension,
            health_probe_id=health_probe_id,
            identity=identity,
            license_type=license_type,
            max_bid_price=max_bid_price,
            overprovision=overprovision,
            plan=plan,
            platform_fault_domain_count=platform_fault_domain_count,
            priority=priority,
            provision_vm_agent=provision_vm_agent,
            proximity_placement_group_id=proximity_placement_group_id,
            rolling_upgrade_policy=rolling_upgrade_policy,
            scale_in_policy=scale_in_policy,
            secret=secret,
            single_placement_group=single_placement_group,
            source_image_id=source_image_id,
            source_image_reference=source_image_reference,
            tags=tags,
            terminate_notification=terminate_notification,
            timeouts=timeouts,
            timezone=timezone,
            upgrade_mode=upgrade_mode,
            winrm_listener=winrm_listener,
            zone_balance=zone_balance,
            zones=zones,
            count=count,
            depends_on=depends_on,
            lifecycle=lifecycle,
            provider=provider,
        )

        jsii.create(WindowsVirtualMachineScaleSet, self, [scope, id, config])

    @jsii.member(jsii_name="resetAdditionalCapabilities")
    def reset_additional_capabilities(self) -> None:
        return jsii.invoke(self, "resetAdditionalCapabilities", [])

    @jsii.member(jsii_name="resetAdditionalUnattendContent")
    def reset_additional_unattend_content(self) -> None:
        return jsii.invoke(self, "resetAdditionalUnattendContent", [])

    @jsii.member(jsii_name="resetAutomaticInstanceRepair")
    def reset_automatic_instance_repair(self) -> None:
        return jsii.invoke(self, "resetAutomaticInstanceRepair", [])

    @jsii.member(jsii_name="resetAutomaticOsUpgradePolicy")
    def reset_automatic_os_upgrade_policy(self) -> None:
        return jsii.invoke(self, "resetAutomaticOsUpgradePolicy", [])

    @jsii.member(jsii_name="resetBootDiagnostics")
    def reset_boot_diagnostics(self) -> None:
        return jsii.invoke(self, "resetBootDiagnostics", [])

    @jsii.member(jsii_name="resetComputerNamePrefix")
    def reset_computer_name_prefix(self) -> None:
        return jsii.invoke(self, "resetComputerNamePrefix", [])

    @jsii.member(jsii_name="resetCustomData")
    def reset_custom_data(self) -> None:
        return jsii.invoke(self, "resetCustomData", [])

    @jsii.member(jsii_name="resetDataDisk")
    def reset_data_disk(self) -> None:
        return jsii.invoke(self, "resetDataDisk", [])

    @jsii.member(jsii_name="resetDoNotRunExtensionsOnOverprovisionedMachines")
    def reset_do_not_run_extensions_on_overprovisioned_machines(self) -> None:
        return jsii.invoke(self, "resetDoNotRunExtensionsOnOverprovisionedMachines", [])

    @jsii.member(jsii_name="resetEnableAutomaticUpdates")
    def reset_enable_automatic_updates(self) -> None:
        return jsii.invoke(self, "resetEnableAutomaticUpdates", [])

    @jsii.member(jsii_name="resetEncryptionAtHostEnabled")
    def reset_encryption_at_host_enabled(self) -> None:
        return jsii.invoke(self, "resetEncryptionAtHostEnabled", [])

    @jsii.member(jsii_name="resetEvictionPolicy")
    def reset_eviction_policy(self) -> None:
        return jsii.invoke(self, "resetEvictionPolicy", [])

    @jsii.member(jsii_name="resetExtension")
    def reset_extension(self) -> None:
        return jsii.invoke(self, "resetExtension", [])

    @jsii.member(jsii_name="resetHealthProbeId")
    def reset_health_probe_id(self) -> None:
        return jsii.invoke(self, "resetHealthProbeId", [])

    @jsii.member(jsii_name="resetIdentity")
    def reset_identity(self) -> None:
        return jsii.invoke(self, "resetIdentity", [])

    @jsii.member(jsii_name="resetLicenseType")
    def reset_license_type(self) -> None:
        return jsii.invoke(self, "resetLicenseType", [])

    @jsii.member(jsii_name="resetMaxBidPrice")
    def reset_max_bid_price(self) -> None:
        return jsii.invoke(self, "resetMaxBidPrice", [])

    @jsii.member(jsii_name="resetOverprovision")
    def reset_overprovision(self) -> None:
        return jsii.invoke(self, "resetOverprovision", [])

    @jsii.member(jsii_name="resetPlan")
    def reset_plan(self) -> None:
        return jsii.invoke(self, "resetPlan", [])

    @jsii.member(jsii_name="resetPlatformFaultDomainCount")
    def reset_platform_fault_domain_count(self) -> None:
        return jsii.invoke(self, "resetPlatformFaultDomainCount", [])

    @jsii.member(jsii_name="resetPriority")
    def reset_priority(self) -> None:
        return jsii.invoke(self, "resetPriority", [])

    @jsii.member(jsii_name="resetProvisionVmAgent")
    def reset_provision_vm_agent(self) -> None:
        return jsii.invoke(self, "resetProvisionVmAgent", [])

    @jsii.member(jsii_name="resetProximityPlacementGroupId")
    def reset_proximity_placement_group_id(self) -> None:
        return jsii.invoke(self, "resetProximityPlacementGroupId", [])

    @jsii.member(jsii_name="resetRollingUpgradePolicy")
    def reset_rolling_upgrade_policy(self) -> None:
        return jsii.invoke(self, "resetRollingUpgradePolicy", [])

    @jsii.member(jsii_name="resetScaleInPolicy")
    def reset_scale_in_policy(self) -> None:
        return jsii.invoke(self, "resetScaleInPolicy", [])

    @jsii.member(jsii_name="resetSecret")
    def reset_secret(self) -> None:
        return jsii.invoke(self, "resetSecret", [])

    @jsii.member(jsii_name="resetSinglePlacementGroup")
    def reset_single_placement_group(self) -> None:
        return jsii.invoke(self, "resetSinglePlacementGroup", [])

    @jsii.member(jsii_name="resetSourceImageId")
    def reset_source_image_id(self) -> None:
        return jsii.invoke(self, "resetSourceImageId", [])

    @jsii.member(jsii_name="resetSourceImageReference")
    def reset_source_image_reference(self) -> None:
        return jsii.invoke(self, "resetSourceImageReference", [])

    @jsii.member(jsii_name="resetTags")
    def reset_tags(self) -> None:
        return jsii.invoke(self, "resetTags", [])

    @jsii.member(jsii_name="resetTerminateNotification")
    def reset_terminate_notification(self) -> None:
        return jsii.invoke(self, "resetTerminateNotification", [])

    @jsii.member(jsii_name="resetTimeouts")
    def reset_timeouts(self) -> None:
        return jsii.invoke(self, "resetTimeouts", [])

    @jsii.member(jsii_name="resetTimezone")
    def reset_timezone(self) -> None:
        return jsii.invoke(self, "resetTimezone", [])

    @jsii.member(jsii_name="resetUpgradeMode")
    def reset_upgrade_mode(self) -> None:
        return jsii.invoke(self, "resetUpgradeMode", [])

    @jsii.member(jsii_name="resetWinrmListener")
    def reset_winrm_listener(self) -> None:
        return jsii.invoke(self, "resetWinrmListener", [])

    @jsii.member(jsii_name="resetZoneBalance")
    def reset_zone_balance(self) -> None:
        return jsii.invoke(self, "resetZoneBalance", [])

    @jsii.member(jsii_name="resetZones")
    def reset_zones(self) -> None:
        return jsii.invoke(self, "resetZones", [])

    @jsii.member(jsii_name="synthesizeAttributes")
    def _synthesize_attributes(self) -> typing.Mapping[builtins.str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPasswordInput")
    def admin_password_input(self) -> builtins.str:
        return jsii.get(self, "adminPasswordInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsernameInput")
    def admin_username_input(self) -> builtins.str:
        return jsii.get(self, "adminUsernameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="id")
    def id(self) -> builtins.str:
        return jsii.get(self, "id")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instancesInput")
    def instances_input(self) -> jsii.Number:
        return jsii.get(self, "instancesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="locationInput")
    def location_input(self) -> builtins.str:
        return jsii.get(self, "locationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="nameInput")
    def name_input(self) -> builtins.str:
        return jsii.get(self, "nameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterfaceInput")
    def network_interface_input(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetNetworkInterface"]:
        return jsii.get(self, "networkInterfaceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDiskInput")
    def os_disk_input(self) -> typing.List["WindowsVirtualMachineScaleSetOsDisk"]:
        return jsii.get(self, "osDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupNameInput")
    def resource_group_name_input(self) -> builtins.str:
        return jsii.get(self, "resourceGroupNameInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="skuInput")
    def sku_input(self) -> builtins.str:
        return jsii.get(self, "skuInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="uniqueId")
    def unique_id(self) -> builtins.str:
        return jsii.get(self, "uniqueId")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilitiesInput")
    def additional_capabilities_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetAdditionalCapabilities"]]:
        return jsii.get(self, "additionalCapabilitiesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalUnattendContentInput")
    def additional_unattend_content_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetAdditionalUnattendContent"]]:
        return jsii.get(self, "additionalUnattendContentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticInstanceRepairInput")
    def automatic_instance_repair_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetAutomaticInstanceRepair"]]:
        return jsii.get(self, "automaticInstanceRepairInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticOsUpgradePolicyInput")
    def automatic_os_upgrade_policy_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy"]]:
        return jsii.get(self, "automaticOsUpgradePolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnosticsInput")
    def boot_diagnostics_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetBootDiagnostics"]]:
        return jsii.get(self, "bootDiagnosticsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerNamePrefixInput")
    def computer_name_prefix_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "computerNamePrefixInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customDataInput")
    def custom_data_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "customDataInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataDiskInput")
    def data_disk_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetDataDisk"]]:
        return jsii.get(self, "dataDiskInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="doNotRunExtensionsOnOverprovisionedMachinesInput")
    def do_not_run_extensions_on_overprovisioned_machines_input(
        self,
    ) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "doNotRunExtensionsOnOverprovisionedMachinesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutomaticUpdatesInput")
    def enable_automatic_updates_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "enableAutomaticUpdatesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabledInput")
    def encryption_at_host_enabled_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "encryptionAtHostEnabledInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicyInput")
    def eviction_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "evictionPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extensionInput")
    def extension_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetExtension"]]:
        return jsii.get(self, "extensionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthProbeIdInput")
    def health_probe_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "healthProbeIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identityInput")
    def identity_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetIdentity"]]:
        return jsii.get(self, "identityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseTypeInput")
    def license_type_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "licenseTypeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPriceInput")
    def max_bid_price_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxBidPriceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="overprovisionInput")
    def overprovision_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "overprovisionInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="planInput")
    def plan_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetPlan"]]:
        return jsii.get(self, "planInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCountInput")
    def platform_fault_domain_count_input(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "platformFaultDomainCountInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priorityInput")
    def priority_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "priorityInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgentInput")
    def provision_vm_agent_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "provisionVmAgentInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupIdInput")
    def proximity_placement_group_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "proximityPlacementGroupIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollingUpgradePolicyInput")
    def rolling_upgrade_policy_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetRollingUpgradePolicy"]]:
        return jsii.get(self, "rollingUpgradePolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleInPolicyInput")
    def scale_in_policy_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "scaleInPolicyInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secretInput")
    def secret_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetSecret"]]:
        return jsii.get(self, "secretInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroupInput")
    def single_placement_group_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "singlePlacementGroupInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageIdInput")
    def source_image_id_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "sourceImageIdInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReferenceInput")
    def source_image_reference_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetSourceImageReference"]]:
        return jsii.get(self, "sourceImageReferenceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tagsInput")
    def tags_input(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        return jsii.get(self, "tagsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terminateNotificationInput")
    def terminate_notification_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetTerminateNotification"]]:
        return jsii.get(self, "terminateNotificationInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeoutsInput")
    def timeouts_input(
        self,
    ) -> typing.Optional["WindowsVirtualMachineScaleSetTimeouts"]:
        return jsii.get(self, "timeoutsInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezoneInput")
    def timezone_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "timezoneInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradeModeInput")
    def upgrade_mode_input(self) -> typing.Optional[builtins.str]:
        return jsii.get(self, "upgradeModeInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="winrmListenerInput")
    def winrm_listener_input(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetWinrmListener"]]:
        return jsii.get(self, "winrmListenerInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneBalanceInput")
    def zone_balance_input(self) -> typing.Optional[builtins.bool]:
        return jsii.get(self, "zoneBalanceInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zonesInput")
    def zones_input(self) -> typing.Optional[typing.List[builtins.str]]:
        return jsii.get(self, "zonesInput")

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalCapabilities")
    def additional_capabilities(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetAdditionalCapabilities"]:
        return jsii.get(self, "additionalCapabilities")

    @additional_capabilities.setter # type: ignore
    def additional_capabilities(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetAdditionalCapabilities"],
    ) -> None:
        jsii.set(self, "additionalCapabilities", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="additionalUnattendContent")
    def additional_unattend_content(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetAdditionalUnattendContent"]:
        return jsii.get(self, "additionalUnattendContent")

    @additional_unattend_content.setter # type: ignore
    def additional_unattend_content(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetAdditionalUnattendContent"],
    ) -> None:
        jsii.set(self, "additionalUnattendContent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminPassword")
    def admin_password(self) -> builtins.str:
        return jsii.get(self, "adminPassword")

    @admin_password.setter # type: ignore
    def admin_password(self, value: builtins.str) -> None:
        jsii.set(self, "adminPassword", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="adminUsername")
    def admin_username(self) -> builtins.str:
        return jsii.get(self, "adminUsername")

    @admin_username.setter # type: ignore
    def admin_username(self, value: builtins.str) -> None:
        jsii.set(self, "adminUsername", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticInstanceRepair")
    def automatic_instance_repair(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetAutomaticInstanceRepair"]:
        return jsii.get(self, "automaticInstanceRepair")

    @automatic_instance_repair.setter # type: ignore
    def automatic_instance_repair(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetAutomaticInstanceRepair"],
    ) -> None:
        jsii.set(self, "automaticInstanceRepair", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="automaticOsUpgradePolicy")
    def automatic_os_upgrade_policy(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy"]:
        return jsii.get(self, "automaticOsUpgradePolicy")

    @automatic_os_upgrade_policy.setter # type: ignore
    def automatic_os_upgrade_policy(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy"],
    ) -> None:
        jsii.set(self, "automaticOsUpgradePolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="bootDiagnostics")
    def boot_diagnostics(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetBootDiagnostics"]:
        return jsii.get(self, "bootDiagnostics")

    @boot_diagnostics.setter # type: ignore
    def boot_diagnostics(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetBootDiagnostics"],
    ) -> None:
        jsii.set(self, "bootDiagnostics", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="computerNamePrefix")
    def computer_name_prefix(self) -> builtins.str:
        return jsii.get(self, "computerNamePrefix")

    @computer_name_prefix.setter # type: ignore
    def computer_name_prefix(self, value: builtins.str) -> None:
        jsii.set(self, "computerNamePrefix", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="customData")
    def custom_data(self) -> builtins.str:
        return jsii.get(self, "customData")

    @custom_data.setter # type: ignore
    def custom_data(self, value: builtins.str) -> None:
        jsii.set(self, "customData", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="dataDisk")
    def data_disk(self) -> typing.List["WindowsVirtualMachineScaleSetDataDisk"]:
        return jsii.get(self, "dataDisk")

    @data_disk.setter # type: ignore
    def data_disk(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetDataDisk"],
    ) -> None:
        jsii.set(self, "dataDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="doNotRunExtensionsOnOverprovisionedMachines")
    def do_not_run_extensions_on_overprovisioned_machines(self) -> builtins.bool:
        return jsii.get(self, "doNotRunExtensionsOnOverprovisionedMachines")

    @do_not_run_extensions_on_overprovisioned_machines.setter # type: ignore
    def do_not_run_extensions_on_overprovisioned_machines(
        self,
        value: builtins.bool,
    ) -> None:
        jsii.set(self, "doNotRunExtensionsOnOverprovisionedMachines", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="enableAutomaticUpdates")
    def enable_automatic_updates(self) -> builtins.bool:
        return jsii.get(self, "enableAutomaticUpdates")

    @enable_automatic_updates.setter # type: ignore
    def enable_automatic_updates(self, value: builtins.bool) -> None:
        jsii.set(self, "enableAutomaticUpdates", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="encryptionAtHostEnabled")
    def encryption_at_host_enabled(self) -> builtins.bool:
        return jsii.get(self, "encryptionAtHostEnabled")

    @encryption_at_host_enabled.setter # type: ignore
    def encryption_at_host_enabled(self, value: builtins.bool) -> None:
        jsii.set(self, "encryptionAtHostEnabled", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="evictionPolicy")
    def eviction_policy(self) -> builtins.str:
        return jsii.get(self, "evictionPolicy")

    @eviction_policy.setter # type: ignore
    def eviction_policy(self, value: builtins.str) -> None:
        jsii.set(self, "evictionPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="extension")
    def extension(self) -> typing.List["WindowsVirtualMachineScaleSetExtension"]:
        return jsii.get(self, "extension")

    @extension.setter # type: ignore
    def extension(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetExtension"],
    ) -> None:
        jsii.set(self, "extension", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="healthProbeId")
    def health_probe_id(self) -> builtins.str:
        return jsii.get(self, "healthProbeId")

    @health_probe_id.setter # type: ignore
    def health_probe_id(self, value: builtins.str) -> None:
        jsii.set(self, "healthProbeId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="identity")
    def identity(self) -> typing.List["WindowsVirtualMachineScaleSetIdentity"]:
        return jsii.get(self, "identity")

    @identity.setter # type: ignore
    def identity(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetIdentity"],
    ) -> None:
        jsii.set(self, "identity", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="instances")
    def instances(self) -> jsii.Number:
        return jsii.get(self, "instances")

    @instances.setter # type: ignore
    def instances(self, value: jsii.Number) -> None:
        jsii.set(self, "instances", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="licenseType")
    def license_type(self) -> builtins.str:
        return jsii.get(self, "licenseType")

    @license_type.setter # type: ignore
    def license_type(self, value: builtins.str) -> None:
        jsii.set(self, "licenseType", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="location")
    def location(self) -> builtins.str:
        return jsii.get(self, "location")

    @location.setter # type: ignore
    def location(self, value: builtins.str) -> None:
        jsii.set(self, "location", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="maxBidPrice")
    def max_bid_price(self) -> jsii.Number:
        return jsii.get(self, "maxBidPrice")

    @max_bid_price.setter # type: ignore
    def max_bid_price(self, value: jsii.Number) -> None:
        jsii.set(self, "maxBidPrice", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="name")
    def name(self) -> builtins.str:
        return jsii.get(self, "name")

    @name.setter # type: ignore
    def name(self, value: builtins.str) -> None:
        jsii.set(self, "name", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="networkInterface")
    def network_interface(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetNetworkInterface"]:
        return jsii.get(self, "networkInterface")

    @network_interface.setter # type: ignore
    def network_interface(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetNetworkInterface"],
    ) -> None:
        jsii.set(self, "networkInterface", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="osDisk")
    def os_disk(self) -> typing.List["WindowsVirtualMachineScaleSetOsDisk"]:
        return jsii.get(self, "osDisk")

    @os_disk.setter # type: ignore
    def os_disk(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetOsDisk"],
    ) -> None:
        jsii.set(self, "osDisk", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="overprovision")
    def overprovision(self) -> builtins.bool:
        return jsii.get(self, "overprovision")

    @overprovision.setter # type: ignore
    def overprovision(self, value: builtins.bool) -> None:
        jsii.set(self, "overprovision", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="plan")
    def plan(self) -> typing.List["WindowsVirtualMachineScaleSetPlan"]:
        return jsii.get(self, "plan")

    @plan.setter # type: ignore
    def plan(self, value: typing.List["WindowsVirtualMachineScaleSetPlan"]) -> None:
        jsii.set(self, "plan", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="platformFaultDomainCount")
    def platform_fault_domain_count(self) -> jsii.Number:
        return jsii.get(self, "platformFaultDomainCount")

    @platform_fault_domain_count.setter # type: ignore
    def platform_fault_domain_count(self, value: jsii.Number) -> None:
        jsii.set(self, "platformFaultDomainCount", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="priority")
    def priority(self) -> builtins.str:
        return jsii.get(self, "priority")

    @priority.setter # type: ignore
    def priority(self, value: builtins.str) -> None:
        jsii.set(self, "priority", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="provisionVmAgent")
    def provision_vm_agent(self) -> builtins.bool:
        return jsii.get(self, "provisionVmAgent")

    @provision_vm_agent.setter # type: ignore
    def provision_vm_agent(self, value: builtins.bool) -> None:
        jsii.set(self, "provisionVmAgent", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="proximityPlacementGroupId")
    def proximity_placement_group_id(self) -> builtins.str:
        return jsii.get(self, "proximityPlacementGroupId")

    @proximity_placement_group_id.setter # type: ignore
    def proximity_placement_group_id(self, value: builtins.str) -> None:
        jsii.set(self, "proximityPlacementGroupId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="resourceGroupName")
    def resource_group_name(self) -> builtins.str:
        return jsii.get(self, "resourceGroupName")

    @resource_group_name.setter # type: ignore
    def resource_group_name(self, value: builtins.str) -> None:
        jsii.set(self, "resourceGroupName", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="rollingUpgradePolicy")
    def rolling_upgrade_policy(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetRollingUpgradePolicy"]:
        return jsii.get(self, "rollingUpgradePolicy")

    @rolling_upgrade_policy.setter # type: ignore
    def rolling_upgrade_policy(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetRollingUpgradePolicy"],
    ) -> None:
        jsii.set(self, "rollingUpgradePolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="scaleInPolicy")
    def scale_in_policy(self) -> builtins.str:
        return jsii.get(self, "scaleInPolicy")

    @scale_in_policy.setter # type: ignore
    def scale_in_policy(self, value: builtins.str) -> None:
        jsii.set(self, "scaleInPolicy", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="secret")
    def secret(self) -> typing.List["WindowsVirtualMachineScaleSetSecret"]:
        return jsii.get(self, "secret")

    @secret.setter # type: ignore
    def secret(self, value: typing.List["WindowsVirtualMachineScaleSetSecret"]) -> None:
        jsii.set(self, "secret", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="singlePlacementGroup")
    def single_placement_group(self) -> builtins.bool:
        return jsii.get(self, "singlePlacementGroup")

    @single_placement_group.setter # type: ignore
    def single_placement_group(self, value: builtins.bool) -> None:
        jsii.set(self, "singlePlacementGroup", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sku")
    def sku(self) -> builtins.str:
        return jsii.get(self, "sku")

    @sku.setter # type: ignore
    def sku(self, value: builtins.str) -> None:
        jsii.set(self, "sku", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageId")
    def source_image_id(self) -> builtins.str:
        return jsii.get(self, "sourceImageId")

    @source_image_id.setter # type: ignore
    def source_image_id(self, value: builtins.str) -> None:
        jsii.set(self, "sourceImageId", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="sourceImageReference")
    def source_image_reference(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetSourceImageReference"]:
        return jsii.get(self, "sourceImageReference")

    @source_image_reference.setter # type: ignore
    def source_image_reference(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetSourceImageReference"],
    ) -> None:
        jsii.set(self, "sourceImageReference", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Mapping[builtins.str, builtins.str]:
        return jsii.get(self, "tags")

    @tags.setter # type: ignore
    def tags(self, value: typing.Mapping[builtins.str, builtins.str]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="terminateNotification")
    def terminate_notification(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetTerminateNotification"]:
        return jsii.get(self, "terminateNotification")

    @terminate_notification.setter # type: ignore
    def terminate_notification(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetTerminateNotification"],
    ) -> None:
        jsii.set(self, "terminateNotification", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> "WindowsVirtualMachineScaleSetTimeouts":
        return jsii.get(self, "timeouts")

    @timeouts.setter # type: ignore
    def timeouts(self, value: "WindowsVirtualMachineScaleSetTimeouts") -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="timezone")
    def timezone(self) -> builtins.str:
        return jsii.get(self, "timezone")

    @timezone.setter # type: ignore
    def timezone(self, value: builtins.str) -> None:
        jsii.set(self, "timezone", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="upgradeMode")
    def upgrade_mode(self) -> builtins.str:
        return jsii.get(self, "upgradeMode")

    @upgrade_mode.setter # type: ignore
    def upgrade_mode(self, value: builtins.str) -> None:
        jsii.set(self, "upgradeMode", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="winrmListener")
    def winrm_listener(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetWinrmListener"]:
        return jsii.get(self, "winrmListener")

    @winrm_listener.setter # type: ignore
    def winrm_listener(
        self,
        value: typing.List["WindowsVirtualMachineScaleSetWinrmListener"],
    ) -> None:
        jsii.set(self, "winrmListener", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zoneBalance")
    def zone_balance(self) -> builtins.bool:
        return jsii.get(self, "zoneBalance")

    @zone_balance.setter # type: ignore
    def zone_balance(self, value: builtins.bool) -> None:
        jsii.set(self, "zoneBalance", value)

    @builtins.property # type: ignore
    @jsii.member(jsii_name="zones")
    def zones(self) -> typing.List[builtins.str]:
        return jsii.get(self, "zones")

    @zones.setter # type: ignore
    def zones(self, value: typing.List[builtins.str]) -> None:
        jsii.set(self, "zones", value)


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetAdditionalCapabilities",
    jsii_struct_bases=[],
    name_mapping={"ultra_ssd_enabled": "ultraSsdEnabled"},
)
class WindowsVirtualMachineScaleSetAdditionalCapabilities:
    def __init__(
        self,
        *,
        ultra_ssd_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param ultra_ssd_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if ultra_ssd_enabled is not None:
            self._values["ultra_ssd_enabled"] = ultra_ssd_enabled

    @builtins.property
    def ultra_ssd_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("ultra_ssd_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetAdditionalCapabilities(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetAdditionalUnattendContent",
    jsii_struct_bases=[],
    name_mapping={"content": "content", "setting": "setting"},
)
class WindowsVirtualMachineScaleSetAdditionalUnattendContent:
    def __init__(self, *, content: builtins.str, setting: builtins.str) -> None:
        """
        :param content: -
        :param setting: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "content": content,
            "setting": setting,
        }

    @builtins.property
    def content(self) -> builtins.str:
        result = self._values.get("content")
        assert result is not None, "Required property 'content' is missing"
        return result

    @builtins.property
    def setting(self) -> builtins.str:
        result = self._values.get("setting")
        assert result is not None, "Required property 'setting' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetAdditionalUnattendContent(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetAutomaticInstanceRepair",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "grace_period": "gracePeriod"},
)
class WindowsVirtualMachineScaleSetAutomaticInstanceRepair:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        grace_period: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param grace_period: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if grace_period is not None:
            self._values["grace_period"] = grace_period

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def grace_period(self) -> typing.Optional[builtins.str]:
        result = self._values.get("grace_period")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetAutomaticInstanceRepair(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy",
    jsii_struct_bases=[],
    name_mapping={
        "disable_automatic_rollback": "disableAutomaticRollback",
        "enable_automatic_os_upgrade": "enableAutomaticOsUpgrade",
    },
)
class WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy:
    def __init__(
        self,
        *,
        disable_automatic_rollback: builtins.bool,
        enable_automatic_os_upgrade: builtins.bool,
    ) -> None:
        """
        :param disable_automatic_rollback: -
        :param enable_automatic_os_upgrade: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "disable_automatic_rollback": disable_automatic_rollback,
            "enable_automatic_os_upgrade": enable_automatic_os_upgrade,
        }

    @builtins.property
    def disable_automatic_rollback(self) -> builtins.bool:
        result = self._values.get("disable_automatic_rollback")
        assert result is not None, "Required property 'disable_automatic_rollback' is missing"
        return result

    @builtins.property
    def enable_automatic_os_upgrade(self) -> builtins.bool:
        result = self._values.get("enable_automatic_os_upgrade")
        assert result is not None, "Required property 'enable_automatic_os_upgrade' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetBootDiagnostics",
    jsii_struct_bases=[],
    name_mapping={"storage_account_uri": "storageAccountUri"},
)
class WindowsVirtualMachineScaleSetBootDiagnostics:
    def __init__(
        self,
        *,
        storage_account_uri: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param storage_account_uri: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if storage_account_uri is not None:
            self._values["storage_account_uri"] = storage_account_uri

    @builtins.property
    def storage_account_uri(self) -> typing.Optional[builtins.str]:
        result = self._values.get("storage_account_uri")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetBootDiagnostics(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetConfig",
    jsii_struct_bases=[cdktf.TerraformMetaArguments],
    name_mapping={
        "count": "count",
        "depends_on": "dependsOn",
        "lifecycle": "lifecycle",
        "provider": "provider",
        "admin_password": "adminPassword",
        "admin_username": "adminUsername",
        "instances": "instances",
        "location": "location",
        "name": "name",
        "network_interface": "networkInterface",
        "os_disk": "osDisk",
        "resource_group_name": "resourceGroupName",
        "sku": "sku",
        "additional_capabilities": "additionalCapabilities",
        "additional_unattend_content": "additionalUnattendContent",
        "automatic_instance_repair": "automaticInstanceRepair",
        "automatic_os_upgrade_policy": "automaticOsUpgradePolicy",
        "boot_diagnostics": "bootDiagnostics",
        "computer_name_prefix": "computerNamePrefix",
        "custom_data": "customData",
        "data_disk": "dataDisk",
        "do_not_run_extensions_on_overprovisioned_machines": "doNotRunExtensionsOnOverprovisionedMachines",
        "enable_automatic_updates": "enableAutomaticUpdates",
        "encryption_at_host_enabled": "encryptionAtHostEnabled",
        "eviction_policy": "evictionPolicy",
        "extension": "extension",
        "health_probe_id": "healthProbeId",
        "identity": "identity",
        "license_type": "licenseType",
        "max_bid_price": "maxBidPrice",
        "overprovision": "overprovision",
        "plan": "plan",
        "platform_fault_domain_count": "platformFaultDomainCount",
        "priority": "priority",
        "provision_vm_agent": "provisionVmAgent",
        "proximity_placement_group_id": "proximityPlacementGroupId",
        "rolling_upgrade_policy": "rollingUpgradePolicy",
        "scale_in_policy": "scaleInPolicy",
        "secret": "secret",
        "single_placement_group": "singlePlacementGroup",
        "source_image_id": "sourceImageId",
        "source_image_reference": "sourceImageReference",
        "tags": "tags",
        "terminate_notification": "terminateNotification",
        "timeouts": "timeouts",
        "timezone": "timezone",
        "upgrade_mode": "upgradeMode",
        "winrm_listener": "winrmListener",
        "zone_balance": "zoneBalance",
        "zones": "zones",
    },
)
class WindowsVirtualMachineScaleSetConfig(cdktf.TerraformMetaArguments):
    def __init__(
        self,
        *,
        count: typing.Optional[jsii.Number] = None,
        depends_on: typing.Optional[typing.List[cdktf.ITerraformDependable]] = None,
        lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle] = None,
        provider: typing.Optional[cdktf.TerraformProvider] = None,
        admin_password: builtins.str,
        admin_username: builtins.str,
        instances: jsii.Number,
        location: builtins.str,
        name: builtins.str,
        network_interface: typing.List["WindowsVirtualMachineScaleSetNetworkInterface"],
        os_disk: typing.List["WindowsVirtualMachineScaleSetOsDisk"],
        resource_group_name: builtins.str,
        sku: builtins.str,
        additional_capabilities: typing.Optional[typing.List[WindowsVirtualMachineScaleSetAdditionalCapabilities]] = None,
        additional_unattend_content: typing.Optional[typing.List[WindowsVirtualMachineScaleSetAdditionalUnattendContent]] = None,
        automatic_instance_repair: typing.Optional[typing.List[WindowsVirtualMachineScaleSetAutomaticInstanceRepair]] = None,
        automatic_os_upgrade_policy: typing.Optional[typing.List[WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy]] = None,
        boot_diagnostics: typing.Optional[typing.List[WindowsVirtualMachineScaleSetBootDiagnostics]] = None,
        computer_name_prefix: typing.Optional[builtins.str] = None,
        custom_data: typing.Optional[builtins.str] = None,
        data_disk: typing.Optional[typing.List["WindowsVirtualMachineScaleSetDataDisk"]] = None,
        do_not_run_extensions_on_overprovisioned_machines: typing.Optional[builtins.bool] = None,
        enable_automatic_updates: typing.Optional[builtins.bool] = None,
        encryption_at_host_enabled: typing.Optional[builtins.bool] = None,
        eviction_policy: typing.Optional[builtins.str] = None,
        extension: typing.Optional[typing.List["WindowsVirtualMachineScaleSetExtension"]] = None,
        health_probe_id: typing.Optional[builtins.str] = None,
        identity: typing.Optional[typing.List["WindowsVirtualMachineScaleSetIdentity"]] = None,
        license_type: typing.Optional[builtins.str] = None,
        max_bid_price: typing.Optional[jsii.Number] = None,
        overprovision: typing.Optional[builtins.bool] = None,
        plan: typing.Optional[typing.List["WindowsVirtualMachineScaleSetPlan"]] = None,
        platform_fault_domain_count: typing.Optional[jsii.Number] = None,
        priority: typing.Optional[builtins.str] = None,
        provision_vm_agent: typing.Optional[builtins.bool] = None,
        proximity_placement_group_id: typing.Optional[builtins.str] = None,
        rolling_upgrade_policy: typing.Optional[typing.List["WindowsVirtualMachineScaleSetRollingUpgradePolicy"]] = None,
        scale_in_policy: typing.Optional[builtins.str] = None,
        secret: typing.Optional[typing.List["WindowsVirtualMachineScaleSetSecret"]] = None,
        single_placement_group: typing.Optional[builtins.bool] = None,
        source_image_id: typing.Optional[builtins.str] = None,
        source_image_reference: typing.Optional[typing.List["WindowsVirtualMachineScaleSetSourceImageReference"]] = None,
        tags: typing.Optional[typing.Mapping[builtins.str, builtins.str]] = None,
        terminate_notification: typing.Optional[typing.List["WindowsVirtualMachineScaleSetTerminateNotification"]] = None,
        timeouts: typing.Optional["WindowsVirtualMachineScaleSetTimeouts"] = None,
        timezone: typing.Optional[builtins.str] = None,
        upgrade_mode: typing.Optional[builtins.str] = None,
        winrm_listener: typing.Optional[typing.List["WindowsVirtualMachineScaleSetWinrmListener"]] = None,
        zone_balance: typing.Optional[builtins.bool] = None,
        zones: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param admin_password: -
        :param admin_username: -
        :param instances: -
        :param location: -
        :param name: -
        :param network_interface: network_interface block.
        :param os_disk: os_disk block.
        :param resource_group_name: -
        :param sku: -
        :param additional_capabilities: additional_capabilities block.
        :param additional_unattend_content: additional_unattend_content block.
        :param automatic_instance_repair: automatic_instance_repair block.
        :param automatic_os_upgrade_policy: automatic_os_upgrade_policy block.
        :param boot_diagnostics: boot_diagnostics block.
        :param computer_name_prefix: -
        :param custom_data: -
        :param data_disk: data_disk block.
        :param do_not_run_extensions_on_overprovisioned_machines: -
        :param enable_automatic_updates: -
        :param encryption_at_host_enabled: -
        :param eviction_policy: -
        :param extension: extension block.
        :param health_probe_id: -
        :param identity: identity block.
        :param license_type: -
        :param max_bid_price: -
        :param overprovision: -
        :param plan: plan block.
        :param platform_fault_domain_count: -
        :param priority: -
        :param provision_vm_agent: -
        :param proximity_placement_group_id: -
        :param rolling_upgrade_policy: rolling_upgrade_policy block.
        :param scale_in_policy: -
        :param secret: secret block.
        :param single_placement_group: -
        :param source_image_id: -
        :param source_image_reference: source_image_reference block.
        :param tags: -
        :param terminate_notification: terminate_notification block.
        :param timeouts: timeouts block.
        :param timezone: -
        :param upgrade_mode: -
        :param winrm_listener: winrm_listener block.
        :param zone_balance: -
        :param zones: -
        """
        if isinstance(lifecycle, dict):
            lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict):
            timeouts = WindowsVirtualMachineScaleSetTimeouts(**timeouts)
        self._values: typing.Dict[str, typing.Any] = {
            "admin_password": admin_password,
            "admin_username": admin_username,
            "instances": instances,
            "location": location,
            "name": name,
            "network_interface": network_interface,
            "os_disk": os_disk,
            "resource_group_name": resource_group_name,
            "sku": sku,
        }
        if count is not None:
            self._values["count"] = count
        if depends_on is not None:
            self._values["depends_on"] = depends_on
        if lifecycle is not None:
            self._values["lifecycle"] = lifecycle
        if provider is not None:
            self._values["provider"] = provider
        if additional_capabilities is not None:
            self._values["additional_capabilities"] = additional_capabilities
        if additional_unattend_content is not None:
            self._values["additional_unattend_content"] = additional_unattend_content
        if automatic_instance_repair is not None:
            self._values["automatic_instance_repair"] = automatic_instance_repair
        if automatic_os_upgrade_policy is not None:
            self._values["automatic_os_upgrade_policy"] = automatic_os_upgrade_policy
        if boot_diagnostics is not None:
            self._values["boot_diagnostics"] = boot_diagnostics
        if computer_name_prefix is not None:
            self._values["computer_name_prefix"] = computer_name_prefix
        if custom_data is not None:
            self._values["custom_data"] = custom_data
        if data_disk is not None:
            self._values["data_disk"] = data_disk
        if do_not_run_extensions_on_overprovisioned_machines is not None:
            self._values["do_not_run_extensions_on_overprovisioned_machines"] = do_not_run_extensions_on_overprovisioned_machines
        if enable_automatic_updates is not None:
            self._values["enable_automatic_updates"] = enable_automatic_updates
        if encryption_at_host_enabled is not None:
            self._values["encryption_at_host_enabled"] = encryption_at_host_enabled
        if eviction_policy is not None:
            self._values["eviction_policy"] = eviction_policy
        if extension is not None:
            self._values["extension"] = extension
        if health_probe_id is not None:
            self._values["health_probe_id"] = health_probe_id
        if identity is not None:
            self._values["identity"] = identity
        if license_type is not None:
            self._values["license_type"] = license_type
        if max_bid_price is not None:
            self._values["max_bid_price"] = max_bid_price
        if overprovision is not None:
            self._values["overprovision"] = overprovision
        if plan is not None:
            self._values["plan"] = plan
        if platform_fault_domain_count is not None:
            self._values["platform_fault_domain_count"] = platform_fault_domain_count
        if priority is not None:
            self._values["priority"] = priority
        if provision_vm_agent is not None:
            self._values["provision_vm_agent"] = provision_vm_agent
        if proximity_placement_group_id is not None:
            self._values["proximity_placement_group_id"] = proximity_placement_group_id
        if rolling_upgrade_policy is not None:
            self._values["rolling_upgrade_policy"] = rolling_upgrade_policy
        if scale_in_policy is not None:
            self._values["scale_in_policy"] = scale_in_policy
        if secret is not None:
            self._values["secret"] = secret
        if single_placement_group is not None:
            self._values["single_placement_group"] = single_placement_group
        if source_image_id is not None:
            self._values["source_image_id"] = source_image_id
        if source_image_reference is not None:
            self._values["source_image_reference"] = source_image_reference
        if tags is not None:
            self._values["tags"] = tags
        if terminate_notification is not None:
            self._values["terminate_notification"] = terminate_notification
        if timeouts is not None:
            self._values["timeouts"] = timeouts
        if timezone is not None:
            self._values["timezone"] = timezone
        if upgrade_mode is not None:
            self._values["upgrade_mode"] = upgrade_mode
        if winrm_listener is not None:
            self._values["winrm_listener"] = winrm_listener
        if zone_balance is not None:
            self._values["zone_balance"] = zone_balance
        if zones is not None:
            self._values["zones"] = zones

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        :stability: experimental
        """
        result = self._values.get("count")
        return result

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.ITerraformDependable]]:
        """
        :stability: experimental
        """
        result = self._values.get("depends_on")
        return result

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        :stability: experimental
        """
        result = self._values.get("lifecycle")
        return result

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        :stability: experimental
        """
        result = self._values.get("provider")
        return result

    @builtins.property
    def admin_password(self) -> builtins.str:
        result = self._values.get("admin_password")
        assert result is not None, "Required property 'admin_password' is missing"
        return result

    @builtins.property
    def admin_username(self) -> builtins.str:
        result = self._values.get("admin_username")
        assert result is not None, "Required property 'admin_username' is missing"
        return result

    @builtins.property
    def instances(self) -> jsii.Number:
        result = self._values.get("instances")
        assert result is not None, "Required property 'instances' is missing"
        return result

    @builtins.property
    def location(self) -> builtins.str:
        result = self._values.get("location")
        assert result is not None, "Required property 'location' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def network_interface(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetNetworkInterface"]:
        """network_interface block."""
        result = self._values.get("network_interface")
        assert result is not None, "Required property 'network_interface' is missing"
        return result

    @builtins.property
    def os_disk(self) -> typing.List["WindowsVirtualMachineScaleSetOsDisk"]:
        """os_disk block."""
        result = self._values.get("os_disk")
        assert result is not None, "Required property 'os_disk' is missing"
        return result

    @builtins.property
    def resource_group_name(self) -> builtins.str:
        result = self._values.get("resource_group_name")
        assert result is not None, "Required property 'resource_group_name' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def additional_capabilities(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineScaleSetAdditionalCapabilities]]:
        """additional_capabilities block."""
        result = self._values.get("additional_capabilities")
        return result

    @builtins.property
    def additional_unattend_content(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineScaleSetAdditionalUnattendContent]]:
        """additional_unattend_content block."""
        result = self._values.get("additional_unattend_content")
        return result

    @builtins.property
    def automatic_instance_repair(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineScaleSetAutomaticInstanceRepair]]:
        """automatic_instance_repair block."""
        result = self._values.get("automatic_instance_repair")
        return result

    @builtins.property
    def automatic_os_upgrade_policy(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy]]:
        """automatic_os_upgrade_policy block."""
        result = self._values.get("automatic_os_upgrade_policy")
        return result

    @builtins.property
    def boot_diagnostics(
        self,
    ) -> typing.Optional[typing.List[WindowsVirtualMachineScaleSetBootDiagnostics]]:
        """boot_diagnostics block."""
        result = self._values.get("boot_diagnostics")
        return result

    @builtins.property
    def computer_name_prefix(self) -> typing.Optional[builtins.str]:
        result = self._values.get("computer_name_prefix")
        return result

    @builtins.property
    def custom_data(self) -> typing.Optional[builtins.str]:
        result = self._values.get("custom_data")
        return result

    @builtins.property
    def data_disk(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetDataDisk"]]:
        """data_disk block."""
        result = self._values.get("data_disk")
        return result

    @builtins.property
    def do_not_run_extensions_on_overprovisioned_machines(
        self,
    ) -> typing.Optional[builtins.bool]:
        result = self._values.get("do_not_run_extensions_on_overprovisioned_machines")
        return result

    @builtins.property
    def enable_automatic_updates(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_automatic_updates")
        return result

    @builtins.property
    def encryption_at_host_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("encryption_at_host_enabled")
        return result

    @builtins.property
    def eviction_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("eviction_policy")
        return result

    @builtins.property
    def extension(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetExtension"]]:
        """extension block."""
        result = self._values.get("extension")
        return result

    @builtins.property
    def health_probe_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("health_probe_id")
        return result

    @builtins.property
    def identity(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetIdentity"]]:
        """identity block."""
        result = self._values.get("identity")
        return result

    @builtins.property
    def license_type(self) -> typing.Optional[builtins.str]:
        result = self._values.get("license_type")
        return result

    @builtins.property
    def max_bid_price(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("max_bid_price")
        return result

    @builtins.property
    def overprovision(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("overprovision")
        return result

    @builtins.property
    def plan(self) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetPlan"]]:
        """plan block."""
        result = self._values.get("plan")
        return result

    @builtins.property
    def platform_fault_domain_count(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("platform_fault_domain_count")
        return result

    @builtins.property
    def priority(self) -> typing.Optional[builtins.str]:
        result = self._values.get("priority")
        return result

    @builtins.property
    def provision_vm_agent(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("provision_vm_agent")
        return result

    @builtins.property
    def proximity_placement_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("proximity_placement_group_id")
        return result

    @builtins.property
    def rolling_upgrade_policy(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetRollingUpgradePolicy"]]:
        """rolling_upgrade_policy block."""
        result = self._values.get("rolling_upgrade_policy")
        return result

    @builtins.property
    def scale_in_policy(self) -> typing.Optional[builtins.str]:
        result = self._values.get("scale_in_policy")
        return result

    @builtins.property
    def secret(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetSecret"]]:
        """secret block."""
        result = self._values.get("secret")
        return result

    @builtins.property
    def single_placement_group(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("single_placement_group")
        return result

    @builtins.property
    def source_image_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("source_image_id")
        return result

    @builtins.property
    def source_image_reference(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetSourceImageReference"]]:
        """source_image_reference block."""
        result = self._values.get("source_image_reference")
        return result

    @builtins.property
    def tags(self) -> typing.Optional[typing.Mapping[builtins.str, builtins.str]]:
        result = self._values.get("tags")
        return result

    @builtins.property
    def terminate_notification(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetTerminateNotification"]]:
        """terminate_notification block."""
        result = self._values.get("terminate_notification")
        return result

    @builtins.property
    def timeouts(self) -> typing.Optional["WindowsVirtualMachineScaleSetTimeouts"]:
        """timeouts block."""
        result = self._values.get("timeouts")
        return result

    @builtins.property
    def timezone(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timezone")
        return result

    @builtins.property
    def upgrade_mode(self) -> typing.Optional[builtins.str]:
        result = self._values.get("upgrade_mode")
        return result

    @builtins.property
    def winrm_listener(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetWinrmListener"]]:
        """winrm_listener block."""
        result = self._values.get("winrm_listener")
        return result

    @builtins.property
    def zone_balance(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("zone_balance")
        return result

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("zones")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetConfig(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetDataDisk",
    jsii_struct_bases=[],
    name_mapping={
        "caching": "caching",
        "disk_size_gb": "diskSizeGb",
        "lun": "lun",
        "storage_account_type": "storageAccountType",
        "create_option": "createOption",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "disk_iops_read_write": "diskIopsReadWrite",
        "disk_mbps_read_write": "diskMbpsReadWrite",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class WindowsVirtualMachineScaleSetDataDisk:
    def __init__(
        self,
        *,
        caching: builtins.str,
        disk_size_gb: jsii.Number,
        lun: jsii.Number,
        storage_account_type: builtins.str,
        create_option: typing.Optional[builtins.str] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_iops_read_write: typing.Optional[jsii.Number] = None,
        disk_mbps_read_write: typing.Optional[jsii.Number] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param caching: -
        :param disk_size_gb: -
        :param lun: -
        :param storage_account_type: -
        :param create_option: -
        :param disk_encryption_set_id: -
        :param disk_iops_read_write: -
        :param disk_mbps_read_write: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "caching": caching,
            "disk_size_gb": disk_size_gb,
            "lun": lun,
            "storage_account_type": storage_account_type,
        }
        if create_option is not None:
            self._values["create_option"] = create_option
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if disk_iops_read_write is not None:
            self._values["disk_iops_read_write"] = disk_iops_read_write
        if disk_mbps_read_write is not None:
            self._values["disk_mbps_read_write"] = disk_mbps_read_write
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def caching(self) -> builtins.str:
        result = self._values.get("caching")
        assert result is not None, "Required property 'caching' is missing"
        return result

    @builtins.property
    def disk_size_gb(self) -> jsii.Number:
        result = self._values.get("disk_size_gb")
        assert result is not None, "Required property 'disk_size_gb' is missing"
        return result

    @builtins.property
    def lun(self) -> jsii.Number:
        result = self._values.get("lun")
        assert result is not None, "Required property 'lun' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> builtins.str:
        result = self._values.get("storage_account_type")
        assert result is not None, "Required property 'storage_account_type' is missing"
        return result

    @builtins.property
    def create_option(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create_option")
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def disk_iops_read_write(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_iops_read_write")
        return result

    @builtins.property
    def disk_mbps_read_write(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_mbps_read_write")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetDataDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetExtension",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "publisher": "publisher",
        "type": "type",
        "type_handler_version": "typeHandlerVersion",
        "auto_upgrade_minor_version": "autoUpgradeMinorVersion",
        "force_update_tag": "forceUpdateTag",
        "protected_settings": "protectedSettings",
        "provision_after_extensions": "provisionAfterExtensions",
        "settings": "settings",
    },
)
class WindowsVirtualMachineScaleSetExtension:
    def __init__(
        self,
        *,
        name: builtins.str,
        publisher: builtins.str,
        type: builtins.str,
        type_handler_version: builtins.str,
        auto_upgrade_minor_version: typing.Optional[builtins.bool] = None,
        force_update_tag: typing.Optional[builtins.str] = None,
        protected_settings: typing.Optional[builtins.str] = None,
        provision_after_extensions: typing.Optional[typing.List[builtins.str]] = None,
        settings: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param publisher: -
        :param type: -
        :param type_handler_version: -
        :param auto_upgrade_minor_version: -
        :param force_update_tag: -
        :param protected_settings: -
        :param provision_after_extensions: -
        :param settings: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "publisher": publisher,
            "type": type,
            "type_handler_version": type_handler_version,
        }
        if auto_upgrade_minor_version is not None:
            self._values["auto_upgrade_minor_version"] = auto_upgrade_minor_version
        if force_update_tag is not None:
            self._values["force_update_tag"] = force_update_tag
        if protected_settings is not None:
            self._values["protected_settings"] = protected_settings
        if provision_after_extensions is not None:
            self._values["provision_after_extensions"] = provision_after_extensions
        if settings is not None:
            self._values["settings"] = settings

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def type_handler_version(self) -> builtins.str:
        result = self._values.get("type_handler_version")
        assert result is not None, "Required property 'type_handler_version' is missing"
        return result

    @builtins.property
    def auto_upgrade_minor_version(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("auto_upgrade_minor_version")
        return result

    @builtins.property
    def force_update_tag(self) -> typing.Optional[builtins.str]:
        result = self._values.get("force_update_tag")
        return result

    @builtins.property
    def protected_settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("protected_settings")
        return result

    @builtins.property
    def provision_after_extensions(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("provision_after_extensions")
        return result

    @builtins.property
    def settings(self) -> typing.Optional[builtins.str]:
        result = self._values.get("settings")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetExtension(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetIdentity",
    jsii_struct_bases=[],
    name_mapping={"type": "type", "identity_ids": "identityIds"},
)
class WindowsVirtualMachineScaleSetIdentity:
    def __init__(
        self,
        *,
        type: builtins.str,
        identity_ids: typing.Optional[typing.List[builtins.str]] = None,
    ) -> None:
        """
        :param type: -
        :param identity_ids: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "type": type,
        }
        if identity_ids is not None:
            self._values["identity_ids"] = identity_ids

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    @builtins.property
    def identity_ids(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("identity_ids")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetIdentity(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetNetworkInterface",
    jsii_struct_bases=[],
    name_mapping={
        "ip_configuration": "ipConfiguration",
        "name": "name",
        "dns_servers": "dnsServers",
        "enable_accelerated_networking": "enableAcceleratedNetworking",
        "enable_ip_forwarding": "enableIpForwarding",
        "network_security_group_id": "networkSecurityGroupId",
        "primary": "primary",
    },
)
class WindowsVirtualMachineScaleSetNetworkInterface:
    def __init__(
        self,
        *,
        ip_configuration: typing.List["WindowsVirtualMachineScaleSetNetworkInterfaceIpConfiguration"],
        name: builtins.str,
        dns_servers: typing.Optional[typing.List[builtins.str]] = None,
        enable_accelerated_networking: typing.Optional[builtins.bool] = None,
        enable_ip_forwarding: typing.Optional[builtins.bool] = None,
        network_security_group_id: typing.Optional[builtins.str] = None,
        primary: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param ip_configuration: ip_configuration block.
        :param name: -
        :param dns_servers: -
        :param enable_accelerated_networking: -
        :param enable_ip_forwarding: -
        :param network_security_group_id: -
        :param primary: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "ip_configuration": ip_configuration,
            "name": name,
        }
        if dns_servers is not None:
            self._values["dns_servers"] = dns_servers
        if enable_accelerated_networking is not None:
            self._values["enable_accelerated_networking"] = enable_accelerated_networking
        if enable_ip_forwarding is not None:
            self._values["enable_ip_forwarding"] = enable_ip_forwarding
        if network_security_group_id is not None:
            self._values["network_security_group_id"] = network_security_group_id
        if primary is not None:
            self._values["primary"] = primary

    @builtins.property
    def ip_configuration(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetNetworkInterfaceIpConfiguration"]:
        """ip_configuration block."""
        result = self._values.get("ip_configuration")
        assert result is not None, "Required property 'ip_configuration' is missing"
        return result

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def dns_servers(self) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("dns_servers")
        return result

    @builtins.property
    def enable_accelerated_networking(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_accelerated_networking")
        return result

    @builtins.property
    def enable_ip_forwarding(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("enable_ip_forwarding")
        return result

    @builtins.property
    def network_security_group_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("network_security_group_id")
        return result

    @builtins.property
    def primary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("primary")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetNetworkInterface(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetNetworkInterfaceIpConfiguration",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "application_gateway_backend_address_pool_ids": "applicationGatewayBackendAddressPoolIds",
        "application_security_group_ids": "applicationSecurityGroupIds",
        "load_balancer_backend_address_pool_ids": "loadBalancerBackendAddressPoolIds",
        "load_balancer_inbound_nat_rules_ids": "loadBalancerInboundNatRulesIds",
        "primary": "primary",
        "public_ip_address": "publicIpAddress",
        "subnet_id": "subnetId",
        "version": "version",
    },
)
class WindowsVirtualMachineScaleSetNetworkInterfaceIpConfiguration:
    def __init__(
        self,
        *,
        name: builtins.str,
        application_gateway_backend_address_pool_ids: typing.Optional[typing.List[builtins.str]] = None,
        application_security_group_ids: typing.Optional[typing.List[builtins.str]] = None,
        load_balancer_backend_address_pool_ids: typing.Optional[typing.List[builtins.str]] = None,
        load_balancer_inbound_nat_rules_ids: typing.Optional[typing.List[builtins.str]] = None,
        primary: typing.Optional[builtins.bool] = None,
        public_ip_address: typing.Optional[typing.List["WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress"]] = None,
        subnet_id: typing.Optional[builtins.str] = None,
        version: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param application_gateway_backend_address_pool_ids: -
        :param application_security_group_ids: -
        :param load_balancer_backend_address_pool_ids: -
        :param load_balancer_inbound_nat_rules_ids: -
        :param primary: -
        :param public_ip_address: public_ip_address block.
        :param subnet_id: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if application_gateway_backend_address_pool_ids is not None:
            self._values["application_gateway_backend_address_pool_ids"] = application_gateway_backend_address_pool_ids
        if application_security_group_ids is not None:
            self._values["application_security_group_ids"] = application_security_group_ids
        if load_balancer_backend_address_pool_ids is not None:
            self._values["load_balancer_backend_address_pool_ids"] = load_balancer_backend_address_pool_ids
        if load_balancer_inbound_nat_rules_ids is not None:
            self._values["load_balancer_inbound_nat_rules_ids"] = load_balancer_inbound_nat_rules_ids
        if primary is not None:
            self._values["primary"] = primary
        if public_ip_address is not None:
            self._values["public_ip_address"] = public_ip_address
        if subnet_id is not None:
            self._values["subnet_id"] = subnet_id
        if version is not None:
            self._values["version"] = version

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def application_gateway_backend_address_pool_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("application_gateway_backend_address_pool_ids")
        return result

    @builtins.property
    def application_security_group_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("application_security_group_ids")
        return result

    @builtins.property
    def load_balancer_backend_address_pool_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("load_balancer_backend_address_pool_ids")
        return result

    @builtins.property
    def load_balancer_inbound_nat_rules_ids(
        self,
    ) -> typing.Optional[typing.List[builtins.str]]:
        result = self._values.get("load_balancer_inbound_nat_rules_ids")
        return result

    @builtins.property
    def primary(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("primary")
        return result

    @builtins.property
    def public_ip_address(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress"]]:
        """public_ip_address block."""
        result = self._values.get("public_ip_address")
        return result

    @builtins.property
    def subnet_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("subnet_id")
        return result

    @builtins.property
    def version(self) -> typing.Optional[builtins.str]:
        result = self._values.get("version")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetNetworkInterfaceIpConfiguration(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress",
    jsii_struct_bases=[],
    name_mapping={
        "name": "name",
        "domain_name_label": "domainNameLabel",
        "idle_timeout_in_minutes": "idleTimeoutInMinutes",
        "ip_tag": "ipTag",
        "public_ip_prefix_id": "publicIpPrefixId",
    },
)
class WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress:
    def __init__(
        self,
        *,
        name: builtins.str,
        domain_name_label: typing.Optional[builtins.str] = None,
        idle_timeout_in_minutes: typing.Optional[jsii.Number] = None,
        ip_tag: typing.Optional[typing.List["WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag"]] = None,
        public_ip_prefix_id: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param name: -
        :param domain_name_label: -
        :param idle_timeout_in_minutes: -
        :param ip_tag: ip_tag block.
        :param public_ip_prefix_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
        }
        if domain_name_label is not None:
            self._values["domain_name_label"] = domain_name_label
        if idle_timeout_in_minutes is not None:
            self._values["idle_timeout_in_minutes"] = idle_timeout_in_minutes
        if ip_tag is not None:
            self._values["ip_tag"] = ip_tag
        if public_ip_prefix_id is not None:
            self._values["public_ip_prefix_id"] = public_ip_prefix_id

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def domain_name_label(self) -> typing.Optional[builtins.str]:
        result = self._values.get("domain_name_label")
        return result

    @builtins.property
    def idle_timeout_in_minutes(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("idle_timeout_in_minutes")
        return result

    @builtins.property
    def ip_tag(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag"]]:
        """ip_tag block."""
        result = self._values.get("ip_tag")
        return result

    @builtins.property
    def public_ip_prefix_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("public_ip_prefix_id")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag",
    jsii_struct_bases=[],
    name_mapping={"tag": "tag", "type": "type"},
)
class WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag:
    def __init__(self, *, tag: builtins.str, type: builtins.str) -> None:
        """
        :param tag: -
        :param type: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "tag": tag,
            "type": type,
        }

    @builtins.property
    def tag(self) -> builtins.str:
        result = self._values.get("tag")
        assert result is not None, "Required property 'tag' is missing"
        return result

    @builtins.property
    def type(self) -> builtins.str:
        result = self._values.get("type")
        assert result is not None, "Required property 'type' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetOsDisk",
    jsii_struct_bases=[],
    name_mapping={
        "caching": "caching",
        "storage_account_type": "storageAccountType",
        "diff_disk_settings": "diffDiskSettings",
        "disk_encryption_set_id": "diskEncryptionSetId",
        "disk_size_gb": "diskSizeGb",
        "write_accelerator_enabled": "writeAcceleratorEnabled",
    },
)
class WindowsVirtualMachineScaleSetOsDisk:
    def __init__(
        self,
        *,
        caching: builtins.str,
        storage_account_type: builtins.str,
        diff_disk_settings: typing.Optional[typing.List["WindowsVirtualMachineScaleSetOsDiskDiffDiskSettings"]] = None,
        disk_encryption_set_id: typing.Optional[builtins.str] = None,
        disk_size_gb: typing.Optional[jsii.Number] = None,
        write_accelerator_enabled: typing.Optional[builtins.bool] = None,
    ) -> None:
        """
        :param caching: -
        :param storage_account_type: -
        :param diff_disk_settings: diff_disk_settings block.
        :param disk_encryption_set_id: -
        :param disk_size_gb: -
        :param write_accelerator_enabled: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "caching": caching,
            "storage_account_type": storage_account_type,
        }
        if diff_disk_settings is not None:
            self._values["diff_disk_settings"] = diff_disk_settings
        if disk_encryption_set_id is not None:
            self._values["disk_encryption_set_id"] = disk_encryption_set_id
        if disk_size_gb is not None:
            self._values["disk_size_gb"] = disk_size_gb
        if write_accelerator_enabled is not None:
            self._values["write_accelerator_enabled"] = write_accelerator_enabled

    @builtins.property
    def caching(self) -> builtins.str:
        result = self._values.get("caching")
        assert result is not None, "Required property 'caching' is missing"
        return result

    @builtins.property
    def storage_account_type(self) -> builtins.str:
        result = self._values.get("storage_account_type")
        assert result is not None, "Required property 'storage_account_type' is missing"
        return result

    @builtins.property
    def diff_disk_settings(
        self,
    ) -> typing.Optional[typing.List["WindowsVirtualMachineScaleSetOsDiskDiffDiskSettings"]]:
        """diff_disk_settings block."""
        result = self._values.get("diff_disk_settings")
        return result

    @builtins.property
    def disk_encryption_set_id(self) -> typing.Optional[builtins.str]:
        result = self._values.get("disk_encryption_set_id")
        return result

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        result = self._values.get("disk_size_gb")
        return result

    @builtins.property
    def write_accelerator_enabled(self) -> typing.Optional[builtins.bool]:
        result = self._values.get("write_accelerator_enabled")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetOsDisk(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetOsDiskDiffDiskSettings",
    jsii_struct_bases=[],
    name_mapping={"option": "option"},
)
class WindowsVirtualMachineScaleSetOsDiskDiffDiskSettings:
    def __init__(self, *, option: builtins.str) -> None:
        """
        :param option: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "option": option,
        }

    @builtins.property
    def option(self) -> builtins.str:
        result = self._values.get("option")
        assert result is not None, "Required property 'option' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetOsDiskDiffDiskSettings(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetPlan",
    jsii_struct_bases=[],
    name_mapping={"name": "name", "product": "product", "publisher": "publisher"},
)
class WindowsVirtualMachineScaleSetPlan:
    def __init__(
        self,
        *,
        name: builtins.str,
        product: builtins.str,
        publisher: builtins.str,
    ) -> None:
        """
        :param name: -
        :param product: -
        :param publisher: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "name": name,
            "product": product,
            "publisher": publisher,
        }

    @builtins.property
    def name(self) -> builtins.str:
        result = self._values.get("name")
        assert result is not None, "Required property 'name' is missing"
        return result

    @builtins.property
    def product(self) -> builtins.str:
        result = self._values.get("product")
        assert result is not None, "Required property 'product' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetPlan(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetRollingUpgradePolicy",
    jsii_struct_bases=[],
    name_mapping={
        "max_batch_instance_percent": "maxBatchInstancePercent",
        "max_unhealthy_instance_percent": "maxUnhealthyInstancePercent",
        "max_unhealthy_upgraded_instance_percent": "maxUnhealthyUpgradedInstancePercent",
        "pause_time_between_batches": "pauseTimeBetweenBatches",
    },
)
class WindowsVirtualMachineScaleSetRollingUpgradePolicy:
    def __init__(
        self,
        *,
        max_batch_instance_percent: jsii.Number,
        max_unhealthy_instance_percent: jsii.Number,
        max_unhealthy_upgraded_instance_percent: jsii.Number,
        pause_time_between_batches: builtins.str,
    ) -> None:
        """
        :param max_batch_instance_percent: -
        :param max_unhealthy_instance_percent: -
        :param max_unhealthy_upgraded_instance_percent: -
        :param pause_time_between_batches: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "max_batch_instance_percent": max_batch_instance_percent,
            "max_unhealthy_instance_percent": max_unhealthy_instance_percent,
            "max_unhealthy_upgraded_instance_percent": max_unhealthy_upgraded_instance_percent,
            "pause_time_between_batches": pause_time_between_batches,
        }

    @builtins.property
    def max_batch_instance_percent(self) -> jsii.Number:
        result = self._values.get("max_batch_instance_percent")
        assert result is not None, "Required property 'max_batch_instance_percent' is missing"
        return result

    @builtins.property
    def max_unhealthy_instance_percent(self) -> jsii.Number:
        result = self._values.get("max_unhealthy_instance_percent")
        assert result is not None, "Required property 'max_unhealthy_instance_percent' is missing"
        return result

    @builtins.property
    def max_unhealthy_upgraded_instance_percent(self) -> jsii.Number:
        result = self._values.get("max_unhealthy_upgraded_instance_percent")
        assert result is not None, "Required property 'max_unhealthy_upgraded_instance_percent' is missing"
        return result

    @builtins.property
    def pause_time_between_batches(self) -> builtins.str:
        result = self._values.get("pause_time_between_batches")
        assert result is not None, "Required property 'pause_time_between_batches' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetRollingUpgradePolicy(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetSecret",
    jsii_struct_bases=[],
    name_mapping={"certificate": "certificate", "key_vault_id": "keyVaultId"},
)
class WindowsVirtualMachineScaleSetSecret:
    def __init__(
        self,
        *,
        certificate: typing.List["WindowsVirtualMachineScaleSetSecretCertificate"],
        key_vault_id: builtins.str,
    ) -> None:
        """
        :param certificate: certificate block.
        :param key_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate": certificate,
            "key_vault_id": key_vault_id,
        }

    @builtins.property
    def certificate(
        self,
    ) -> typing.List["WindowsVirtualMachineScaleSetSecretCertificate"]:
        """certificate block."""
        result = self._values.get("certificate")
        assert result is not None, "Required property 'certificate' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetSecret(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetSecretCertificate",
    jsii_struct_bases=[],
    name_mapping={"store": "store", "url": "url"},
)
class WindowsVirtualMachineScaleSetSecretCertificate:
    def __init__(self, *, store: builtins.str, url: builtins.str) -> None:
        """
        :param store: -
        :param url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "store": store,
            "url": url,
        }

    @builtins.property
    def store(self) -> builtins.str:
        result = self._values.get("store")
        assert result is not None, "Required property 'store' is missing"
        return result

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetSecretCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetSourceImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class WindowsVirtualMachineScaleSetSourceImageReference:
    def __init__(
        self,
        *,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        version: builtins.str,
    ) -> None:
        """
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
            "version": version,
        }

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetSourceImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetTerminateNotification",
    jsii_struct_bases=[],
    name_mapping={"enabled": "enabled", "timeout": "timeout"},
)
class WindowsVirtualMachineScaleSetTerminateNotification:
    def __init__(
        self,
        *,
        enabled: builtins.bool,
        timeout: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param enabled: -
        :param timeout: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "enabled": enabled,
        }
        if timeout is not None:
            self._values["timeout"] = timeout

    @builtins.property
    def enabled(self) -> builtins.bool:
        result = self._values.get("enabled")
        assert result is not None, "Required property 'enabled' is missing"
        return result

    @builtins.property
    def timeout(self) -> typing.Optional[builtins.str]:
        result = self._values.get("timeout")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetTerminateNotification(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class WindowsVirtualMachineScaleSetTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineScaleSetWinrmListener",
    jsii_struct_bases=[],
    name_mapping={"protocol": "protocol", "certificate_url": "certificateUrl"},
)
class WindowsVirtualMachineScaleSetWinrmListener:
    def __init__(
        self,
        *,
        protocol: builtins.str,
        certificate_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param protocol: -
        :param certificate_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "protocol": protocol,
        }
        if certificate_url is not None:
            self._values["certificate_url"] = certificate_url

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def certificate_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineScaleSetWinrmListener(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineSecret",
    jsii_struct_bases=[],
    name_mapping={"certificate": "certificate", "key_vault_id": "keyVaultId"},
)
class WindowsVirtualMachineSecret:
    def __init__(
        self,
        *,
        certificate: typing.List["WindowsVirtualMachineSecretCertificate"],
        key_vault_id: builtins.str,
    ) -> None:
        """
        :param certificate: certificate block.
        :param key_vault_id: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "certificate": certificate,
            "key_vault_id": key_vault_id,
        }

    @builtins.property
    def certificate(self) -> typing.List["WindowsVirtualMachineSecretCertificate"]:
        """certificate block."""
        result = self._values.get("certificate")
        assert result is not None, "Required property 'certificate' is missing"
        return result

    @builtins.property
    def key_vault_id(self) -> builtins.str:
        result = self._values.get("key_vault_id")
        assert result is not None, "Required property 'key_vault_id' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineSecret(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineSecretCertificate",
    jsii_struct_bases=[],
    name_mapping={"store": "store", "url": "url"},
)
class WindowsVirtualMachineSecretCertificate:
    def __init__(self, *, store: builtins.str, url: builtins.str) -> None:
        """
        :param store: -
        :param url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "store": store,
            "url": url,
        }

    @builtins.property
    def store(self) -> builtins.str:
        result = self._values.get("store")
        assert result is not None, "Required property 'store' is missing"
        return result

    @builtins.property
    def url(self) -> builtins.str:
        result = self._values.get("url")
        assert result is not None, "Required property 'url' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineSecretCertificate(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineSourceImageReference",
    jsii_struct_bases=[],
    name_mapping={
        "offer": "offer",
        "publisher": "publisher",
        "sku": "sku",
        "version": "version",
    },
)
class WindowsVirtualMachineSourceImageReference:
    def __init__(
        self,
        *,
        offer: builtins.str,
        publisher: builtins.str,
        sku: builtins.str,
        version: builtins.str,
    ) -> None:
        """
        :param offer: -
        :param publisher: -
        :param sku: -
        :param version: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "offer": offer,
            "publisher": publisher,
            "sku": sku,
            "version": version,
        }

    @builtins.property
    def offer(self) -> builtins.str:
        result = self._values.get("offer")
        assert result is not None, "Required property 'offer' is missing"
        return result

    @builtins.property
    def publisher(self) -> builtins.str:
        result = self._values.get("publisher")
        assert result is not None, "Required property 'publisher' is missing"
        return result

    @builtins.property
    def sku(self) -> builtins.str:
        result = self._values.get("sku")
        assert result is not None, "Required property 'sku' is missing"
        return result

    @builtins.property
    def version(self) -> builtins.str:
        result = self._values.get("version")
        assert result is not None, "Required property 'version' is missing"
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineSourceImageReference(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineTimeouts",
    jsii_struct_bases=[],
    name_mapping={
        "create": "create",
        "delete": "delete",
        "read": "read",
        "update": "update",
    },
)
class WindowsVirtualMachineTimeouts:
    def __init__(
        self,
        *,
        create: typing.Optional[builtins.str] = None,
        delete: typing.Optional[builtins.str] = None,
        read: typing.Optional[builtins.str] = None,
        update: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param create: -
        :param delete: -
        :param read: -
        :param update: -
        """
        self._values: typing.Dict[str, typing.Any] = {}
        if create is not None:
            self._values["create"] = create
        if delete is not None:
            self._values["delete"] = delete
        if read is not None:
            self._values["read"] = read
        if update is not None:
            self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[builtins.str]:
        result = self._values.get("create")
        return result

    @builtins.property
    def delete(self) -> typing.Optional[builtins.str]:
        result = self._values.get("delete")
        return result

    @builtins.property
    def read(self) -> typing.Optional[builtins.str]:
        result = self._values.get("read")
        return result

    @builtins.property
    def update(self) -> typing.Optional[builtins.str]:
        result = self._values.get("update")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineTimeouts(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


@jsii.data_type(
    jsii_type="azurerm.WindowsVirtualMachineWinrmListener",
    jsii_struct_bases=[],
    name_mapping={"protocol": "protocol", "certificate_url": "certificateUrl"},
)
class WindowsVirtualMachineWinrmListener:
    def __init__(
        self,
        *,
        protocol: builtins.str,
        certificate_url: typing.Optional[builtins.str] = None,
    ) -> None:
        """
        :param protocol: -
        :param certificate_url: -
        """
        self._values: typing.Dict[str, typing.Any] = {
            "protocol": protocol,
        }
        if certificate_url is not None:
            self._values["certificate_url"] = certificate_url

    @builtins.property
    def protocol(self) -> builtins.str:
        result = self._values.get("protocol")
        assert result is not None, "Required property 'protocol' is missing"
        return result

    @builtins.property
    def certificate_url(self) -> typing.Optional[builtins.str]:
        result = self._values.get("certificate_url")
        return result

    def __eq__(self, rhs: typing.Any) -> builtins.bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs: typing.Any) -> builtins.bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return "WindowsVirtualMachineWinrmListener(%s)" % ", ".join(
            k + "=" + repr(v) for k, v in self._values.items()
        )


__all__ = [
    "AdvancedThreatProtection",
    "AdvancedThreatProtectionConfig",
    "AdvancedThreatProtectionTimeouts",
    "AnalysisServicesServer",
    "AnalysisServicesServerConfig",
    "AnalysisServicesServerIpv4FirewallRule",
    "AnalysisServicesServerTimeouts",
    "ApiManagement",
    "ApiManagementAdditionalLocation",
    "ApiManagementAdditionalLocationVirtualNetworkConfiguration",
    "ApiManagementApi",
    "ApiManagementApiConfig",
    "ApiManagementApiDiagnostic",
    "ApiManagementApiDiagnosticBackendRequest",
    "ApiManagementApiDiagnosticBackendResponse",
    "ApiManagementApiDiagnosticConfig",
    "ApiManagementApiDiagnosticFrontendRequest",
    "ApiManagementApiDiagnosticFrontendResponse",
    "ApiManagementApiDiagnosticTimeouts",
    "ApiManagementApiImport",
    "ApiManagementApiImportWsdlSelector",
    "ApiManagementApiOauth2Authorization",
    "ApiManagementApiOpenidAuthentication",
    "ApiManagementApiOperation",
    "ApiManagementApiOperationConfig",
    "ApiManagementApiOperationPolicy",
    "ApiManagementApiOperationPolicyConfig",
    "ApiManagementApiOperationPolicyTimeouts",
    "ApiManagementApiOperationRequest",
    "ApiManagementApiOperationRequestHeader",
    "ApiManagementApiOperationRequestQueryParameter",
    "ApiManagementApiOperationRequestRepresentation",
    "ApiManagementApiOperationRequestRepresentationFormParameter",
    "ApiManagementApiOperationResponse",
    "ApiManagementApiOperationResponseHeader",
    "ApiManagementApiOperationResponseRepresentation",
    "ApiManagementApiOperationResponseRepresentationFormParameter",
    "ApiManagementApiOperationTemplateParameter",
    "ApiManagementApiOperationTimeouts",
    "ApiManagementApiPolicy",
    "ApiManagementApiPolicyConfig",
    "ApiManagementApiPolicyTimeouts",
    "ApiManagementApiSchema",
    "ApiManagementApiSchemaConfig",
    "ApiManagementApiSchemaTimeouts",
    "ApiManagementApiSubscriptionKeyParameterNames",
    "ApiManagementApiTimeouts",
    "ApiManagementApiVersionSet",
    "ApiManagementApiVersionSetConfig",
    "ApiManagementApiVersionSetTimeouts",
    "ApiManagementAuthorizationServer",
    "ApiManagementAuthorizationServerConfig",
    "ApiManagementAuthorizationServerTimeouts",
    "ApiManagementAuthorizationServerTokenBodyParameter",
    "ApiManagementBackend",
    "ApiManagementBackendConfig",
    "ApiManagementBackendCredentials",
    "ApiManagementBackendCredentialsAuthorization",
    "ApiManagementBackendProxy",
    "ApiManagementBackendServiceFabricCluster",
    "ApiManagementBackendServiceFabricClusterServerX509Name",
    "ApiManagementBackendTimeouts",
    "ApiManagementBackendTls",
    "ApiManagementCertificate",
    "ApiManagementCertificateA",
    "ApiManagementCertificateAConfig",
    "ApiManagementCertificateTimeouts",
    "ApiManagementConfig",
    "ApiManagementCustomDomain",
    "ApiManagementCustomDomainConfig",
    "ApiManagementCustomDomainDeveloperPortal",
    "ApiManagementCustomDomainManagement",
    "ApiManagementCustomDomainPortal",
    "ApiManagementCustomDomainProxy",
    "ApiManagementCustomDomainScm",
    "ApiManagementCustomDomainTimeouts",
    "ApiManagementDiagnostic",
    "ApiManagementDiagnosticConfig",
    "ApiManagementDiagnosticTimeouts",
    "ApiManagementGroup",
    "ApiManagementGroupConfig",
    "ApiManagementGroupTimeouts",
    "ApiManagementGroupUser",
    "ApiManagementGroupUserConfig",
    "ApiManagementGroupUserTimeouts",
    "ApiManagementHostnameConfiguration",
    "ApiManagementHostnameConfigurationDeveloperPortal",
    "ApiManagementHostnameConfigurationManagement",
    "ApiManagementHostnameConfigurationPortal",
    "ApiManagementHostnameConfigurationProxy",
    "ApiManagementHostnameConfigurationScm",
    "ApiManagementIdentity",
    "ApiManagementIdentityProviderAad",
    "ApiManagementIdentityProviderAadConfig",
    "ApiManagementIdentityProviderAadTimeouts",
    "ApiManagementIdentityProviderFacebook",
    "ApiManagementIdentityProviderFacebookConfig",
    "ApiManagementIdentityProviderFacebookTimeouts",
    "ApiManagementIdentityProviderGoogle",
    "ApiManagementIdentityProviderGoogleConfig",
    "ApiManagementIdentityProviderGoogleTimeouts",
    "ApiManagementIdentityProviderMicrosoft",
    "ApiManagementIdentityProviderMicrosoftConfig",
    "ApiManagementIdentityProviderMicrosoftTimeouts",
    "ApiManagementIdentityProviderTwitter",
    "ApiManagementIdentityProviderTwitterConfig",
    "ApiManagementIdentityProviderTwitterTimeouts",
    "ApiManagementLogger",
    "ApiManagementLoggerApplicationInsights",
    "ApiManagementLoggerConfig",
    "ApiManagementLoggerEventhub",
    "ApiManagementLoggerTimeouts",
    "ApiManagementNamedValue",
    "ApiManagementNamedValueConfig",
    "ApiManagementNamedValueTimeouts",
    "ApiManagementOpenidConnectProvider",
    "ApiManagementOpenidConnectProviderConfig",
    "ApiManagementOpenidConnectProviderTimeouts",
    "ApiManagementPolicy",
    "ApiManagementPolicyA",
    "ApiManagementPolicyAConfig",
    "ApiManagementPolicyTimeouts",
    "ApiManagementProduct",
    "ApiManagementProductApi",
    "ApiManagementProductApiConfig",
    "ApiManagementProductApiTimeouts",
    "ApiManagementProductConfig",
    "ApiManagementProductGroup",
    "ApiManagementProductGroupConfig",
    "ApiManagementProductGroupTimeouts",
    "ApiManagementProductPolicy",
    "ApiManagementProductPolicyConfig",
    "ApiManagementProductPolicyTimeouts",
    "ApiManagementProductTimeouts",
    "ApiManagementProperty",
    "ApiManagementPropertyConfig",
    "ApiManagementPropertyTimeouts",
    "ApiManagementProtocols",
    "ApiManagementSecurity",
    "ApiManagementSignIn",
    "ApiManagementSignUp",
    "ApiManagementSignUpTermsOfService",
    "ApiManagementSubscription",
    "ApiManagementSubscriptionConfig",
    "ApiManagementSubscriptionTimeouts",
    "ApiManagementTimeouts",
    "ApiManagementUser",
    "ApiManagementUserConfig",
    "ApiManagementUserTimeouts",
    "ApiManagementVirtualNetworkConfiguration",
    "AppConfiguration",
    "AppConfigurationConfig",
    "AppConfigurationIdentity",
    "AppConfigurationPrimaryReadKey",
    "AppConfigurationPrimaryWriteKey",
    "AppConfigurationSecondaryReadKey",
    "AppConfigurationSecondaryWriteKey",
    "AppConfigurationTimeouts",
    "AppService",
    "AppServiceActiveSlot",
    "AppServiceActiveSlotConfig",
    "AppServiceActiveSlotTimeouts",
    "AppServiceAuthSettings",
    "AppServiceAuthSettingsActiveDirectory",
    "AppServiceAuthSettingsFacebook",
    "AppServiceAuthSettingsGoogle",
    "AppServiceAuthSettingsMicrosoft",
    "AppServiceAuthSettingsTwitter",
    "AppServiceBackup",
    "AppServiceBackupSchedule",
    "AppServiceCertificate",
    "AppServiceCertificateBinding",
    "AppServiceCertificateBindingConfig",
    "AppServiceCertificateBindingTimeouts",
    "AppServiceCertificateConfig",
    "AppServiceCertificateOrder",
    "AppServiceCertificateOrderCertificates",
    "AppServiceCertificateOrderConfig",
    "AppServiceCertificateOrderTimeouts",
    "AppServiceCertificateTimeouts",
    "AppServiceConfig",
    "AppServiceConnectionString",
    "AppServiceCustomHostnameBinding",
    "AppServiceCustomHostnameBindingConfig",
    "AppServiceCustomHostnameBindingTimeouts",
    "AppServiceEnvironment",
    "AppServiceEnvironmentConfig",
    "AppServiceEnvironmentTimeouts",
    "AppServiceHybridConnection",
    "AppServiceHybridConnectionConfig",
    "AppServiceHybridConnectionTimeouts",
    "AppServiceIdentity",
    "AppServiceLogs",
    "AppServiceLogsApplicationLogs",
    "AppServiceLogsApplicationLogsAzureBlobStorage",
    "AppServiceLogsHttpLogs",
    "AppServiceLogsHttpLogsAzureBlobStorage",
    "AppServiceLogsHttpLogsFileSystem",
    "AppServiceManagedCertificate",
    "AppServiceManagedCertificateConfig",
    "AppServiceManagedCertificateTimeouts",
    "AppServicePlan",
    "AppServicePlanConfig",
    "AppServicePlanSku",
    "AppServicePlanTimeouts",
    "AppServiceSiteConfig",
    "AppServiceSiteConfigCors",
    "AppServiceSiteConfigIpRestriction",
    "AppServiceSiteConfigScmIpRestriction",
    "AppServiceSiteCredential",
    "AppServiceSlot",
    "AppServiceSlotAuthSettings",
    "AppServiceSlotAuthSettingsActiveDirectory",
    "AppServiceSlotAuthSettingsFacebook",
    "AppServiceSlotAuthSettingsGoogle",
    "AppServiceSlotAuthSettingsMicrosoft",
    "AppServiceSlotAuthSettingsTwitter",
    "AppServiceSlotConfig",
    "AppServiceSlotConnectionString",
    "AppServiceSlotIdentity",
    "AppServiceSlotLogs",
    "AppServiceSlotLogsApplicationLogs",
    "AppServiceSlotLogsApplicationLogsAzureBlobStorage",
    "AppServiceSlotLogsHttpLogs",
    "AppServiceSlotLogsHttpLogsAzureBlobStorage",
    "AppServiceSlotLogsHttpLogsFileSystem",
    "AppServiceSlotSiteConfig",
    "AppServiceSlotSiteConfigCors",
    "AppServiceSlotSiteConfigIpRestriction",
    "AppServiceSlotSiteConfigScmIpRestriction",
    "AppServiceSlotSiteCredential",
    "AppServiceSlotTimeouts",
    "AppServiceSlotVirtualNetworkSwiftConnection",
    "AppServiceSlotVirtualNetworkSwiftConnectionConfig",
    "AppServiceSlotVirtualNetworkSwiftConnectionTimeouts",
    "AppServiceSourceControl",
    "AppServiceSourceControlToken",
    "AppServiceSourceControlTokenConfig",
    "AppServiceSourceControlTokenTimeouts",
    "AppServiceStorageAccount",
    "AppServiceTimeouts",
    "AppServiceVirtualNetworkSwiftConnection",
    "AppServiceVirtualNetworkSwiftConnectionConfig",
    "AppServiceVirtualNetworkSwiftConnectionTimeouts",
    "ApplicationGateway",
    "ApplicationGatewayAuthenticationCertificate",
    "ApplicationGatewayAutoscaleConfiguration",
    "ApplicationGatewayBackendAddressPool",
    "ApplicationGatewayBackendHttpSettings",
    "ApplicationGatewayBackendHttpSettingsAuthenticationCertificate",
    "ApplicationGatewayBackendHttpSettingsConnectionDraining",
    "ApplicationGatewayConfig",
    "ApplicationGatewayCustomErrorConfiguration",
    "ApplicationGatewayFrontendIpConfiguration",
    "ApplicationGatewayFrontendPort",
    "ApplicationGatewayGatewayIpConfiguration",
    "ApplicationGatewayHttpListener",
    "ApplicationGatewayHttpListenerCustomErrorConfiguration",
    "ApplicationGatewayIdentity",
    "ApplicationGatewayProbe",
    "ApplicationGatewayProbeMatch",
    "ApplicationGatewayRedirectConfiguration",
    "ApplicationGatewayRequestRoutingRule",
    "ApplicationGatewayRewriteRuleSet",
    "ApplicationGatewayRewriteRuleSetRewriteRule",
    "ApplicationGatewayRewriteRuleSetRewriteRuleCondition",
    "ApplicationGatewayRewriteRuleSetRewriteRuleRequestHeaderConfiguration",
    "ApplicationGatewayRewriteRuleSetRewriteRuleResponseHeaderConfiguration",
    "ApplicationGatewaySku",
    "ApplicationGatewaySslCertificate",
    "ApplicationGatewaySslPolicy",
    "ApplicationGatewayTimeouts",
    "ApplicationGatewayTrustedRootCertificate",
    "ApplicationGatewayUrlPathMap",
    "ApplicationGatewayUrlPathMapPathRule",
    "ApplicationGatewayWafConfiguration",
    "ApplicationGatewayWafConfigurationDisabledRuleGroup",
    "ApplicationGatewayWafConfigurationExclusion",
    "ApplicationInsights",
    "ApplicationInsightsAnalyticsItem",
    "ApplicationInsightsAnalyticsItemConfig",
    "ApplicationInsightsAnalyticsItemTimeouts",
    "ApplicationInsightsApiKey",
    "ApplicationInsightsApiKeyConfig",
    "ApplicationInsightsApiKeyTimeouts",
    "ApplicationInsightsConfig",
    "ApplicationInsightsTimeouts",
    "ApplicationInsightsWebTest",
    "ApplicationInsightsWebTestConfig",
    "ApplicationInsightsWebTestTimeouts",
    "ApplicationSecurityGroup",
    "ApplicationSecurityGroupConfig",
    "ApplicationSecurityGroupTimeouts",
    "AttestationProvider",
    "AttestationProviderConfig",
    "AttestationProviderTimeouts",
    "AutomationAccount",
    "AutomationAccountConfig",
    "AutomationAccountTimeouts",
    "AutomationCertificate",
    "AutomationCertificateConfig",
    "AutomationCertificateTimeouts",
    "AutomationConnection",
    "AutomationConnectionCertificate",
    "AutomationConnectionCertificateConfig",
    "AutomationConnectionCertificateTimeouts",
    "AutomationConnectionClassicCertificate",
    "AutomationConnectionClassicCertificateConfig",
    "AutomationConnectionClassicCertificateTimeouts",
    "AutomationConnectionConfig",
    "AutomationConnectionServicePrincipal",
    "AutomationConnectionServicePrincipalConfig",
    "AutomationConnectionServicePrincipalTimeouts",
    "AutomationConnectionTimeouts",
    "AutomationCredential",
    "AutomationCredentialConfig",
    "AutomationCredentialTimeouts",
    "AutomationDscConfiguration",
    "AutomationDscConfigurationConfig",
    "AutomationDscConfigurationTimeouts",
    "AutomationDscNodeconfiguration",
    "AutomationDscNodeconfigurationConfig",
    "AutomationDscNodeconfigurationTimeouts",
    "AutomationJobSchedule",
    "AutomationJobScheduleConfig",
    "AutomationJobScheduleTimeouts",
    "AutomationModule",
    "AutomationModuleConfig",
    "AutomationModuleModuleLink",
    "AutomationModuleModuleLinkHash",
    "AutomationModuleTimeouts",
    "AutomationRunbook",
    "AutomationRunbookConfig",
    "AutomationRunbookJobSchedule",
    "AutomationRunbookPublishContentLink",
    "AutomationRunbookPublishContentLinkHash",
    "AutomationRunbookTimeouts",
    "AutomationSchedule",
    "AutomationScheduleConfig",
    "AutomationScheduleMonthlyOccurrence",
    "AutomationScheduleTimeouts",
    "AutomationVariableBool",
    "AutomationVariableBoolConfig",
    "AutomationVariableBoolTimeouts",
    "AutomationVariableDatetime",
    "AutomationVariableDatetimeConfig",
    "AutomationVariableDatetimeTimeouts",
    "AutomationVariableInt",
    "AutomationVariableIntConfig",
    "AutomationVariableIntTimeouts",
    "AutomationVariableString",
    "AutomationVariableStringConfig",
    "AutomationVariableStringTimeouts",
    "AvailabilitySet",
    "AvailabilitySetConfig",
    "AvailabilitySetTimeouts",
    "AzurermProvider",
    "AzurermProviderConfig",
    "AzurermProviderFeatures",
    "AzurermProviderFeaturesKeyVault",
    "AzurermProviderFeaturesNetwork",
    "AzurermProviderFeaturesTemplateDeployment",
    "AzurermProviderFeaturesVirtualMachine",
    "AzurermProviderFeaturesVirtualMachineScaleSet",
    "BackupContainerStorageAccount",
    "BackupContainerStorageAccountConfig",
    "BackupContainerStorageAccountTimeouts",
    "BackupPolicyFileShare",
    "BackupPolicyFileShareBackup",
    "BackupPolicyFileShareConfig",
    "BackupPolicyFileShareRetentionDaily",
    "BackupPolicyFileShareTimeouts",
    "BackupPolicyVm",
    "BackupPolicyVmBackup",
    "BackupPolicyVmConfig",
    "BackupPolicyVmRetentionDaily",
    "BackupPolicyVmRetentionMonthly",
    "BackupPolicyVmRetentionWeekly",
    "BackupPolicyVmRetentionYearly",
    "BackupPolicyVmTimeouts",
    "BackupProtectedFileShare",
    "BackupProtectedFileShareConfig",
    "BackupProtectedFileShareTimeouts",
    "BackupProtectedVm",
    "BackupProtectedVmConfig",
    "BackupProtectedVmTimeouts",
    "BastionHost",
    "BastionHostConfig",
    "BastionHostIpConfiguration",
    "BastionHostTimeouts",
    "BatchAccount",
    "BatchAccountConfig",
    "BatchAccountKeyVaultReference",
    "BatchAccountTimeouts",
    "BatchApplication",
    "BatchApplicationConfig",
    "BatchApplicationTimeouts",
    "BatchCertificate",
    "BatchCertificateConfig",
    "BatchCertificateTimeouts",
    "BatchPool",
    "BatchPoolAutoScale",
    "BatchPoolCertificate",
    "BatchPoolConfig",
    "BatchPoolContainerConfiguration",
    "BatchPoolContainerConfigurationContainerRegistries",
    "BatchPoolFixedScale",
    "BatchPoolNetworkConfiguration",
    "BatchPoolNetworkConfigurationEndpointConfiguration",
    "BatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules",
    "BatchPoolStartTask",
    "BatchPoolStartTaskResourceFile",
    "BatchPoolStartTaskUserIdentity",
    "BatchPoolStartTaskUserIdentityAutoUser",
    "BatchPoolStorageImageReference",
    "BatchPoolTimeouts",
    "BlueprintAssignment",
    "BlueprintAssignmentConfig",
    "BlueprintAssignmentIdentity",
    "BlueprintAssignmentTimeouts",
    "BotChannelDirectline",
    "BotChannelDirectlineConfig",
    "BotChannelDirectlineSite",
    "BotChannelDirectlineTimeouts",
    "BotChannelEmail",
    "BotChannelEmailConfig",
    "BotChannelEmailTimeouts",
    "BotChannelMsTeams",
    "BotChannelMsTeamsConfig",
    "BotChannelMsTeamsTimeouts",
    "BotChannelSlack",
    "BotChannelSlackConfig",
    "BotChannelSlackTimeouts",
    "BotChannelsRegistration",
    "BotChannelsRegistrationConfig",
    "BotChannelsRegistrationTimeouts",
    "BotConnection",
    "BotConnectionConfig",
    "BotConnectionTimeouts",
    "BotWebApp",
    "BotWebAppConfig",
    "BotWebAppTimeouts",
    "CdnEndpoint",
    "CdnEndpointConfig",
    "CdnEndpointDeliveryRule",
    "CdnEndpointDeliveryRuleCacheExpirationAction",
    "CdnEndpointDeliveryRuleCacheKeyQueryStringAction",
    "CdnEndpointDeliveryRuleCookiesCondition",
    "CdnEndpointDeliveryRuleDeviceCondition",
    "CdnEndpointDeliveryRuleHttpVersionCondition",
    "CdnEndpointDeliveryRuleModifyRequestHeaderAction",
    "CdnEndpointDeliveryRuleModifyResponseHeaderAction",
    "CdnEndpointDeliveryRulePostArgCondition",
    "CdnEndpointDeliveryRuleQueryStringCondition",
    "CdnEndpointDeliveryRuleRemoteAddressCondition",
    "CdnEndpointDeliveryRuleRequestBodyCondition",
    "CdnEndpointDeliveryRuleRequestHeaderCondition",
    "CdnEndpointDeliveryRuleRequestMethodCondition",
    "CdnEndpointDeliveryRuleRequestSchemeCondition",
    "CdnEndpointDeliveryRuleRequestUriCondition",
    "CdnEndpointDeliveryRuleUrlFileExtensionCondition",
    "CdnEndpointDeliveryRuleUrlFileNameCondition",
    "CdnEndpointDeliveryRuleUrlPathCondition",
    "CdnEndpointDeliveryRuleUrlRedirectAction",
    "CdnEndpointDeliveryRuleUrlRewriteAction",
    "CdnEndpointGeoFilter",
    "CdnEndpointGlobalDeliveryRule",
    "CdnEndpointGlobalDeliveryRuleCacheExpirationAction",
    "CdnEndpointGlobalDeliveryRuleCacheKeyQueryStringAction",
    "CdnEndpointGlobalDeliveryRuleModifyRequestHeaderAction",
    "CdnEndpointGlobalDeliveryRuleModifyResponseHeaderAction",
    "CdnEndpointGlobalDeliveryRuleUrlRedirectAction",
    "CdnEndpointGlobalDeliveryRuleUrlRewriteAction",
    "CdnEndpointOrigin",
    "CdnEndpointTimeouts",
    "CdnProfile",
    "CdnProfileConfig",
    "CdnProfileTimeouts",
    "CognitiveAccount",
    "CognitiveAccountConfig",
    "CognitiveAccountTimeouts",
    "ContainerGroup",
    "ContainerGroupConfig",
    "ContainerGroupContainer",
    "ContainerGroupContainerGpu",
    "ContainerGroupContainerLivenessProbe",
    "ContainerGroupContainerLivenessProbeHttpGet",
    "ContainerGroupContainerPorts",
    "ContainerGroupContainerReadinessProbe",
    "ContainerGroupContainerReadinessProbeHttpGet",
    "ContainerGroupContainerVolume",
    "ContainerGroupContainerVolumeGitRepo",
    "ContainerGroupDiagnostics",
    "ContainerGroupDiagnosticsLogAnalytics",
    "ContainerGroupDnsConfig",
    "ContainerGroupIdentity",
    "ContainerGroupImageRegistryCredential",
    "ContainerGroupTimeouts",
    "ContainerRegistry",
    "ContainerRegistryConfig",
    "ContainerRegistryNetworkRuleSet",
    "ContainerRegistryNetworkRuleSetIpRule",
    "ContainerRegistryNetworkRuleSetVirtualNetwork",
    "ContainerRegistryRetentionPolicy",
    "ContainerRegistryTimeouts",
    "ContainerRegistryTrustPolicy",
    "ContainerRegistryWebhook",
    "ContainerRegistryWebhookConfig",
    "ContainerRegistryWebhookTimeouts",
    "CosmosdbAccount",
    "CosmosdbAccountCapabilities",
    "CosmosdbAccountConfig",
    "CosmosdbAccountConsistencyPolicy",
    "CosmosdbAccountGeoLocation",
    "CosmosdbAccountTimeouts",
    "CosmosdbAccountVirtualNetworkRule",
    "CosmosdbCassandraKeyspace",
    "CosmosdbCassandraKeyspaceAutoscaleSettings",
    "CosmosdbCassandraKeyspaceConfig",
    "CosmosdbCassandraKeyspaceTimeouts",
    "CosmosdbGremlinDatabase",
    "CosmosdbGremlinDatabaseAutoscaleSettings",
    "CosmosdbGremlinDatabaseConfig",
    "CosmosdbGremlinDatabaseTimeouts",
    "CosmosdbGremlinGraph",
    "CosmosdbGremlinGraphAutoscaleSettings",
    "CosmosdbGremlinGraphConfig",
    "CosmosdbGremlinGraphConflictResolutionPolicy",
    "CosmosdbGremlinGraphIndexPolicy",
    "CosmosdbGremlinGraphTimeouts",
    "CosmosdbGremlinGraphUniqueKey",
    "CosmosdbMongoCollection",
    "CosmosdbMongoCollectionAutoscaleSettings",
    "CosmosdbMongoCollectionConfig",
    "CosmosdbMongoCollectionIndex",
    "CosmosdbMongoCollectionSystemIndexes",
    "CosmosdbMongoCollectionTimeouts",
    "CosmosdbMongoDatabase",
    "CosmosdbMongoDatabaseAutoscaleSettings",
    "CosmosdbMongoDatabaseConfig",
    "CosmosdbMongoDatabaseTimeouts",
    "CosmosdbSqlContainer",
    "CosmosdbSqlContainerAutoscaleSettings",
    "CosmosdbSqlContainerConfig",
    "CosmosdbSqlContainerIndexingPolicy",
    "CosmosdbSqlContainerIndexingPolicyCompositeIndex",
    "CosmosdbSqlContainerIndexingPolicyCompositeIndexIndex",
    "CosmosdbSqlContainerIndexingPolicyExcludedPath",
    "CosmosdbSqlContainerIndexingPolicyIncludedPath",
    "CosmosdbSqlContainerTimeouts",
    "CosmosdbSqlContainerUniqueKey",
    "CosmosdbSqlDatabase",
    "CosmosdbSqlDatabaseAutoscaleSettings",
    "CosmosdbSqlDatabaseConfig",
    "CosmosdbSqlDatabaseTimeouts",
    "CosmosdbSqlStoredProcedure",
    "CosmosdbSqlStoredProcedureConfig",
    "CosmosdbSqlStoredProcedureTimeouts",
    "CosmosdbTable",
    "CosmosdbTableAutoscaleSettings",
    "CosmosdbTableConfig",
    "CosmosdbTableTimeouts",
    "CostManagementExportResourceGroup",
    "CostManagementExportResourceGroupConfig",
    "CostManagementExportResourceGroupDeliveryInfo",
    "CostManagementExportResourceGroupQuery",
    "CostManagementExportResourceGroupTimeouts",
    "CustomProvider",
    "CustomProviderAction",
    "CustomProviderConfig",
    "CustomProviderResourceType",
    "CustomProviderTimeouts",
    "CustomProviderValidation",
    "Dashboard",
    "DashboardConfig",
    "DashboardTimeouts",
    "DataAzurermAdvisorRecommendations",
    "DataAzurermAdvisorRecommendationsConfig",
    "DataAzurermAdvisorRecommendationsRecommendations",
    "DataAzurermAdvisorRecommendationsTimeouts",
    "DataAzurermApiManagement",
    "DataAzurermApiManagementAdditionalLocation",
    "DataAzurermApiManagementApi",
    "DataAzurermApiManagementApiConfig",
    "DataAzurermApiManagementApiSubscriptionKeyParameterNames",
    "DataAzurermApiManagementApiTimeouts",
    "DataAzurermApiManagementApiVersionSet",
    "DataAzurermApiManagementApiVersionSetConfig",
    "DataAzurermApiManagementApiVersionSetTimeouts",
    "DataAzurermApiManagementConfig",
    "DataAzurermApiManagementGroup",
    "DataAzurermApiManagementGroupConfig",
    "DataAzurermApiManagementGroupTimeouts",
    "DataAzurermApiManagementHostnameConfiguration",
    "DataAzurermApiManagementHostnameConfigurationDeveloperPortal",
    "DataAzurermApiManagementHostnameConfigurationManagement",
    "DataAzurermApiManagementHostnameConfigurationPortal",
    "DataAzurermApiManagementHostnameConfigurationProxy",
    "DataAzurermApiManagementHostnameConfigurationScm",
    "DataAzurermApiManagementIdentity",
    "DataAzurermApiManagementProduct",
    "DataAzurermApiManagementProductConfig",
    "DataAzurermApiManagementProductTimeouts",
    "DataAzurermApiManagementTimeouts",
    "DataAzurermApiManagementUser",
    "DataAzurermApiManagementUserConfig",
    "DataAzurermApiManagementUserTimeouts",
    "DataAzurermAppConfiguration",
    "DataAzurermAppConfigurationConfig",
    "DataAzurermAppConfigurationPrimaryReadKey",
    "DataAzurermAppConfigurationPrimaryWriteKey",
    "DataAzurermAppConfigurationSecondaryReadKey",
    "DataAzurermAppConfigurationSecondaryWriteKey",
    "DataAzurermAppConfigurationTimeouts",
    "DataAzurermAppService",
    "DataAzurermAppServiceCertificate",
    "DataAzurermAppServiceCertificateConfig",
    "DataAzurermAppServiceCertificateOrder",
    "DataAzurermAppServiceCertificateOrderCertificates",
    "DataAzurermAppServiceCertificateOrderConfig",
    "DataAzurermAppServiceCertificateOrderTimeouts",
    "DataAzurermAppServiceCertificateTimeouts",
    "DataAzurermAppServiceConfig",
    "DataAzurermAppServiceConnectionString",
    "DataAzurermAppServiceEnvironment",
    "DataAzurermAppServiceEnvironmentConfig",
    "DataAzurermAppServiceEnvironmentTimeouts",
    "DataAzurermAppServicePlan",
    "DataAzurermAppServicePlanConfig",
    "DataAzurermAppServicePlanSku",
    "DataAzurermAppServicePlanTimeouts",
    "DataAzurermAppServiceSiteConfig",
    "DataAzurermAppServiceSiteConfigCors",
    "DataAzurermAppServiceSiteConfigIpRestriction",
    "DataAzurermAppServiceSiteConfigScmIpRestriction",
    "DataAzurermAppServiceSiteCredential",
    "DataAzurermAppServiceSourceControl",
    "DataAzurermAppServiceTimeouts",
    "DataAzurermApplicationInsights",
    "DataAzurermApplicationInsightsConfig",
    "DataAzurermApplicationInsightsTimeouts",
    "DataAzurermApplicationSecurityGroup",
    "DataAzurermApplicationSecurityGroupConfig",
    "DataAzurermApplicationSecurityGroupTimeouts",
    "DataAzurermAttestationProvider",
    "DataAzurermAttestationProviderConfig",
    "DataAzurermAttestationProviderTimeouts",
    "DataAzurermAutomationAccount",
    "DataAzurermAutomationAccountConfig",
    "DataAzurermAutomationAccountTimeouts",
    "DataAzurermAutomationVariableBool",
    "DataAzurermAutomationVariableBoolConfig",
    "DataAzurermAutomationVariableBoolTimeouts",
    "DataAzurermAutomationVariableDatetime",
    "DataAzurermAutomationVariableDatetimeConfig",
    "DataAzurermAutomationVariableDatetimeTimeouts",
    "DataAzurermAutomationVariableInt",
    "DataAzurermAutomationVariableIntConfig",
    "DataAzurermAutomationVariableIntTimeouts",
    "DataAzurermAutomationVariableString",
    "DataAzurermAutomationVariableStringConfig",
    "DataAzurermAutomationVariableStringTimeouts",
    "DataAzurermAvailabilitySet",
    "DataAzurermAvailabilitySetConfig",
    "DataAzurermAvailabilitySetTimeouts",
    "DataAzurermBackupPolicyVm",
    "DataAzurermBackupPolicyVmConfig",
    "DataAzurermBackupPolicyVmTimeouts",
    "DataAzurermBatchAccount",
    "DataAzurermBatchAccountConfig",
    "DataAzurermBatchAccountKeyVaultReference",
    "DataAzurermBatchAccountTimeouts",
    "DataAzurermBatchCertificate",
    "DataAzurermBatchCertificateConfig",
    "DataAzurermBatchCertificateTimeouts",
    "DataAzurermBatchPool",
    "DataAzurermBatchPoolAutoScale",
    "DataAzurermBatchPoolCertificate",
    "DataAzurermBatchPoolConfig",
    "DataAzurermBatchPoolContainerConfiguration",
    "DataAzurermBatchPoolContainerConfigurationContainerRegistries",
    "DataAzurermBatchPoolFixedScale",
    "DataAzurermBatchPoolNetworkConfiguration",
    "DataAzurermBatchPoolNetworkConfigurationEndpointConfiguration",
    "DataAzurermBatchPoolNetworkConfigurationEndpointConfigurationNetworkSecurityGroupRules",
    "DataAzurermBatchPoolStartTask",
    "DataAzurermBatchPoolStorageImageReference",
    "DataAzurermBatchPoolTimeouts",
    "DataAzurermBlueprintDefinition",
    "DataAzurermBlueprintDefinitionConfig",
    "DataAzurermBlueprintDefinitionTimeouts",
    "DataAzurermBlueprintPublishedVersion",
    "DataAzurermBlueprintPublishedVersionConfig",
    "DataAzurermBlueprintPublishedVersionTimeouts",
    "DataAzurermCdnProfile",
    "DataAzurermCdnProfileConfig",
    "DataAzurermCdnProfileTimeouts",
    "DataAzurermClientConfig",
    "DataAzurermClientConfigConfig",
    "DataAzurermClientConfigTimeouts",
    "DataAzurermCognitiveAccount",
    "DataAzurermCognitiveAccountConfig",
    "DataAzurermCognitiveAccountTimeouts",
    "DataAzurermContainerRegistry",
    "DataAzurermContainerRegistryConfig",
    "DataAzurermContainerRegistryTimeouts",
    "DataAzurermCosmosdbAccount",
    "DataAzurermCosmosdbAccountCapabilities",
    "DataAzurermCosmosdbAccountConfig",
    "DataAzurermCosmosdbAccountConsistencyPolicy",
    "DataAzurermCosmosdbAccountGeoLocation",
    "DataAzurermCosmosdbAccountTimeouts",
    "DataAzurermCosmosdbAccountVirtualNetworkRule",
    "DataAzurermDataFactory",
    "DataAzurermDataFactoryConfig",
    "DataAzurermDataFactoryGithubConfiguration",
    "DataAzurermDataFactoryIdentity",
    "DataAzurermDataFactoryTimeouts",
    "DataAzurermDataFactoryVstsConfiguration",
    "DataAzurermDataLakeStore",
    "DataAzurermDataLakeStoreConfig",
    "DataAzurermDataLakeStoreTimeouts",
    "DataAzurermDataShare",
    "DataAzurermDataShareAccount",
    "DataAzurermDataShareAccountConfig",
    "DataAzurermDataShareAccountIdentity",
    "DataAzurermDataShareAccountTimeouts",
    "DataAzurermDataShareConfig",
    "DataAzurermDataShareDatasetBlobStorage",
    "DataAzurermDataShareDatasetBlobStorageConfig",
    "DataAzurermDataShareDatasetBlobStorageStorageAccount",
    "DataAzurermDataShareDatasetBlobStorageTimeouts",
    "DataAzurermDataShareDatasetDataLakeGen1",
    "DataAzurermDataShareDatasetDataLakeGen1Config",
    "DataAzurermDataShareDatasetDataLakeGen1Timeouts",
    "DataAzurermDataShareDatasetDataLakeGen2",
    "DataAzurermDataShareDatasetDataLakeGen2Config",
    "DataAzurermDataShareDatasetDataLakeGen2Timeouts",
    "DataAzurermDataShareDatasetKustoCluster",
    "DataAzurermDataShareDatasetKustoClusterConfig",
    "DataAzurermDataShareDatasetKustoClusterTimeouts",
    "DataAzurermDataShareDatasetKustoDatabase",
    "DataAzurermDataShareDatasetKustoDatabaseConfig",
    "DataAzurermDataShareDatasetKustoDatabaseTimeouts",
    "DataAzurermDataShareSnapshotSchedule",
    "DataAzurermDataShareTimeouts",
    "DataAzurermDatabaseMigrationProject",
    "DataAzurermDatabaseMigrationProjectConfig",
    "DataAzurermDatabaseMigrationProjectTimeouts",
    "DataAzurermDatabaseMigrationService",
    "DataAzurermDatabaseMigrationServiceConfig",
    "DataAzurermDatabaseMigrationServiceTimeouts",
    "DataAzurermDatabricksWorkspace",
    "DataAzurermDatabricksWorkspaceConfig",
    "DataAzurermDatabricksWorkspaceTimeouts",
    "DataAzurermDedicatedHost",
    "DataAzurermDedicatedHostConfig",
    "DataAzurermDedicatedHostGroup",
    "DataAzurermDedicatedHostGroupConfig",
    "DataAzurermDedicatedHostGroupTimeouts",
    "DataAzurermDedicatedHostTimeouts",
    "DataAzurermDevTestLab",
    "DataAzurermDevTestLabConfig",
    "DataAzurermDevTestLabTimeouts",
    "DataAzurermDevTestVirtualNetwork",
    "DataAzurermDevTestVirtualNetworkAllowedSubnets",
    "DataAzurermDevTestVirtualNetworkConfig",
    "DataAzurermDevTestVirtualNetworkSubnetOverrides",
    "DataAzurermDevTestVirtualNetworkTimeouts",
    "DataAzurermDigitalTwinsInstance",
    "DataAzurermDigitalTwinsInstanceConfig",
    "DataAzurermDigitalTwinsInstanceTimeouts",
    "DataAzurermDiskEncryptionSet",
    "DataAzurermDiskEncryptionSetConfig",
    "DataAzurermDiskEncryptionSetTimeouts",
    "DataAzurermDnsZone",
    "DataAzurermDnsZoneConfig",
    "DataAzurermDnsZoneTimeouts",
    "DataAzurermEventgridTopic",
    "DataAzurermEventgridTopicConfig",
    "DataAzurermEventgridTopicTimeouts",
    "DataAzurermEventhub",
    "DataAzurermEventhubAuthorizationRule",
    "DataAzurermEventhubAuthorizationRuleConfig",
    "DataAzurermEventhubAuthorizationRuleTimeouts",
    "DataAzurermEventhubConfig",
    "DataAzurermEventhubConsumerGroup",
    "DataAzurermEventhubConsumerGroupConfig",
    "DataAzurermEventhubConsumerGroupTimeouts",
    "DataAzurermEventhubNamespace",
    "DataAzurermEventhubNamespaceAuthorizationRule",
    "DataAzurermEventhubNamespaceAuthorizationRuleConfig",
    "DataAzurermEventhubNamespaceAuthorizationRuleTimeouts",
    "DataAzurermEventhubNamespaceConfig",
    "DataAzurermEventhubNamespaceTimeouts",
    "DataAzurermEventhubTimeouts",
    "DataAzurermExpressRouteCircuit",
    "DataAzurermExpressRouteCircuitConfig",
    "DataAzurermExpressRouteCircuitPeerings",
    "DataAzurermExpressRouteCircuitServiceProviderProperties",
    "DataAzurermExpressRouteCircuitSku",
    "DataAzurermExpressRouteCircuitTimeouts",
    "DataAzurermFirewall",
    "DataAzurermFirewallConfig",
    "DataAzurermFirewallIpConfiguration",
    "DataAzurermFirewallManagementIpConfiguration",
    "DataAzurermFirewallPolicy",
    "DataAzurermFirewallPolicyConfig",
    "DataAzurermFirewallPolicyDns",
    "DataAzurermFirewallPolicyThreatIntelligenceAllowlist",
    "DataAzurermFirewallPolicyTimeouts",
    "DataAzurermFirewallTimeouts",
    "DataAzurermFirewallVirtualHub",
    "DataAzurermFunctionApp",
    "DataAzurermFunctionAppConfig",
    "DataAzurermFunctionAppConnectionString",
    "DataAzurermFunctionAppHostKeys",
    "DataAzurermFunctionAppHostKeysConfig",
    "DataAzurermFunctionAppHostKeysTimeouts",
    "DataAzurermFunctionAppIdentity",
    "DataAzurermFunctionAppSiteConfig",
    "DataAzurermFunctionAppSiteConfigCors",
    "DataAzurermFunctionAppSiteConfigIpRestriction",
    "DataAzurermFunctionAppSiteConfigScmIpRestriction",
    "DataAzurermFunctionAppSiteCredential",
    "DataAzurermFunctionAppSourceControl",
    "DataAzurermFunctionAppTimeouts",
    "DataAzurermHdinsightCluster",
    "DataAzurermHdinsightClusterConfig",
    "DataAzurermHdinsightClusterGateway",
    "DataAzurermHdinsightClusterTimeouts",
    "DataAzurermHealthcareService",
    "DataAzurermHealthcareServiceAuthenticationConfiguration",
    "DataAzurermHealthcareServiceConfig",
    "DataAzurermHealthcareServiceCorsConfiguration",
    "DataAzurermHealthcareServiceTimeouts",
    "DataAzurermImage",
    "DataAzurermImageConfig",
    "DataAzurermImageDataDisk",
    "DataAzurermImageOsDisk",
    "DataAzurermImageTimeouts",
    "DataAzurermImages",
    "DataAzurermImagesConfig",
    "DataAzurermImagesImages",
    "DataAzurermImagesImagesDataDisk",
    "DataAzurermImagesImagesOsDisk",
    "DataAzurermImagesTimeouts",
    "DataAzurermIothubDps",
    "DataAzurermIothubDpsConfig",
    "DataAzurermIothubDpsSharedAccessPolicy",
    "DataAzurermIothubDpsSharedAccessPolicyConfig",
    "DataAzurermIothubDpsSharedAccessPolicyTimeouts",
    "DataAzurermIothubDpsTimeouts",
    "DataAzurermIothubSharedAccessPolicy",
    "DataAzurermIothubSharedAccessPolicyConfig",
    "DataAzurermIothubSharedAccessPolicyTimeouts",
    "DataAzurermIpGroup",
    "DataAzurermIpGroupConfig",
    "DataAzurermIpGroupTimeouts",
    "DataAzurermKeyVault",
    "DataAzurermKeyVaultAccessPolicy",
    "DataAzurermKeyVaultAccessPolicyA",
    "DataAzurermKeyVaultAccessPolicyAConfig",
    "DataAzurermKeyVaultAccessPolicyTimeouts",
    "DataAzurermKeyVaultCertificate",
    "DataAzurermKeyVaultCertificateCertificatePolicy",
    "DataAzurermKeyVaultCertificateCertificatePolicyIssuerParameters",
    "DataAzurermKeyVaultCertificateCertificatePolicyKeyProperties",
    "DataAzurermKeyVaultCertificateCertificatePolicyLifetimeAction",
    "DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionAction",
    "DataAzurermKeyVaultCertificateCertificatePolicyLifetimeActionTrigger",
    "DataAzurermKeyVaultCertificateCertificatePolicySecretProperties",
    "DataAzurermKeyVaultCertificateCertificatePolicyX509CertificateProperties",
    "DataAzurermKeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames",
    "DataAzurermKeyVaultCertificateConfig",
    "DataAzurermKeyVaultCertificateIssuer",
    "DataAzurermKeyVaultCertificateIssuerAdmin",
    "DataAzurermKeyVaultCertificateIssuerConfig",
    "DataAzurermKeyVaultCertificateIssuerTimeouts",
    "DataAzurermKeyVaultCertificateTimeouts",
    "DataAzurermKeyVaultConfig",
    "DataAzurermKeyVaultKey",
    "DataAzurermKeyVaultKeyConfig",
    "DataAzurermKeyVaultKeyTimeouts",
    "DataAzurermKeyVaultNetworkAcls",
    "DataAzurermKeyVaultSecret",
    "DataAzurermKeyVaultSecretConfig",
    "DataAzurermKeyVaultSecretTimeouts",
    "DataAzurermKeyVaultTimeouts",
    "DataAzurermKubernetesCluster",
    "DataAzurermKubernetesClusterAddonProfile",
    "DataAzurermKubernetesClusterAddonProfileAzurePolicy",
    "DataAzurermKubernetesClusterAddonProfileHttpApplicationRouting",
    "DataAzurermKubernetesClusterAddonProfileKubeDashboard",
    "DataAzurermKubernetesClusterAddonProfileOmsAgent",
    "DataAzurermKubernetesClusterAddonProfileOmsAgentOmsAgentIdentity",
    "DataAzurermKubernetesClusterAgentPoolProfile",
    "DataAzurermKubernetesClusterConfig",
    "DataAzurermKubernetesClusterIdentity",
    "DataAzurermKubernetesClusterKubeAdminConfig",
    "DataAzurermKubernetesClusterKubeConfig",
    "DataAzurermKubernetesClusterKubeletIdentity",
    "DataAzurermKubernetesClusterLinuxProfile",
    "DataAzurermKubernetesClusterLinuxProfileSshKey",
    "DataAzurermKubernetesClusterNetworkProfile",
    "DataAzurermKubernetesClusterNodePool",
    "DataAzurermKubernetesClusterNodePoolConfig",
    "DataAzurermKubernetesClusterNodePoolTimeouts",
    "DataAzurermKubernetesClusterRoleBasedAccessControl",
    "DataAzurermKubernetesClusterRoleBasedAccessControlAzureActiveDirectory",
    "DataAzurermKubernetesClusterServicePrincipal",
    "DataAzurermKubernetesClusterTimeouts",
    "DataAzurermKubernetesClusterWindowsProfile",
    "DataAzurermKubernetesServiceVersions",
    "DataAzurermKubernetesServiceVersionsConfig",
    "DataAzurermKubernetesServiceVersionsTimeouts",
    "DataAzurermKustoCluster",
    "DataAzurermKustoClusterConfig",
    "DataAzurermKustoClusterTimeouts",
    "DataAzurermLb",
    "DataAzurermLbBackendAddressPool",
    "DataAzurermLbBackendAddressPoolBackendIpConfigurations",
    "DataAzurermLbBackendAddressPoolConfig",
    "DataAzurermLbBackendAddressPoolTimeouts",
    "DataAzurermLbConfig",
    "DataAzurermLbFrontendIpConfiguration",
    "DataAzurermLbRule",
    "DataAzurermLbRuleConfig",
    "DataAzurermLbRuleTimeouts",
    "DataAzurermLbTimeouts",
    "DataAzurermLogAnalyticsWorkspace",
    "DataAzurermLogAnalyticsWorkspaceConfig",
    "DataAzurermLogAnalyticsWorkspaceTimeouts",
    "DataAzurermLogicAppIntegrationAccount",
    "DataAzurermLogicAppIntegrationAccountConfig",
    "DataAzurermLogicAppIntegrationAccountTimeouts",
    "DataAzurermLogicAppWorkflow",
    "DataAzurermLogicAppWorkflowConfig",
    "DataAzurermLogicAppWorkflowTimeouts",
    "DataAzurermMachineLearningWorkspace",
    "DataAzurermMachineLearningWorkspaceConfig",
    "DataAzurermMachineLearningWorkspaceIdentity",
    "DataAzurermMachineLearningWorkspaceTimeouts",
    "DataAzurermMaintenanceConfiguration",
    "DataAzurermMaintenanceConfigurationConfig",
    "DataAzurermMaintenanceConfigurationTimeouts",
    "DataAzurermManagedApplicationDefinition",
    "DataAzurermManagedApplicationDefinitionConfig",
    "DataAzurermManagedApplicationDefinitionTimeouts",
    "DataAzurermManagedDisk",
    "DataAzurermManagedDiskConfig",
    "DataAzurermManagedDiskTimeouts",
    "DataAzurermManagementGroup",
    "DataAzurermManagementGroupConfig",
    "DataAzurermManagementGroupTimeouts",
    "DataAzurermMapsAccount",
    "DataAzurermMapsAccountConfig",
    "DataAzurermMapsAccountTimeouts",
    "DataAzurermMariadbServer",
    "DataAzurermMariadbServerConfig",
    "DataAzurermMariadbServerStorageProfile",
    "DataAzurermMariadbServerTimeouts",
    "DataAzurermMonitorActionGroup",
    "DataAzurermMonitorActionGroupArmRoleReceiver",
    "DataAzurermMonitorActionGroupAutomationRunbookReceiver",
    "DataAzurermMonitorActionGroupAzureAppPushReceiver",
    "DataAzurermMonitorActionGroupAzureFunctionReceiver",
    "DataAzurermMonitorActionGroupConfig",
    "DataAzurermMonitorActionGroupEmailReceiver",
    "DataAzurermMonitorActionGroupItsmReceiver",
    "DataAzurermMonitorActionGroupLogicAppReceiver",
    "DataAzurermMonitorActionGroupSmsReceiver",
    "DataAzurermMonitorActionGroupTimeouts",
    "DataAzurermMonitorActionGroupVoiceReceiver",
    "DataAzurermMonitorActionGroupWebhookReceiver",
    "DataAzurermMonitorDiagnosticCategories",
    "DataAzurermMonitorDiagnosticCategoriesConfig",
    "DataAzurermMonitorDiagnosticCategoriesTimeouts",
    "DataAzurermMonitorLogProfile",
    "DataAzurermMonitorLogProfileConfig",
    "DataAzurermMonitorLogProfileRetentionPolicy",
    "DataAzurermMonitorLogProfileTimeouts",
    "DataAzurermMonitorScheduledQueryRulesAlert",
    "DataAzurermMonitorScheduledQueryRulesAlertAction",
    "DataAzurermMonitorScheduledQueryRulesAlertConfig",
    "DataAzurermMonitorScheduledQueryRulesAlertTimeouts",
    "DataAzurermMonitorScheduledQueryRulesAlertTrigger",
    "DataAzurermMonitorScheduledQueryRulesAlertTriggerMetricTrigger",
    "DataAzurermMonitorScheduledQueryRulesLog",
    "DataAzurermMonitorScheduledQueryRulesLogConfig",
    "DataAzurermMonitorScheduledQueryRulesLogCriteria",
    "DataAzurermMonitorScheduledQueryRulesLogCriteriaDimension",
    "DataAzurermMonitorScheduledQueryRulesLogTimeouts",
    "DataAzurermMssqlDatabase",
    "DataAzurermMssqlDatabaseConfig",
    "DataAzurermMssqlDatabaseTimeouts",
    "DataAzurermMssqlElasticpool",
    "DataAzurermMssqlElasticpoolConfig",
    "DataAzurermMssqlElasticpoolTimeouts",
    "DataAzurermMssqlServer",
    "DataAzurermMssqlServerConfig",
    "DataAzurermMssqlServerIdentity",
    "DataAzurermMssqlServerTimeouts",
    "DataAzurermMysqlServer",
    "DataAzurermMysqlServerConfig",
    "DataAzurermMysqlServerIdentity",
    "DataAzurermMysqlServerThreatDetectionPolicy",
    "DataAzurermMysqlServerTimeouts",
    "DataAzurermNatGateway",
    "DataAzurermNatGatewayConfig",
    "DataAzurermNatGatewayTimeouts",
    "DataAzurermNetappAccount",
    "DataAzurermNetappAccountConfig",
    "DataAzurermNetappAccountTimeouts",
    "DataAzurermNetappPool",
    "DataAzurermNetappPoolConfig",
    "DataAzurermNetappPoolTimeouts",
    "DataAzurermNetappSnapshot",
    "DataAzurermNetappSnapshotConfig",
    "DataAzurermNetappSnapshotTimeouts",
    "DataAzurermNetappVolume",
    "DataAzurermNetappVolumeConfig",
    "DataAzurermNetappVolumeTimeouts",
    "DataAzurermNetworkDdosProtectionPlan",
    "DataAzurermNetworkDdosProtectionPlanConfig",
    "DataAzurermNetworkDdosProtectionPlanTimeouts",
    "DataAzurermNetworkInterface",
    "DataAzurermNetworkInterfaceConfig",
    "DataAzurermNetworkInterfaceIpConfiguration",
    "DataAzurermNetworkInterfaceTimeouts",
    "DataAzurermNetworkSecurityGroup",
    "DataAzurermNetworkSecurityGroupConfig",
    "DataAzurermNetworkSecurityGroupSecurityRule",
    "DataAzurermNetworkSecurityGroupTimeouts",
    "DataAzurermNetworkServiceTags",
    "DataAzurermNetworkServiceTagsConfig",
    "DataAzurermNetworkServiceTagsTimeouts",
    "DataAzurermNetworkWatcher",
    "DataAzurermNetworkWatcherConfig",
    "DataAzurermNetworkWatcherTimeouts",
    "DataAzurermNotificationHub",
    "DataAzurermNotificationHubApnsCredential",
    "DataAzurermNotificationHubConfig",
    "DataAzurermNotificationHubGcmCredential",
    "DataAzurermNotificationHubNamespace",
    "DataAzurermNotificationHubNamespaceConfig",
    "DataAzurermNotificationHubNamespaceSku",
    "DataAzurermNotificationHubNamespaceTimeouts",
    "DataAzurermNotificationHubTimeouts",
    "DataAzurermPlatformImage",
    "DataAzurermPlatformImageConfig",
    "DataAzurermPlatformImageTimeouts",
    "DataAzurermPolicyDefinition",
    "DataAzurermPolicyDefinitionConfig",
    "DataAzurermPolicyDefinitionTimeouts",
    "DataAzurermPolicySetDefinition",
    "DataAzurermPolicySetDefinitionConfig",
    "DataAzurermPolicySetDefinitionPolicyDefinitionGroup",
    "DataAzurermPolicySetDefinitionPolicyDefinitionReference",
    "DataAzurermPolicySetDefinitionTimeouts",
    "DataAzurermPostgresqlServer",
    "DataAzurermPostgresqlServerConfig",
    "DataAzurermPostgresqlServerIdentity",
    "DataAzurermPostgresqlServerTimeouts",
    "DataAzurermPrivateDnsZone",
    "DataAzurermPrivateDnsZoneConfig",
    "DataAzurermPrivateDnsZoneTimeouts",
    "DataAzurermPrivateEndpointConnection",
    "DataAzurermPrivateEndpointConnectionConfig",
    "DataAzurermPrivateEndpointConnectionPrivateServiceConnection",
    "DataAzurermPrivateEndpointConnectionTimeouts",
    "DataAzurermPrivateLinkService",
    "DataAzurermPrivateLinkServiceConfig",
    "DataAzurermPrivateLinkServiceEndpointConnections",
    "DataAzurermPrivateLinkServiceEndpointConnectionsConfig",
    "DataAzurermPrivateLinkServiceEndpointConnectionsPrivateEndpointConnections",
    "DataAzurermPrivateLinkServiceEndpointConnectionsTimeouts",
    "DataAzurermPrivateLinkServiceNatIpConfiguration",
    "DataAzurermPrivateLinkServiceTimeouts",
    "DataAzurermProximityPlacementGroup",
    "DataAzurermProximityPlacementGroupConfig",
    "DataAzurermProximityPlacementGroupTimeouts",
    "DataAzurermPublicIp",
    "DataAzurermPublicIpConfig",
    "DataAzurermPublicIpPrefix",
    "DataAzurermPublicIpPrefixConfig",
    "DataAzurermPublicIpPrefixTimeouts",
    "DataAzurermPublicIpTimeouts",
    "DataAzurermPublicIps",
    "DataAzurermPublicIpsConfig",
    "DataAzurermPublicIpsPublicIps",
    "DataAzurermPublicIpsTimeouts",
    "DataAzurermRecoveryServicesVault",
    "DataAzurermRecoveryServicesVaultConfig",
    "DataAzurermRecoveryServicesVaultTimeouts",
    "DataAzurermRedisCache",
    "DataAzurermRedisCacheConfig",
    "DataAzurermRedisCachePatchSchedule",
    "DataAzurermRedisCacheRedisConfiguration",
    "DataAzurermRedisCacheTimeouts",
    "DataAzurermResourceGroup",
    "DataAzurermResourceGroupConfig",
    "DataAzurermResourceGroupTimeouts",
    "DataAzurermResources",
    "DataAzurermResourcesConfig",
    "DataAzurermResourcesResources",
    "DataAzurermResourcesTimeouts",
    "DataAzurermRoleDefinition",
    "DataAzurermRoleDefinitionConfig",
    "DataAzurermRoleDefinitionPermissions",
    "DataAzurermRoleDefinitionTimeouts",
    "DataAzurermRouteFilter",
    "DataAzurermRouteFilterConfig",
    "DataAzurermRouteFilterRule",
    "DataAzurermRouteFilterTimeouts",
    "DataAzurermRouteTable",
    "DataAzurermRouteTableConfig",
    "DataAzurermRouteTableRoute",
    "DataAzurermRouteTableTimeouts",
    "DataAzurermSentinelAlertRule",
    "DataAzurermSentinelAlertRuleConfig",
    "DataAzurermSentinelAlertRuleTimeouts",
    "DataAzurermServicebusNamespace",
    "DataAzurermServicebusNamespaceAuthorizationRule",
    "DataAzurermServicebusNamespaceAuthorizationRuleConfig",
    "DataAzurermServicebusNamespaceAuthorizationRuleTimeouts",
    "DataAzurermServicebusNamespaceConfig",
    "DataAzurermServicebusNamespaceTimeouts",
    "DataAzurermServicebusQueueAuthorizationRule",
    "DataAzurermServicebusQueueAuthorizationRuleConfig",
    "DataAzurermServicebusQueueAuthorizationRuleTimeouts",
    "DataAzurermServicebusSubscription",
    "DataAzurermServicebusSubscriptionConfig",
    "DataAzurermServicebusSubscriptionTimeouts",
    "DataAzurermServicebusTopicAuthorizationRule",
    "DataAzurermServicebusTopicAuthorizationRuleConfig",
    "DataAzurermServicebusTopicAuthorizationRuleTimeouts",
    "DataAzurermSharedImage",
    "DataAzurermSharedImageConfig",
    "DataAzurermSharedImageGallery",
    "DataAzurermSharedImageGalleryConfig",
    "DataAzurermSharedImageGalleryTimeouts",
    "DataAzurermSharedImageIdentifier",
    "DataAzurermSharedImageTimeouts",
    "DataAzurermSharedImageVersion",
    "DataAzurermSharedImageVersionConfig",
    "DataAzurermSharedImageVersionTargetRegion",
    "DataAzurermSharedImageVersionTimeouts",
    "DataAzurermSharedImageVersions",
    "DataAzurermSharedImageVersionsConfig",
    "DataAzurermSharedImageVersionsImages",
    "DataAzurermSharedImageVersionsImagesTargetRegion",
    "DataAzurermSharedImageVersionsTimeouts",
    "DataAzurermSignalrService",
    "DataAzurermSignalrServiceConfig",
    "DataAzurermSignalrServiceTimeouts",
    "DataAzurermSnapshot",
    "DataAzurermSnapshotConfig",
    "DataAzurermSnapshotEncryptionSettings",
    "DataAzurermSnapshotEncryptionSettingsDiskEncryptionKey",
    "DataAzurermSnapshotEncryptionSettingsKeyEncryptionKey",
    "DataAzurermSnapshotTimeouts",
    "DataAzurermSpringCloudService",
    "DataAzurermSpringCloudServiceConfig",
    "DataAzurermSpringCloudServiceConfigServerGitSetting",
    "DataAzurermSpringCloudServiceConfigServerGitSettingHttpBasicAuth",
    "DataAzurermSpringCloudServiceConfigServerGitSettingRepository",
    "DataAzurermSpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth",
    "DataAzurermSpringCloudServiceConfigServerGitSettingRepositorySshAuth",
    "DataAzurermSpringCloudServiceConfigServerGitSettingSshAuth",
    "DataAzurermSpringCloudServiceTimeouts",
    "DataAzurermSqlDatabase",
    "DataAzurermSqlDatabaseConfig",
    "DataAzurermSqlDatabaseTimeouts",
    "DataAzurermSqlServer",
    "DataAzurermSqlServerConfig",
    "DataAzurermSqlServerIdentity",
    "DataAzurermSqlServerTimeouts",
    "DataAzurermStorageAccount",
    "DataAzurermStorageAccountBlobContainerSas",
    "DataAzurermStorageAccountBlobContainerSasConfig",
    "DataAzurermStorageAccountBlobContainerSasPermissions",
    "DataAzurermStorageAccountBlobContainerSasTimeouts",
    "DataAzurermStorageAccountConfig",
    "DataAzurermStorageAccountCustomDomain",
    "DataAzurermStorageAccountSas",
    "DataAzurermStorageAccountSasConfig",
    "DataAzurermStorageAccountSasPermissions",
    "DataAzurermStorageAccountSasResourceTypes",
    "DataAzurermStorageAccountSasServices",
    "DataAzurermStorageAccountSasTimeouts",
    "DataAzurermStorageAccountTimeouts",
    "DataAzurermStorageContainer",
    "DataAzurermStorageContainerConfig",
    "DataAzurermStorageContainerTimeouts",
    "DataAzurermStorageEncryptionScope",
    "DataAzurermStorageEncryptionScopeConfig",
    "DataAzurermStorageEncryptionScopeTimeouts",
    "DataAzurermStorageManagementPolicy",
    "DataAzurermStorageManagementPolicyConfig",
    "DataAzurermStorageManagementPolicyRule",
    "DataAzurermStorageManagementPolicyRuleActions",
    "DataAzurermStorageManagementPolicyRuleActionsBaseBlob",
    "DataAzurermStorageManagementPolicyRuleActionsSnapshot",
    "DataAzurermStorageManagementPolicyRuleFilters",
    "DataAzurermStorageManagementPolicyTimeouts",
    "DataAzurermStorageSync",
    "DataAzurermStorageSyncConfig",
    "DataAzurermStorageSyncGroup",
    "DataAzurermStorageSyncGroupConfig",
    "DataAzurermStorageSyncGroupTimeouts",
    "DataAzurermStorageSyncTimeouts",
    "DataAzurermStreamAnalyticsJob",
    "DataAzurermStreamAnalyticsJobConfig",
    "DataAzurermStreamAnalyticsJobTimeouts",
    "DataAzurermSubnet",
    "DataAzurermSubnetConfig",
    "DataAzurermSubnetTimeouts",
    "DataAzurermSubscription",
    "DataAzurermSubscriptionConfig",
    "DataAzurermSubscriptionTimeouts",
    "DataAzurermSubscriptions",
    "DataAzurermSubscriptionsConfig",
    "DataAzurermSubscriptionsSubscriptions",
    "DataAzurermSubscriptionsTimeouts",
    "DataAzurermSynapseWorkspace",
    "DataAzurermSynapseWorkspaceConfig",
    "DataAzurermSynapseWorkspaceTimeouts",
    "DataAzurermTrafficManagerGeographicalLocation",
    "DataAzurermTrafficManagerGeographicalLocationConfig",
    "DataAzurermTrafficManagerGeographicalLocationTimeouts",
    "DataAzurermTrafficManagerProfile",
    "DataAzurermTrafficManagerProfileConfig",
    "DataAzurermTrafficManagerProfileDnsConfig",
    "DataAzurermTrafficManagerProfileMonitorConfig",
    "DataAzurermTrafficManagerProfileMonitorConfigCustomHeader",
    "DataAzurermTrafficManagerProfileTimeouts",
    "DataAzurermUserAssignedIdentity",
    "DataAzurermUserAssignedIdentityConfig",
    "DataAzurermUserAssignedIdentityTimeouts",
    "DataAzurermVirtualHub",
    "DataAzurermVirtualHubConfig",
    "DataAzurermVirtualHubTimeouts",
    "DataAzurermVirtualMachine",
    "DataAzurermVirtualMachineConfig",
    "DataAzurermVirtualMachineIdentity",
    "DataAzurermVirtualMachineScaleSet",
    "DataAzurermVirtualMachineScaleSetConfig",
    "DataAzurermVirtualMachineScaleSetIdentity",
    "DataAzurermVirtualMachineScaleSetTimeouts",
    "DataAzurermVirtualMachineTimeouts",
    "DataAzurermVirtualNetwork",
    "DataAzurermVirtualNetworkConfig",
    "DataAzurermVirtualNetworkGateway",
    "DataAzurermVirtualNetworkGatewayBgpSettings",
    "DataAzurermVirtualNetworkGatewayConfig",
    "DataAzurermVirtualNetworkGatewayConnection",
    "DataAzurermVirtualNetworkGatewayConnectionConfig",
    "DataAzurermVirtualNetworkGatewayConnectionIpsecPolicy",
    "DataAzurermVirtualNetworkGatewayConnectionTimeouts",
    "DataAzurermVirtualNetworkGatewayConnectionTrafficSelectorPolicy",
    "DataAzurermVirtualNetworkGatewayCustomRoute",
    "DataAzurermVirtualNetworkGatewayIpConfiguration",
    "DataAzurermVirtualNetworkGatewayTimeouts",
    "DataAzurermVirtualNetworkGatewayVpnClientConfiguration",
    "DataAzurermVirtualNetworkGatewayVpnClientConfigurationRevokedCertificate",
    "DataAzurermVirtualNetworkGatewayVpnClientConfigurationRootCertificate",
    "DataAzurermVirtualNetworkTimeouts",
    "DataAzurermVirtualWan",
    "DataAzurermVirtualWanConfig",
    "DataAzurermVirtualWanTimeouts",
    "DataAzurermWebApplicationFirewallPolicy",
    "DataAzurermWebApplicationFirewallPolicyConfig",
    "DataAzurermWebApplicationFirewallPolicyTimeouts",
    "DataFactory",
    "DataFactoryConfig",
    "DataFactoryDatasetAzureBlob",
    "DataFactoryDatasetAzureBlobConfig",
    "DataFactoryDatasetAzureBlobSchemaColumn",
    "DataFactoryDatasetAzureBlobTimeouts",
    "DataFactoryDatasetCosmosdbSqlapi",
    "DataFactoryDatasetCosmosdbSqlapiConfig",
    "DataFactoryDatasetCosmosdbSqlapiSchemaColumn",
    "DataFactoryDatasetCosmosdbSqlapiTimeouts",
    "DataFactoryDatasetDelimitedText",
    "DataFactoryDatasetDelimitedTextAzureBlobStorageLocation",
    "DataFactoryDatasetDelimitedTextConfig",
    "DataFactoryDatasetDelimitedTextHttpServerLocation",
    "DataFactoryDatasetDelimitedTextSchemaColumn",
    "DataFactoryDatasetDelimitedTextTimeouts",
    "DataFactoryDatasetHttp",
    "DataFactoryDatasetHttpConfig",
    "DataFactoryDatasetHttpSchemaColumn",
    "DataFactoryDatasetHttpTimeouts",
    "DataFactoryDatasetJson",
    "DataFactoryDatasetJsonAzureBlobStorageLocation",
    "DataFactoryDatasetJsonConfig",
    "DataFactoryDatasetJsonHttpServerLocation",
    "DataFactoryDatasetJsonSchemaColumn",
    "DataFactoryDatasetJsonTimeouts",
    "DataFactoryDatasetMysql",
    "DataFactoryDatasetMysqlConfig",
    "DataFactoryDatasetMysqlSchemaColumn",
    "DataFactoryDatasetMysqlTimeouts",
    "DataFactoryDatasetPostgresql",
    "DataFactoryDatasetPostgresqlConfig",
    "DataFactoryDatasetPostgresqlSchemaColumn",
    "DataFactoryDatasetPostgresqlTimeouts",
    "DataFactoryDatasetSqlServerTable",
    "DataFactoryDatasetSqlServerTableConfig",
    "DataFactoryDatasetSqlServerTableSchemaColumn",
    "DataFactoryDatasetSqlServerTableTimeouts",
    "DataFactoryGithubConfiguration",
    "DataFactoryIdentity",
    "DataFactoryIntegrationRuntimeManaged",
    "DataFactoryIntegrationRuntimeManagedCatalogInfo",
    "DataFactoryIntegrationRuntimeManagedConfig",
    "DataFactoryIntegrationRuntimeManagedCustomSetupScript",
    "DataFactoryIntegrationRuntimeManagedTimeouts",
    "DataFactoryIntegrationRuntimeManagedVnetIntegration",
    "DataFactoryIntegrationRuntimeSelfHosted",
    "DataFactoryIntegrationRuntimeSelfHostedConfig",
    "DataFactoryIntegrationRuntimeSelfHostedRbacAuthorization",
    "DataFactoryIntegrationRuntimeSelfHostedTimeouts",
    "DataFactoryLinkedServiceAzureBlobStorage",
    "DataFactoryLinkedServiceAzureBlobStorageConfig",
    "DataFactoryLinkedServiceAzureBlobStorageTimeouts",
    "DataFactoryLinkedServiceAzureFileStorage",
    "DataFactoryLinkedServiceAzureFileStorageConfig",
    "DataFactoryLinkedServiceAzureFileStorageTimeouts",
    "DataFactoryLinkedServiceAzureFunction",
    "DataFactoryLinkedServiceAzureFunctionConfig",
    "DataFactoryLinkedServiceAzureFunctionTimeouts",
    "DataFactoryLinkedServiceAzureSqlDatabase",
    "DataFactoryLinkedServiceAzureSqlDatabaseConfig",
    "DataFactoryLinkedServiceAzureSqlDatabaseTimeouts",
    "DataFactoryLinkedServiceCosmosdb",
    "DataFactoryLinkedServiceCosmosdbConfig",
    "DataFactoryLinkedServiceCosmosdbTimeouts",
    "DataFactoryLinkedServiceDataLakeStorageGen2",
    "DataFactoryLinkedServiceDataLakeStorageGen2Config",
    "DataFactoryLinkedServiceDataLakeStorageGen2Timeouts",
    "DataFactoryLinkedServiceKeyVault",
    "DataFactoryLinkedServiceKeyVaultConfig",
    "DataFactoryLinkedServiceKeyVaultTimeouts",
    "DataFactoryLinkedServiceMysql",
    "DataFactoryLinkedServiceMysqlConfig",
    "DataFactoryLinkedServiceMysqlTimeouts",
    "DataFactoryLinkedServicePostgresql",
    "DataFactoryLinkedServicePostgresqlConfig",
    "DataFactoryLinkedServicePostgresqlTimeouts",
    "DataFactoryLinkedServiceSftp",
    "DataFactoryLinkedServiceSftpConfig",
    "DataFactoryLinkedServiceSftpTimeouts",
    "DataFactoryLinkedServiceSqlServer",
    "DataFactoryLinkedServiceSqlServerConfig",
    "DataFactoryLinkedServiceSqlServerTimeouts",
    "DataFactoryLinkedServiceWeb",
    "DataFactoryLinkedServiceWebConfig",
    "DataFactoryLinkedServiceWebTimeouts",
    "DataFactoryPipeline",
    "DataFactoryPipelineConfig",
    "DataFactoryPipelineTimeouts",
    "DataFactoryTimeouts",
    "DataFactoryTriggerSchedule",
    "DataFactoryTriggerScheduleConfig",
    "DataFactoryTriggerScheduleTimeouts",
    "DataFactoryVstsConfiguration",
    "DataLakeAnalyticsAccount",
    "DataLakeAnalyticsAccountConfig",
    "DataLakeAnalyticsAccountTimeouts",
    "DataLakeAnalyticsFirewallRule",
    "DataLakeAnalyticsFirewallRuleConfig",
    "DataLakeAnalyticsFirewallRuleTimeouts",
    "DataLakeStore",
    "DataLakeStoreConfig",
    "DataLakeStoreFile",
    "DataLakeStoreFileConfig",
    "DataLakeStoreFileTimeouts",
    "DataLakeStoreFirewallRule",
    "DataLakeStoreFirewallRuleConfig",
    "DataLakeStoreFirewallRuleTimeouts",
    "DataLakeStoreTimeouts",
    "DataShare",
    "DataShareAccount",
    "DataShareAccountConfig",
    "DataShareAccountIdentity",
    "DataShareAccountTimeouts",
    "DataShareConfig",
    "DataShareDatasetBlobStorage",
    "DataShareDatasetBlobStorageConfig",
    "DataShareDatasetBlobStorageStorageAccount",
    "DataShareDatasetBlobStorageTimeouts",
    "DataShareDatasetDataLakeGen1",
    "DataShareDatasetDataLakeGen1Config",
    "DataShareDatasetDataLakeGen1Timeouts",
    "DataShareDatasetDataLakeGen2",
    "DataShareDatasetDataLakeGen2Config",
    "DataShareDatasetDataLakeGen2Timeouts",
    "DataShareDatasetKustoCluster",
    "DataShareDatasetKustoClusterConfig",
    "DataShareDatasetKustoClusterTimeouts",
    "DataShareDatasetKustoDatabase",
    "DataShareDatasetKustoDatabaseConfig",
    "DataShareDatasetKustoDatabaseTimeouts",
    "DataShareSnapshotSchedule",
    "DataShareTimeouts",
    "DatabaseMigrationProject",
    "DatabaseMigrationProjectConfig",
    "DatabaseMigrationProjectTimeouts",
    "DatabaseMigrationService",
    "DatabaseMigrationServiceConfig",
    "DatabaseMigrationServiceTimeouts",
    "DatabricksWorkspace",
    "DatabricksWorkspaceConfig",
    "DatabricksWorkspaceCustomParameters",
    "DatabricksWorkspaceTimeouts",
    "DedicatedHardwareSecurityModule",
    "DedicatedHardwareSecurityModuleConfig",
    "DedicatedHardwareSecurityModuleNetworkProfile",
    "DedicatedHardwareSecurityModuleTimeouts",
    "DedicatedHost",
    "DedicatedHostConfig",
    "DedicatedHostGroup",
    "DedicatedHostGroupConfig",
    "DedicatedHostGroupTimeouts",
    "DedicatedHostTimeouts",
    "DevTestGlobalVmShutdownSchedule",
    "DevTestGlobalVmShutdownScheduleConfig",
    "DevTestGlobalVmShutdownScheduleNotificationSettings",
    "DevTestGlobalVmShutdownScheduleTimeouts",
    "DevTestLab",
    "DevTestLabConfig",
    "DevTestLabTimeouts",
    "DevTestLinuxVirtualMachine",
    "DevTestLinuxVirtualMachineConfig",
    "DevTestLinuxVirtualMachineGalleryImageReference",
    "DevTestLinuxVirtualMachineInboundNatRule",
    "DevTestLinuxVirtualMachineTimeouts",
    "DevTestPolicy",
    "DevTestPolicyConfig",
    "DevTestPolicyTimeouts",
    "DevTestSchedule",
    "DevTestScheduleConfig",
    "DevTestScheduleDailyRecurrence",
    "DevTestScheduleHourlyRecurrence",
    "DevTestScheduleNotificationSettings",
    "DevTestScheduleTimeouts",
    "DevTestScheduleWeeklyRecurrence",
    "DevTestVirtualNetwork",
    "DevTestVirtualNetworkConfig",
    "DevTestVirtualNetworkSubnet",
    "DevTestVirtualNetworkTimeouts",
    "DevTestWindowsVirtualMachine",
    "DevTestWindowsVirtualMachineConfig",
    "DevTestWindowsVirtualMachineGalleryImageReference",
    "DevTestWindowsVirtualMachineInboundNatRule",
    "DevTestWindowsVirtualMachineTimeouts",
    "DevspaceController",
    "DevspaceControllerConfig",
    "DevspaceControllerTimeouts",
    "DigitalTwinsEndpointEventgrid",
    "DigitalTwinsEndpointEventgridConfig",
    "DigitalTwinsEndpointEventgridTimeouts",
    "DigitalTwinsEndpointEventhub",
    "DigitalTwinsEndpointEventhubConfig",
    "DigitalTwinsEndpointEventhubTimeouts",
    "DigitalTwinsEndpointServicebus",
    "DigitalTwinsEndpointServicebusConfig",
    "DigitalTwinsEndpointServicebusTimeouts",
    "DigitalTwinsInstance",
    "DigitalTwinsInstanceConfig",
    "DigitalTwinsInstanceTimeouts",
    "DiskEncryptionSet",
    "DiskEncryptionSetConfig",
    "DiskEncryptionSetIdentity",
    "DiskEncryptionSetTimeouts",
    "DnsARecord",
    "DnsARecordConfig",
    "DnsARecordTimeouts",
    "DnsAaaaRecord",
    "DnsAaaaRecordConfig",
    "DnsAaaaRecordTimeouts",
    "DnsCaaRecord",
    "DnsCaaRecordConfig",
    "DnsCaaRecordRecord",
    "DnsCaaRecordTimeouts",
    "DnsCnameRecord",
    "DnsCnameRecordConfig",
    "DnsCnameRecordTimeouts",
    "DnsMxRecord",
    "DnsMxRecordConfig",
    "DnsMxRecordRecord",
    "DnsMxRecordTimeouts",
    "DnsNsRecord",
    "DnsNsRecordConfig",
    "DnsNsRecordTimeouts",
    "DnsPtrRecord",
    "DnsPtrRecordConfig",
    "DnsPtrRecordTimeouts",
    "DnsSrvRecord",
    "DnsSrvRecordConfig",
    "DnsSrvRecordRecord",
    "DnsSrvRecordTimeouts",
    "DnsTxtRecord",
    "DnsTxtRecordConfig",
    "DnsTxtRecordRecord",
    "DnsTxtRecordTimeouts",
    "DnsZone",
    "DnsZoneConfig",
    "DnsZoneSoaRecord",
    "DnsZoneTimeouts",
    "EventgridDomain",
    "EventgridDomainConfig",
    "EventgridDomainInputMappingDefaultValues",
    "EventgridDomainInputMappingFields",
    "EventgridDomainTimeouts",
    "EventgridDomainTopic",
    "EventgridDomainTopicConfig",
    "EventgridDomainTopicTimeouts",
    "EventgridEventSubscription",
    "EventgridEventSubscriptionAdvancedFilter",
    "EventgridEventSubscriptionAdvancedFilterBoolEquals",
    "EventgridEventSubscriptionAdvancedFilterNumberGreaterThan",
    "EventgridEventSubscriptionAdvancedFilterNumberGreaterThanOrEquals",
    "EventgridEventSubscriptionAdvancedFilterNumberIn",
    "EventgridEventSubscriptionAdvancedFilterNumberLessThan",
    "EventgridEventSubscriptionAdvancedFilterNumberLessThanOrEquals",
    "EventgridEventSubscriptionAdvancedFilterNumberNotIn",
    "EventgridEventSubscriptionAdvancedFilterStringBeginsWith",
    "EventgridEventSubscriptionAdvancedFilterStringContains",
    "EventgridEventSubscriptionAdvancedFilterStringEndsWith",
    "EventgridEventSubscriptionAdvancedFilterStringIn",
    "EventgridEventSubscriptionAdvancedFilterStringNotIn",
    "EventgridEventSubscriptionAzureFunctionEndpoint",
    "EventgridEventSubscriptionConfig",
    "EventgridEventSubscriptionEventhubEndpoint",
    "EventgridEventSubscriptionHybridConnectionEndpoint",
    "EventgridEventSubscriptionRetryPolicy",
    "EventgridEventSubscriptionStorageBlobDeadLetterDestination",
    "EventgridEventSubscriptionStorageQueueEndpoint",
    "EventgridEventSubscriptionSubjectFilter",
    "EventgridEventSubscriptionTimeouts",
    "EventgridEventSubscriptionWebhookEndpoint",
    "EventgridSystemTopic",
    "EventgridSystemTopicConfig",
    "EventgridSystemTopicTimeouts",
    "EventgridTopic",
    "EventgridTopicConfig",
    "EventgridTopicInputMappingDefaultValues",
    "EventgridTopicInputMappingFields",
    "EventgridTopicTimeouts",
    "Eventhub",
    "EventhubAuthorizationRule",
    "EventhubAuthorizationRuleConfig",
    "EventhubAuthorizationRuleTimeouts",
    "EventhubCaptureDescription",
    "EventhubCaptureDescriptionDestination",
    "EventhubCluster",
    "EventhubClusterConfig",
    "EventhubClusterTimeouts",
    "EventhubConfig",
    "EventhubConsumerGroup",
    "EventhubConsumerGroupConfig",
    "EventhubConsumerGroupTimeouts",
    "EventhubNamespace",
    "EventhubNamespaceAuthorizationRule",
    "EventhubNamespaceAuthorizationRuleConfig",
    "EventhubNamespaceAuthorizationRuleTimeouts",
    "EventhubNamespaceConfig",
    "EventhubNamespaceDisasterRecoveryConfig",
    "EventhubNamespaceDisasterRecoveryConfigConfig",
    "EventhubNamespaceDisasterRecoveryConfigTimeouts",
    "EventhubNamespaceIdentity",
    "EventhubNamespaceNetworkRulesets",
    "EventhubNamespaceNetworkRulesetsIpRule",
    "EventhubNamespaceNetworkRulesetsVirtualNetworkRule",
    "EventhubNamespaceTimeouts",
    "EventhubTimeouts",
    "ExpressRouteCircuit",
    "ExpressRouteCircuitAuthorization",
    "ExpressRouteCircuitAuthorizationConfig",
    "ExpressRouteCircuitAuthorizationTimeouts",
    "ExpressRouteCircuitConfig",
    "ExpressRouteCircuitPeering",
    "ExpressRouteCircuitPeeringConfig",
    "ExpressRouteCircuitPeeringIpv6",
    "ExpressRouteCircuitPeeringIpv6MicrosoftPeering",
    "ExpressRouteCircuitPeeringMicrosoftPeeringConfig",
    "ExpressRouteCircuitPeeringTimeouts",
    "ExpressRouteCircuitSku",
    "ExpressRouteCircuitTimeouts",
    "ExpressRouteGateway",
    "ExpressRouteGatewayConfig",
    "ExpressRouteGatewayTimeouts",
    "Firewall",
    "FirewallApplicationRuleCollection",
    "FirewallApplicationRuleCollectionConfig",
    "FirewallApplicationRuleCollectionRule",
    "FirewallApplicationRuleCollectionRuleProtocol",
    "FirewallApplicationRuleCollectionTimeouts",
    "FirewallConfig",
    "FirewallIpConfiguration",
    "FirewallManagementIpConfiguration",
    "FirewallNatRuleCollection",
    "FirewallNatRuleCollectionConfig",
    "FirewallNatRuleCollectionRule",
    "FirewallNatRuleCollectionTimeouts",
    "FirewallNetworkRuleCollection",
    "FirewallNetworkRuleCollectionConfig",
    "FirewallNetworkRuleCollectionRule",
    "FirewallNetworkRuleCollectionTimeouts",
    "FirewallPolicy",
    "FirewallPolicyConfig",
    "FirewallPolicyDns",
    "FirewallPolicyRuleCollectionGroup",
    "FirewallPolicyRuleCollectionGroupApplicationRuleCollection",
    "FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRule",
    "FirewallPolicyRuleCollectionGroupApplicationRuleCollectionRuleProtocols",
    "FirewallPolicyRuleCollectionGroupConfig",
    "FirewallPolicyRuleCollectionGroupNatRuleCollection",
    "FirewallPolicyRuleCollectionGroupNatRuleCollectionRule",
    "FirewallPolicyRuleCollectionGroupNetworkRuleCollection",
    "FirewallPolicyRuleCollectionGroupNetworkRuleCollectionRule",
    "FirewallPolicyRuleCollectionGroupTimeouts",
    "FirewallPolicyThreatIntelligenceAllowlist",
    "FirewallPolicyTimeouts",
    "FirewallTimeouts",
    "FirewallVirtualHub",
    "Frontdoor",
    "FrontdoorBackendPool",
    "FrontdoorBackendPoolBackend",
    "FrontdoorBackendPoolHealthProbe",
    "FrontdoorBackendPoolLoadBalancing",
    "FrontdoorConfig",
    "FrontdoorCustomHttpsConfiguration",
    "FrontdoorCustomHttpsConfigurationConfig",
    "FrontdoorCustomHttpsConfigurationCustomHttpsConfiguration",
    "FrontdoorCustomHttpsConfigurationTimeouts",
    "FrontdoorFirewallPolicy",
    "FrontdoorFirewallPolicyConfig",
    "FrontdoorFirewallPolicyCustomRule",
    "FrontdoorFirewallPolicyCustomRuleMatchCondition",
    "FrontdoorFirewallPolicyManagedRule",
    "FrontdoorFirewallPolicyManagedRuleExclusion",
    "FrontdoorFirewallPolicyManagedRuleOverride",
    "FrontdoorFirewallPolicyManagedRuleOverrideExclusion",
    "FrontdoorFirewallPolicyManagedRuleOverrideRule",
    "FrontdoorFirewallPolicyManagedRuleOverrideRuleExclusion",
    "FrontdoorFirewallPolicyTimeouts",
    "FrontdoorFrontendEndpoint",
    "FrontdoorFrontendEndpointCustomHttpsConfiguration",
    "FrontdoorRoutingRule",
    "FrontdoorRoutingRuleForwardingConfiguration",
    "FrontdoorRoutingRuleRedirectConfiguration",
    "FrontdoorTimeouts",
    "FunctionApp",
    "FunctionAppAuthSettings",
    "FunctionAppAuthSettingsActiveDirectory",
    "FunctionAppAuthSettingsFacebook",
    "FunctionAppAuthSettingsGoogle",
    "FunctionAppAuthSettingsMicrosoft",
    "FunctionAppAuthSettingsTwitter",
    "FunctionAppConfig",
    "FunctionAppConnectionString",
    "FunctionAppIdentity",
    "FunctionAppSiteConfig",
    "FunctionAppSiteConfigCors",
    "FunctionAppSiteConfigIpRestriction",
    "FunctionAppSiteConfigScmIpRestriction",
    "FunctionAppSiteCredential",
    "FunctionAppSlot",
    "FunctionAppSlotAuthSettings",
    "FunctionAppSlotAuthSettingsActiveDirectory",
    "FunctionAppSlotAuthSettingsFacebook",
    "FunctionAppSlotAuthSettingsGoogle",
    "FunctionAppSlotAuthSettingsMicrosoft",
    "FunctionAppSlotAuthSettingsTwitter",
    "FunctionAppSlotConfig",
    "FunctionAppSlotConnectionString",
    "FunctionAppSlotIdentity",
    "FunctionAppSlotSiteConfig",
    "FunctionAppSlotSiteConfigCors",
    "FunctionAppSlotSiteConfigIpRestriction",
    "FunctionAppSlotSiteConfigScmIpRestriction",
    "FunctionAppSlotSiteCredential",
    "FunctionAppSlotTimeouts",
    "FunctionAppSourceControl",
    "FunctionAppTimeouts",
    "HdinsightHadoopCluster",
    "HdinsightHadoopClusterComponentVersion",
    "HdinsightHadoopClusterConfig",
    "HdinsightHadoopClusterGateway",
    "HdinsightHadoopClusterMetastores",
    "HdinsightHadoopClusterMetastoresAmbari",
    "HdinsightHadoopClusterMetastoresHive",
    "HdinsightHadoopClusterMetastoresOozie",
    "HdinsightHadoopClusterMonitor",
    "HdinsightHadoopClusterRoles",
    "HdinsightHadoopClusterRolesEdgeNode",
    "HdinsightHadoopClusterRolesEdgeNodeInstallScriptAction",
    "HdinsightHadoopClusterRolesHeadNode",
    "HdinsightHadoopClusterRolesWorkerNode",
    "HdinsightHadoopClusterRolesZookeeperNode",
    "HdinsightHadoopClusterStorageAccount",
    "HdinsightHadoopClusterStorageAccountGen2",
    "HdinsightHadoopClusterTimeouts",
    "HdinsightHbaseCluster",
    "HdinsightHbaseClusterComponentVersion",
    "HdinsightHbaseClusterConfig",
    "HdinsightHbaseClusterGateway",
    "HdinsightHbaseClusterMetastores",
    "HdinsightHbaseClusterMetastoresAmbari",
    "HdinsightHbaseClusterMetastoresHive",
    "HdinsightHbaseClusterMetastoresOozie",
    "HdinsightHbaseClusterMonitor",
    "HdinsightHbaseClusterRoles",
    "HdinsightHbaseClusterRolesHeadNode",
    "HdinsightHbaseClusterRolesWorkerNode",
    "HdinsightHbaseClusterRolesZookeeperNode",
    "HdinsightHbaseClusterStorageAccount",
    "HdinsightHbaseClusterStorageAccountGen2",
    "HdinsightHbaseClusterTimeouts",
    "HdinsightInteractiveQueryCluster",
    "HdinsightInteractiveQueryClusterComponentVersion",
    "HdinsightInteractiveQueryClusterConfig",
    "HdinsightInteractiveQueryClusterGateway",
    "HdinsightInteractiveQueryClusterMetastores",
    "HdinsightInteractiveQueryClusterMetastoresAmbari",
    "HdinsightInteractiveQueryClusterMetastoresHive",
    "HdinsightInteractiveQueryClusterMetastoresOozie",
    "HdinsightInteractiveQueryClusterMonitor",
    "HdinsightInteractiveQueryClusterRoles",
    "HdinsightInteractiveQueryClusterRolesHeadNode",
    "HdinsightInteractiveQueryClusterRolesWorkerNode",
    "HdinsightInteractiveQueryClusterRolesZookeeperNode",
    "HdinsightInteractiveQueryClusterStorageAccount",
    "HdinsightInteractiveQueryClusterStorageAccountGen2",
    "HdinsightInteractiveQueryClusterTimeouts",
    "HdinsightKafkaCluster",
    "HdinsightKafkaClusterComponentVersion",
    "HdinsightKafkaClusterConfig",
    "HdinsightKafkaClusterGateway",
    "HdinsightKafkaClusterMetastores",
    "HdinsightKafkaClusterMetastoresAmbari",
    "HdinsightKafkaClusterMetastoresHive",
    "HdinsightKafkaClusterMetastoresOozie",
    "HdinsightKafkaClusterMonitor",
    "HdinsightKafkaClusterRoles",
    "HdinsightKafkaClusterRolesHeadNode",
    "HdinsightKafkaClusterRolesWorkerNode",
    "HdinsightKafkaClusterRolesZookeeperNode",
    "HdinsightKafkaClusterStorageAccount",
    "HdinsightKafkaClusterStorageAccountGen2",
    "HdinsightKafkaClusterTimeouts",
    "HdinsightMlServicesCluster",
    "HdinsightMlServicesClusterConfig",
    "HdinsightMlServicesClusterGateway",
    "HdinsightMlServicesClusterRoles",
    "HdinsightMlServicesClusterRolesEdgeNode",
    "HdinsightMlServicesClusterRolesHeadNode",
    "HdinsightMlServicesClusterRolesWorkerNode",
    "HdinsightMlServicesClusterRolesZookeeperNode",
    "HdinsightMlServicesClusterStorageAccount",
    "HdinsightMlServicesClusterTimeouts",
    "HdinsightRserverCluster",
    "HdinsightRserverClusterConfig",
    "HdinsightRserverClusterGateway",
    "HdinsightRserverClusterRoles",
    "HdinsightRserverClusterRolesEdgeNode",
    "HdinsightRserverClusterRolesHeadNode",
    "HdinsightRserverClusterRolesWorkerNode",
    "HdinsightRserverClusterRolesZookeeperNode",
    "HdinsightRserverClusterStorageAccount",
    "HdinsightRserverClusterTimeouts",
    "HdinsightSparkCluster",
    "HdinsightSparkClusterComponentVersion",
    "HdinsightSparkClusterConfig",
    "HdinsightSparkClusterGateway",
    "HdinsightSparkClusterMetastores",
    "HdinsightSparkClusterMetastoresAmbari",
    "HdinsightSparkClusterMetastoresHive",
    "HdinsightSparkClusterMetastoresOozie",
    "HdinsightSparkClusterMonitor",
    "HdinsightSparkClusterRoles",
    "HdinsightSparkClusterRolesHeadNode",
    "HdinsightSparkClusterRolesWorkerNode",
    "HdinsightSparkClusterRolesZookeeperNode",
    "HdinsightSparkClusterStorageAccount",
    "HdinsightSparkClusterStorageAccountGen2",
    "HdinsightSparkClusterTimeouts",
    "HdinsightStormCluster",
    "HdinsightStormClusterComponentVersion",
    "HdinsightStormClusterConfig",
    "HdinsightStormClusterGateway",
    "HdinsightStormClusterMetastores",
    "HdinsightStormClusterMetastoresAmbari",
    "HdinsightStormClusterMetastoresHive",
    "HdinsightStormClusterMetastoresOozie",
    "HdinsightStormClusterMonitor",
    "HdinsightStormClusterRoles",
    "HdinsightStormClusterRolesHeadNode",
    "HdinsightStormClusterRolesWorkerNode",
    "HdinsightStormClusterRolesZookeeperNode",
    "HdinsightStormClusterStorageAccount",
    "HdinsightStormClusterTimeouts",
    "HealthcareService",
    "HealthcareServiceAuthenticationConfiguration",
    "HealthcareServiceConfig",
    "HealthcareServiceCorsConfiguration",
    "HealthcareServiceTimeouts",
    "HpcCache",
    "HpcCacheBlobTarget",
    "HpcCacheBlobTargetConfig",
    "HpcCacheBlobTargetTimeouts",
    "HpcCacheConfig",
    "HpcCacheNfsTarget",
    "HpcCacheNfsTargetConfig",
    "HpcCacheNfsTargetNamespaceJunction",
    "HpcCacheNfsTargetTimeouts",
    "HpcCacheTimeouts",
    "Image",
    "ImageConfig",
    "ImageDataDisk",
    "ImageOsDisk",
    "ImageTimeouts",
    "IntegrationServiceEnvironment",
    "IntegrationServiceEnvironmentConfig",
    "IntegrationServiceEnvironmentTimeouts",
    "IotTimeSeriesInsightsAccessPolicy",
    "IotTimeSeriesInsightsAccessPolicyConfig",
    "IotTimeSeriesInsightsAccessPolicyTimeouts",
    "IotTimeSeriesInsightsGen2Environment",
    "IotTimeSeriesInsightsGen2EnvironmentConfig",
    "IotTimeSeriesInsightsGen2EnvironmentStorage",
    "IotTimeSeriesInsightsGen2EnvironmentTimeouts",
    "IotTimeSeriesInsightsReferenceDataSet",
    "IotTimeSeriesInsightsReferenceDataSetConfig",
    "IotTimeSeriesInsightsReferenceDataSetKeyProperty",
    "IotTimeSeriesInsightsReferenceDataSetTimeouts",
    "IotTimeSeriesInsightsStandardEnvironment",
    "IotTimeSeriesInsightsStandardEnvironmentConfig",
    "IotTimeSeriesInsightsStandardEnvironmentTimeouts",
    "IotcentralApplication",
    "IotcentralApplicationConfig",
    "IotcentralApplicationTimeouts",
    "Iothub",
    "IothubConfig",
    "IothubConsumerGroup",
    "IothubConsumerGroupConfig",
    "IothubConsumerGroupTimeouts",
    "IothubDps",
    "IothubDpsCertificate",
    "IothubDpsCertificateConfig",
    "IothubDpsCertificateTimeouts",
    "IothubDpsConfig",
    "IothubDpsLinkedHub",
    "IothubDpsSharedAccessPolicy",
    "IothubDpsSharedAccessPolicyConfig",
    "IothubDpsSharedAccessPolicyTimeouts",
    "IothubDpsSku",
    "IothubDpsTimeouts",
    "IothubEndpoint",
    "IothubEndpointEventhub",
    "IothubEndpointEventhubConfig",
    "IothubEndpointEventhubTimeouts",
    "IothubEndpointServicebusQueue",
    "IothubEndpointServicebusQueueConfig",
    "IothubEndpointServicebusQueueTimeouts",
    "IothubEndpointServicebusTopic",
    "IothubEndpointServicebusTopicConfig",
    "IothubEndpointServicebusTopicTimeouts",
    "IothubEndpointStorageContainer",
    "IothubEndpointStorageContainerConfig",
    "IothubEndpointStorageContainerTimeouts",
    "IothubFallbackRoute",
    "IothubFallbackRouteA",
    "IothubFallbackRouteAConfig",
    "IothubFallbackRouteTimeouts",
    "IothubFileUpload",
    "IothubIpFilterRule",
    "IothubRoute",
    "IothubRouteA",
    "IothubRouteAConfig",
    "IothubRouteTimeouts",
    "IothubSharedAccessPolicy",
    "IothubSharedAccessPolicyA",
    "IothubSharedAccessPolicyAConfig",
    "IothubSharedAccessPolicyTimeouts",
    "IothubSku",
    "IothubTimeouts",
    "IpGroup",
    "IpGroupConfig",
    "IpGroupTimeouts",
    "KeyVault",
    "KeyVaultAccessPolicy",
    "KeyVaultAccessPolicyA",
    "KeyVaultAccessPolicyAConfig",
    "KeyVaultAccessPolicyTimeouts",
    "KeyVaultCertificate",
    "KeyVaultCertificateCertificate",
    "KeyVaultCertificateCertificateAttribute",
    "KeyVaultCertificateCertificatePolicy",
    "KeyVaultCertificateCertificatePolicyIssuerParameters",
    "KeyVaultCertificateCertificatePolicyKeyProperties",
    "KeyVaultCertificateCertificatePolicyLifetimeAction",
    "KeyVaultCertificateCertificatePolicyLifetimeActionAction",
    "KeyVaultCertificateCertificatePolicyLifetimeActionTrigger",
    "KeyVaultCertificateCertificatePolicySecretProperties",
    "KeyVaultCertificateCertificatePolicyX509CertificateProperties",
    "KeyVaultCertificateCertificatePolicyX509CertificatePropertiesSubjectAlternativeNames",
    "KeyVaultCertificateConfig",
    "KeyVaultCertificateIssuer",
    "KeyVaultCertificateIssuerAdmin",
    "KeyVaultCertificateIssuerConfig",
    "KeyVaultCertificateIssuerTimeouts",
    "KeyVaultCertificateTimeouts",
    "KeyVaultConfig",
    "KeyVaultContact",
    "KeyVaultKey",
    "KeyVaultKeyConfig",
    "KeyVaultKeyTimeouts",
    "KeyVaultNetworkAcls",
    "KeyVaultSecret",
    "KeyVaultSecretConfig",
    "KeyVaultSecretTimeouts",
    "KeyVaultTimeouts",
    "KubernetesCluster",
    "KubernetesClusterAddonProfile",
    "KubernetesClusterAddonProfileAciConnectorLinux",
    "KubernetesClusterAddonProfileAzurePolicy",
    "KubernetesClusterAddonProfileHttpApplicationRouting",
    "KubernetesClusterAddonProfileKubeDashboard",
    "KubernetesClusterAddonProfileOmsAgent",
    "KubernetesClusterAutoScalerProfile",
    "KubernetesClusterConfig",
    "KubernetesClusterDefaultNodePool",
    "KubernetesClusterIdentity",
    "KubernetesClusterKubeAdminConfig",
    "KubernetesClusterKubeConfig",
    "KubernetesClusterKubeletIdentity",
    "KubernetesClusterLinuxProfile",
    "KubernetesClusterLinuxProfileSshKey",
    "KubernetesClusterNetworkProfile",
    "KubernetesClusterNetworkProfileLoadBalancerProfile",
    "KubernetesClusterNodePool",
    "KubernetesClusterNodePoolConfig",
    "KubernetesClusterNodePoolTimeouts",
    "KubernetesClusterRoleBasedAccessControl",
    "KubernetesClusterRoleBasedAccessControlAzureActiveDirectory",
    "KubernetesClusterServicePrincipal",
    "KubernetesClusterTimeouts",
    "KubernetesClusterWindowsProfile",
    "KustoAttachedDatabaseConfiguration",
    "KustoAttachedDatabaseConfigurationConfig",
    "KustoAttachedDatabaseConfigurationTimeouts",
    "KustoCluster",
    "KustoClusterConfig",
    "KustoClusterCustomerManagedKey",
    "KustoClusterCustomerManagedKeyConfig",
    "KustoClusterCustomerManagedKeyTimeouts",
    "KustoClusterIdentity",
    "KustoClusterOptimizedAutoScale",
    "KustoClusterPrincipalAssignment",
    "KustoClusterPrincipalAssignmentConfig",
    "KustoClusterPrincipalAssignmentTimeouts",
    "KustoClusterSku",
    "KustoClusterTimeouts",
    "KustoClusterVirtualNetworkConfiguration",
    "KustoDatabase",
    "KustoDatabaseConfig",
    "KustoDatabasePrincipal",
    "KustoDatabasePrincipalAssignment",
    "KustoDatabasePrincipalAssignmentConfig",
    "KustoDatabasePrincipalAssignmentTimeouts",
    "KustoDatabasePrincipalConfig",
    "KustoDatabasePrincipalTimeouts",
    "KustoDatabaseTimeouts",
    "KustoEventhubDataConnection",
    "KustoEventhubDataConnectionConfig",
    "KustoEventhubDataConnectionTimeouts",
    "Lb",
    "LbBackendAddressPool",
    "LbBackendAddressPoolConfig",
    "LbBackendAddressPoolTimeouts",
    "LbConfig",
    "LbFrontendIpConfiguration",
    "LbNatPool",
    "LbNatPoolConfig",
    "LbNatPoolTimeouts",
    "LbNatRule",
    "LbNatRuleConfig",
    "LbNatRuleTimeouts",
    "LbOutboundRule",
    "LbOutboundRuleConfig",
    "LbOutboundRuleFrontendIpConfiguration",
    "LbOutboundRuleTimeouts",
    "LbProbe",
    "LbProbeConfig",
    "LbProbeTimeouts",
    "LbRule",
    "LbRuleConfig",
    "LbRuleTimeouts",
    "LbTimeouts",
    "LighthouseAssignment",
    "LighthouseAssignmentConfig",
    "LighthouseAssignmentTimeouts",
    "LighthouseDefinition",
    "LighthouseDefinitionAuthorization",
    "LighthouseDefinitionConfig",
    "LighthouseDefinitionTimeouts",
    "LinuxVirtualMachine",
    "LinuxVirtualMachineAdditionalCapabilities",
    "LinuxVirtualMachineAdminSshKey",
    "LinuxVirtualMachineBootDiagnostics",
    "LinuxVirtualMachineConfig",
    "LinuxVirtualMachineIdentity",
    "LinuxVirtualMachineOsDisk",
    "LinuxVirtualMachineOsDiskDiffDiskSettings",
    "LinuxVirtualMachinePlan",
    "LinuxVirtualMachineScaleSet",
    "LinuxVirtualMachineScaleSetAdditionalCapabilities",
    "LinuxVirtualMachineScaleSetAdminSshKey",
    "LinuxVirtualMachineScaleSetAutomaticInstanceRepair",
    "LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicy",
    "LinuxVirtualMachineScaleSetBootDiagnostics",
    "LinuxVirtualMachineScaleSetConfig",
    "LinuxVirtualMachineScaleSetDataDisk",
    "LinuxVirtualMachineScaleSetExtension",
    "LinuxVirtualMachineScaleSetIdentity",
    "LinuxVirtualMachineScaleSetNetworkInterface",
    "LinuxVirtualMachineScaleSetNetworkInterfaceIpConfiguration",
    "LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress",
    "LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag",
    "LinuxVirtualMachineScaleSetOsDisk",
    "LinuxVirtualMachineScaleSetOsDiskDiffDiskSettings",
    "LinuxVirtualMachineScaleSetPlan",
    "LinuxVirtualMachineScaleSetRollingUpgradePolicy",
    "LinuxVirtualMachineScaleSetSecret",
    "LinuxVirtualMachineScaleSetSecretCertificate",
    "LinuxVirtualMachineScaleSetSourceImageReference",
    "LinuxVirtualMachineScaleSetTerminateNotification",
    "LinuxVirtualMachineScaleSetTimeouts",
    "LinuxVirtualMachineSecret",
    "LinuxVirtualMachineSecretCertificate",
    "LinuxVirtualMachineSourceImageReference",
    "LinuxVirtualMachineTimeouts",
    "LocalNetworkGateway",
    "LocalNetworkGatewayBgpSettings",
    "LocalNetworkGatewayConfig",
    "LocalNetworkGatewayTimeouts",
    "LogAnalyticsCluster",
    "LogAnalyticsClusterConfig",
    "LogAnalyticsClusterCustomerManagedKey",
    "LogAnalyticsClusterCustomerManagedKeyConfig",
    "LogAnalyticsClusterCustomerManagedKeyTimeouts",
    "LogAnalyticsClusterIdentity",
    "LogAnalyticsClusterTimeouts",
    "LogAnalyticsDataExportRule",
    "LogAnalyticsDataExportRuleConfig",
    "LogAnalyticsDataExportRuleTimeouts",
    "LogAnalyticsDatasourceWindowsEvent",
    "LogAnalyticsDatasourceWindowsEventConfig",
    "LogAnalyticsDatasourceWindowsEventTimeouts",
    "LogAnalyticsDatasourceWindowsPerformanceCounter",
    "LogAnalyticsDatasourceWindowsPerformanceCounterConfig",
    "LogAnalyticsDatasourceWindowsPerformanceCounterTimeouts",
    "LogAnalyticsLinkedService",
    "LogAnalyticsLinkedServiceConfig",
    "LogAnalyticsLinkedServiceTimeouts",
    "LogAnalyticsLinkedStorageAccount",
    "LogAnalyticsLinkedStorageAccountConfig",
    "LogAnalyticsLinkedStorageAccountTimeouts",
    "LogAnalyticsSavedSearch",
    "LogAnalyticsSavedSearchConfig",
    "LogAnalyticsSavedSearchTimeouts",
    "LogAnalyticsSolution",
    "LogAnalyticsSolutionConfig",
    "LogAnalyticsSolutionPlan",
    "LogAnalyticsSolutionTimeouts",
    "LogAnalyticsStorageInsights",
    "LogAnalyticsStorageInsightsConfig",
    "LogAnalyticsStorageInsightsTimeouts",
    "LogAnalyticsWorkspace",
    "LogAnalyticsWorkspaceConfig",
    "LogAnalyticsWorkspaceTimeouts",
    "LogicAppActionCustom",
    "LogicAppActionCustomConfig",
    "LogicAppActionCustomTimeouts",
    "LogicAppActionHttp",
    "LogicAppActionHttpConfig",
    "LogicAppActionHttpRunAfter",
    "LogicAppActionHttpTimeouts",
    "LogicAppIntegrationAccount",
    "LogicAppIntegrationAccountConfig",
    "LogicAppIntegrationAccountTimeouts",
    "LogicAppTriggerCustom",
    "LogicAppTriggerCustomConfig",
    "LogicAppTriggerCustomTimeouts",
    "LogicAppTriggerHttpRequest",
    "LogicAppTriggerHttpRequestConfig",
    "LogicAppTriggerHttpRequestTimeouts",
    "LogicAppTriggerRecurrence",
    "LogicAppTriggerRecurrenceConfig",
    "LogicAppTriggerRecurrenceTimeouts",
    "LogicAppWorkflow",
    "LogicAppWorkflowConfig",
    "LogicAppWorkflowTimeouts",
    "MachineLearningWorkspace",
    "MachineLearningWorkspaceConfig",
    "MachineLearningWorkspaceIdentity",
    "MachineLearningWorkspaceTimeouts",
    "MaintenanceAssignmentDedicatedHost",
    "MaintenanceAssignmentDedicatedHostConfig",
    "MaintenanceAssignmentDedicatedHostTimeouts",
    "MaintenanceAssignmentVirtualMachine",
    "MaintenanceAssignmentVirtualMachineConfig",
    "MaintenanceAssignmentVirtualMachineTimeouts",
    "MaintenanceConfiguration",
    "MaintenanceConfigurationConfig",
    "MaintenanceConfigurationTimeouts",
    "ManagedApplication",
    "ManagedApplicationConfig",
    "ManagedApplicationDefinition",
    "ManagedApplicationDefinitionAuthorization",
    "ManagedApplicationDefinitionConfig",
    "ManagedApplicationDefinitionTimeouts",
    "ManagedApplicationPlan",
    "ManagedApplicationTimeouts",
    "ManagedDisk",
    "ManagedDiskConfig",
    "ManagedDiskEncryptionSettings",
    "ManagedDiskEncryptionSettingsDiskEncryptionKey",
    "ManagedDiskEncryptionSettingsKeyEncryptionKey",
    "ManagedDiskTimeouts",
    "ManagementGroup",
    "ManagementGroupConfig",
    "ManagementGroupTimeouts",
    "ManagementLock",
    "ManagementLockConfig",
    "ManagementLockTimeouts",
    "MapsAccount",
    "MapsAccountConfig",
    "MapsAccountTimeouts",
    "MariadbConfiguration",
    "MariadbConfigurationConfig",
    "MariadbConfigurationTimeouts",
    "MariadbDatabase",
    "MariadbDatabaseConfig",
    "MariadbDatabaseTimeouts",
    "MariadbFirewallRule",
    "MariadbFirewallRuleConfig",
    "MariadbFirewallRuleTimeouts",
    "MariadbServer",
    "MariadbServerConfig",
    "MariadbServerStorageProfile",
    "MariadbServerTimeouts",
    "MariadbVirtualNetworkRule",
    "MariadbVirtualNetworkRuleConfig",
    "MariadbVirtualNetworkRuleTimeouts",
    "MarketplaceAgreement",
    "MarketplaceAgreementConfig",
    "MarketplaceAgreementTimeouts",
    "MediaAsset",
    "MediaAssetConfig",
    "MediaAssetTimeouts",
    "MediaServicesAccount",
    "MediaServicesAccountConfig",
    "MediaServicesAccountIdentity",
    "MediaServicesAccountStorageAccount",
    "MediaServicesAccountTimeouts",
    "MediaTransform",
    "MediaTransformConfig",
    "MediaTransformOutput",
    "MediaTransformOutputAudioAnalyzerPreset",
    "MediaTransformOutputBuiltinPreset",
    "MediaTransformOutputFaceDetectorPreset",
    "MediaTransformOutputVideoAnalyzerPreset",
    "MediaTransformTimeouts",
    "MonitorActionGroup",
    "MonitorActionGroupArmRoleReceiver",
    "MonitorActionGroupAutomationRunbookReceiver",
    "MonitorActionGroupAzureAppPushReceiver",
    "MonitorActionGroupAzureFunctionReceiver",
    "MonitorActionGroupConfig",
    "MonitorActionGroupEmailReceiver",
    "MonitorActionGroupItsmReceiver",
    "MonitorActionGroupLogicAppReceiver",
    "MonitorActionGroupSmsReceiver",
    "MonitorActionGroupTimeouts",
    "MonitorActionGroupVoiceReceiver",
    "MonitorActionGroupWebhookReceiver",
    "MonitorActionRuleActionGroup",
    "MonitorActionRuleActionGroupCondition",
    "MonitorActionRuleActionGroupConditionAlertContext",
    "MonitorActionRuleActionGroupConditionAlertRuleId",
    "MonitorActionRuleActionGroupConditionDescription",
    "MonitorActionRuleActionGroupConditionMonitor",
    "MonitorActionRuleActionGroupConditionMonitorService",
    "MonitorActionRuleActionGroupConditionSeverity",
    "MonitorActionRuleActionGroupConditionTargetResourceType",
    "MonitorActionRuleActionGroupConfig",
    "MonitorActionRuleActionGroupScope",
    "MonitorActionRuleActionGroupTimeouts",
    "MonitorActionRuleSuppression",
    "MonitorActionRuleSuppressionCondition",
    "MonitorActionRuleSuppressionConditionAlertContext",
    "MonitorActionRuleSuppressionConditionAlertRuleId",
    "MonitorActionRuleSuppressionConditionDescription",
    "MonitorActionRuleSuppressionConditionMonitor",
    "MonitorActionRuleSuppressionConditionMonitorService",
    "MonitorActionRuleSuppressionConditionSeverity",
    "MonitorActionRuleSuppressionConditionTargetResourceType",
    "MonitorActionRuleSuppressionConfig",
    "MonitorActionRuleSuppressionScope",
    "MonitorActionRuleSuppressionSuppression",
    "MonitorActionRuleSuppressionSuppressionSchedule",
    "MonitorActionRuleSuppressionTimeouts",
    "MonitorActivityLogAlert",
    "MonitorActivityLogAlertAction",
    "MonitorActivityLogAlertConfig",
    "MonitorActivityLogAlertCriteria",
    "MonitorActivityLogAlertTimeouts",
    "MonitorAutoscaleSetting",
    "MonitorAutoscaleSettingConfig",
    "MonitorAutoscaleSettingNotification",
    "MonitorAutoscaleSettingNotificationEmail",
    "MonitorAutoscaleSettingNotificationWebhook",
    "MonitorAutoscaleSettingProfile",
    "MonitorAutoscaleSettingProfileCapacity",
    "MonitorAutoscaleSettingProfileFixedDate",
    "MonitorAutoscaleSettingProfileRecurrence",
    "MonitorAutoscaleSettingProfileRule",
    "MonitorAutoscaleSettingProfileRuleMetricTrigger",
    "MonitorAutoscaleSettingProfileRuleScaleAction",
    "MonitorAutoscaleSettingTimeouts",
    "MonitorDiagnosticSetting",
    "MonitorDiagnosticSettingConfig",
    "MonitorDiagnosticSettingLog",
    "MonitorDiagnosticSettingLogRetentionPolicy",
    "MonitorDiagnosticSettingMetric",
    "MonitorDiagnosticSettingMetricRetentionPolicy",
    "MonitorDiagnosticSettingTimeouts",
    "MonitorLogProfile",
    "MonitorLogProfileConfig",
    "MonitorLogProfileRetentionPolicy",
    "MonitorLogProfileTimeouts",
    "MonitorMetricAlert",
    "MonitorMetricAlertAction",
    "MonitorMetricAlertApplicationInsightsWebTestLocationAvailabilityCriteria",
    "MonitorMetricAlertConfig",
    "MonitorMetricAlertCriteria",
    "MonitorMetricAlertCriteriaDimension",
    "MonitorMetricAlertDynamicCriteria",
    "MonitorMetricAlertDynamicCriteriaDimension",
    "MonitorMetricAlertTimeouts",
    "MonitorScheduledQueryRulesAlert",
    "MonitorScheduledQueryRulesAlertAction",
    "MonitorScheduledQueryRulesAlertConfig",
    "MonitorScheduledQueryRulesAlertTimeouts",
    "MonitorScheduledQueryRulesAlertTrigger",
    "MonitorScheduledQueryRulesAlertTriggerMetricTrigger",
    "MonitorScheduledQueryRulesLog",
    "MonitorScheduledQueryRulesLogConfig",
    "MonitorScheduledQueryRulesLogCriteria",
    "MonitorScheduledQueryRulesLogCriteriaDimension",
    "MonitorScheduledQueryRulesLogTimeouts",
    "MonitorSmartDetectorAlertRule",
    "MonitorSmartDetectorAlertRuleActionGroup",
    "MonitorSmartDetectorAlertRuleConfig",
    "MonitorSmartDetectorAlertRuleTimeouts",
    "MssqlDatabase",
    "MssqlDatabaseConfig",
    "MssqlDatabaseExtendedAuditingPolicy",
    "MssqlDatabaseExtendedAuditingPolicyA",
    "MssqlDatabaseExtendedAuditingPolicyAConfig",
    "MssqlDatabaseExtendedAuditingPolicyTimeouts",
    "MssqlDatabaseLongTermRetentionPolicy",
    "MssqlDatabaseShortTermRetentionPolicy",
    "MssqlDatabaseThreatDetectionPolicy",
    "MssqlDatabaseTimeouts",
    "MssqlDatabaseVulnerabilityAssessmentRuleBaseline",
    "MssqlDatabaseVulnerabilityAssessmentRuleBaselineBaselineResult",
    "MssqlDatabaseVulnerabilityAssessmentRuleBaselineConfig",
    "MssqlDatabaseVulnerabilityAssessmentRuleBaselineTimeouts",
    "MssqlElasticpool",
    "MssqlElasticpoolConfig",
    "MssqlElasticpoolPerDatabaseSettings",
    "MssqlElasticpoolSku",
    "MssqlElasticpoolTimeouts",
    "MssqlServer",
    "MssqlServerAzureadAdministrator",
    "MssqlServerConfig",
    "MssqlServerExtendedAuditingPolicy",
    "MssqlServerExtendedAuditingPolicyA",
    "MssqlServerExtendedAuditingPolicyAConfig",
    "MssqlServerExtendedAuditingPolicyTimeouts",
    "MssqlServerIdentity",
    "MssqlServerSecurityAlertPolicy",
    "MssqlServerSecurityAlertPolicyConfig",
    "MssqlServerSecurityAlertPolicyTimeouts",
    "MssqlServerTimeouts",
    "MssqlServerVulnerabilityAssessment",
    "MssqlServerVulnerabilityAssessmentConfig",
    "MssqlServerVulnerabilityAssessmentRecurringScans",
    "MssqlServerVulnerabilityAssessmentTimeouts",
    "MssqlVirtualMachine",
    "MssqlVirtualMachineAutoPatching",
    "MssqlVirtualMachineConfig",
    "MssqlVirtualMachineKeyVaultCredential",
    "MssqlVirtualMachineStorageConfiguration",
    "MssqlVirtualMachineStorageConfigurationDataSettings",
    "MssqlVirtualMachineStorageConfigurationLogSettings",
    "MssqlVirtualMachineStorageConfigurationTempDbSettings",
    "MssqlVirtualMachineTimeouts",
    "MysqlActiveDirectoryAdministrator",
    "MysqlActiveDirectoryAdministratorConfig",
    "MysqlActiveDirectoryAdministratorTimeouts",
    "MysqlConfiguration",
    "MysqlConfigurationConfig",
    "MysqlConfigurationTimeouts",
    "MysqlDatabase",
    "MysqlDatabaseConfig",
    "MysqlDatabaseTimeouts",
    "MysqlFirewallRule",
    "MysqlFirewallRuleConfig",
    "MysqlFirewallRuleTimeouts",
    "MysqlServer",
    "MysqlServerConfig",
    "MysqlServerIdentity",
    "MysqlServerKey",
    "MysqlServerKeyConfig",
    "MysqlServerKeyTimeouts",
    "MysqlServerStorageProfile",
    "MysqlServerThreatDetectionPolicy",
    "MysqlServerTimeouts",
    "MysqlVirtualNetworkRule",
    "MysqlVirtualNetworkRuleConfig",
    "MysqlVirtualNetworkRuleTimeouts",
    "NatGateway",
    "NatGatewayConfig",
    "NatGatewayPublicIpAssociation",
    "NatGatewayPublicIpAssociationConfig",
    "NatGatewayPublicIpAssociationTimeouts",
    "NatGatewayTimeouts",
    "NetappAccount",
    "NetappAccountActiveDirectory",
    "NetappAccountConfig",
    "NetappAccountTimeouts",
    "NetappPool",
    "NetappPoolConfig",
    "NetappPoolTimeouts",
    "NetappSnapshot",
    "NetappSnapshotConfig",
    "NetappSnapshotTimeouts",
    "NetappVolume",
    "NetappVolumeConfig",
    "NetappVolumeExportPolicyRule",
    "NetappVolumeTimeouts",
    "NetworkConnectionMonitor",
    "NetworkConnectionMonitorConfig",
    "NetworkConnectionMonitorDestination",
    "NetworkConnectionMonitorEndpoint",
    "NetworkConnectionMonitorEndpointFilter",
    "NetworkConnectionMonitorEndpointFilterItem",
    "NetworkConnectionMonitorSource",
    "NetworkConnectionMonitorTestConfiguration",
    "NetworkConnectionMonitorTestConfigurationHttpConfiguration",
    "NetworkConnectionMonitorTestConfigurationHttpConfigurationRequestHeader",
    "NetworkConnectionMonitorTestConfigurationIcmpConfiguration",
    "NetworkConnectionMonitorTestConfigurationSuccessThreshold",
    "NetworkConnectionMonitorTestConfigurationTcpConfiguration",
    "NetworkConnectionMonitorTestGroup",
    "NetworkConnectionMonitorTimeouts",
    "NetworkDdosProtectionPlan",
    "NetworkDdosProtectionPlanConfig",
    "NetworkDdosProtectionPlanTimeouts",
    "NetworkInterface",
    "NetworkInterfaceApplicationGatewayBackendAddressPoolAssociation",
    "NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationConfig",
    "NetworkInterfaceApplicationGatewayBackendAddressPoolAssociationTimeouts",
    "NetworkInterfaceApplicationSecurityGroupAssociation",
    "NetworkInterfaceApplicationSecurityGroupAssociationConfig",
    "NetworkInterfaceApplicationSecurityGroupAssociationTimeouts",
    "NetworkInterfaceBackendAddressPoolAssociation",
    "NetworkInterfaceBackendAddressPoolAssociationConfig",
    "NetworkInterfaceBackendAddressPoolAssociationTimeouts",
    "NetworkInterfaceConfig",
    "NetworkInterfaceIpConfiguration",
    "NetworkInterfaceNatRuleAssociation",
    "NetworkInterfaceNatRuleAssociationConfig",
    "NetworkInterfaceNatRuleAssociationTimeouts",
    "NetworkInterfaceSecurityGroupAssociation",
    "NetworkInterfaceSecurityGroupAssociationConfig",
    "NetworkInterfaceSecurityGroupAssociationTimeouts",
    "NetworkInterfaceTimeouts",
    "NetworkPacketCapture",
    "NetworkPacketCaptureConfig",
    "NetworkPacketCaptureFilter",
    "NetworkPacketCaptureStorageLocation",
    "NetworkPacketCaptureTimeouts",
    "NetworkProfile",
    "NetworkProfileConfig",
    "NetworkProfileContainerNetworkInterface",
    "NetworkProfileContainerNetworkInterfaceIpConfiguration",
    "NetworkProfileTimeouts",
    "NetworkSecurityGroup",
    "NetworkSecurityGroupConfig",
    "NetworkSecurityGroupSecurityRule",
    "NetworkSecurityGroupTimeouts",
    "NetworkSecurityRule",
    "NetworkSecurityRuleConfig",
    "NetworkSecurityRuleTimeouts",
    "NetworkWatcher",
    "NetworkWatcherConfig",
    "NetworkWatcherFlowLog",
    "NetworkWatcherFlowLogConfig",
    "NetworkWatcherFlowLogRetentionPolicy",
    "NetworkWatcherFlowLogTimeouts",
    "NetworkWatcherFlowLogTrafficAnalytics",
    "NetworkWatcherTimeouts",
    "NotificationHub",
    "NotificationHubApnsCredential",
    "NotificationHubAuthorizationRule",
    "NotificationHubAuthorizationRuleConfig",
    "NotificationHubAuthorizationRuleTimeouts",
    "NotificationHubConfig",
    "NotificationHubGcmCredential",
    "NotificationHubNamespace",
    "NotificationHubNamespaceConfig",
    "NotificationHubNamespaceTimeouts",
    "NotificationHubTimeouts",
    "OrchestratedVirtualMachineScaleSet",
    "OrchestratedVirtualMachineScaleSetConfig",
    "OrchestratedVirtualMachineScaleSetTimeouts",
    "PacketCapture",
    "PacketCaptureConfig",
    "PacketCaptureFilter",
    "PacketCaptureStorageLocation",
    "PacketCaptureTimeouts",
    "PointToSiteVpnGateway",
    "PointToSiteVpnGatewayConfig",
    "PointToSiteVpnGatewayConnectionConfiguration",
    "PointToSiteVpnGatewayConnectionConfigurationRoute",
    "PointToSiteVpnGatewayConnectionConfigurationRoutePropagatedRouteTable",
    "PointToSiteVpnGatewayConnectionConfigurationVpnClientAddressPool",
    "PointToSiteVpnGatewayTimeouts",
    "PolicyAssignment",
    "PolicyAssignmentConfig",
    "PolicyAssignmentIdentity",
    "PolicyAssignmentTimeouts",
    "PolicyDefinition",
    "PolicyDefinitionConfig",
    "PolicyDefinitionTimeouts",
    "PolicyRemediation",
    "PolicyRemediationConfig",
    "PolicyRemediationTimeouts",
    "PolicySetDefinition",
    "PolicySetDefinitionConfig",
    "PolicySetDefinitionPolicyDefinitionGroup",
    "PolicySetDefinitionPolicyDefinitionReference",
    "PolicySetDefinitionTimeouts",
    "PostgresqlActiveDirectoryAdministrator",
    "PostgresqlActiveDirectoryAdministratorConfig",
    "PostgresqlActiveDirectoryAdministratorTimeouts",
    "PostgresqlConfiguration",
    "PostgresqlConfigurationConfig",
    "PostgresqlConfigurationTimeouts",
    "PostgresqlDatabase",
    "PostgresqlDatabaseConfig",
    "PostgresqlDatabaseTimeouts",
    "PostgresqlFirewallRule",
    "PostgresqlFirewallRuleConfig",
    "PostgresqlFirewallRuleTimeouts",
    "PostgresqlServer",
    "PostgresqlServerConfig",
    "PostgresqlServerIdentity",
    "PostgresqlServerKey",
    "PostgresqlServerKeyConfig",
    "PostgresqlServerKeyTimeouts",
    "PostgresqlServerStorageProfile",
    "PostgresqlServerThreatDetectionPolicy",
    "PostgresqlServerTimeouts",
    "PostgresqlVirtualNetworkRule",
    "PostgresqlVirtualNetworkRuleConfig",
    "PostgresqlVirtualNetworkRuleTimeouts",
    "PowerbiEmbedded",
    "PowerbiEmbeddedConfig",
    "PowerbiEmbeddedTimeouts",
    "PrivateDnsARecord",
    "PrivateDnsARecordConfig",
    "PrivateDnsARecordTimeouts",
    "PrivateDnsAaaaRecord",
    "PrivateDnsAaaaRecordConfig",
    "PrivateDnsAaaaRecordTimeouts",
    "PrivateDnsCnameRecord",
    "PrivateDnsCnameRecordConfig",
    "PrivateDnsCnameRecordTimeouts",
    "PrivateDnsMxRecord",
    "PrivateDnsMxRecordConfig",
    "PrivateDnsMxRecordRecord",
    "PrivateDnsMxRecordTimeouts",
    "PrivateDnsPtrRecord",
    "PrivateDnsPtrRecordConfig",
    "PrivateDnsPtrRecordTimeouts",
    "PrivateDnsSrvRecord",
    "PrivateDnsSrvRecordConfig",
    "PrivateDnsSrvRecordRecord",
    "PrivateDnsSrvRecordTimeouts",
    "PrivateDnsTxtRecord",
    "PrivateDnsTxtRecordConfig",
    "PrivateDnsTxtRecordRecord",
    "PrivateDnsTxtRecordTimeouts",
    "PrivateDnsZone",
    "PrivateDnsZoneConfig",
    "PrivateDnsZoneSoaRecord",
    "PrivateDnsZoneTimeouts",
    "PrivateDnsZoneVirtualNetworkLink",
    "PrivateDnsZoneVirtualNetworkLinkConfig",
    "PrivateDnsZoneVirtualNetworkLinkTimeouts",
    "PrivateEndpoint",
    "PrivateEndpointConfig",
    "PrivateEndpointCustomDnsConfigs",
    "PrivateEndpointPrivateDnsZoneConfigs",
    "PrivateEndpointPrivateDnsZoneConfigsRecordSets",
    "PrivateEndpointPrivateDnsZoneGroup",
    "PrivateEndpointPrivateServiceConnection",
    "PrivateEndpointTimeouts",
    "PrivateLinkService",
    "PrivateLinkServiceConfig",
    "PrivateLinkServiceNatIpConfiguration",
    "PrivateLinkServiceTimeouts",
    "ProximityPlacementGroup",
    "ProximityPlacementGroupConfig",
    "ProximityPlacementGroupTimeouts",
    "PublicIp",
    "PublicIpConfig",
    "PublicIpPrefix",
    "PublicIpPrefixConfig",
    "PublicIpPrefixTimeouts",
    "PublicIpTimeouts",
    "RecoveryServicesVault",
    "RecoveryServicesVaultConfig",
    "RecoveryServicesVaultIdentity",
    "RecoveryServicesVaultTimeouts",
    "RedisCache",
    "RedisCacheConfig",
    "RedisCachePatchSchedule",
    "RedisCacheRedisConfiguration",
    "RedisCacheTimeouts",
    "RedisFirewallRule",
    "RedisFirewallRuleConfig",
    "RedisFirewallRuleTimeouts",
    "RedisLinkedServer",
    "RedisLinkedServerConfig",
    "RedisLinkedServerTimeouts",
    "RelayHybridConnection",
    "RelayHybridConnectionConfig",
    "RelayHybridConnectionTimeouts",
    "RelayNamespace",
    "RelayNamespaceConfig",
    "RelayNamespaceTimeouts",
    "ResourceGroup",
    "ResourceGroupConfig",
    "ResourceGroupTemplateDeployment",
    "ResourceGroupTemplateDeploymentConfig",
    "ResourceGroupTemplateDeploymentTimeouts",
    "ResourceGroupTimeouts",
    "ResourceProviderRegistration",
    "ResourceProviderRegistrationConfig",
    "ResourceProviderRegistrationTimeouts",
    "RoleAssignment",
    "RoleAssignmentConfig",
    "RoleAssignmentTimeouts",
    "RoleDefinition",
    "RoleDefinitionConfig",
    "RoleDefinitionPermissions",
    "RoleDefinitionTimeouts",
    "Route",
    "RouteConfig",
    "RouteFilter",
    "RouteFilterConfig",
    "RouteFilterRule",
    "RouteFilterTimeouts",
    "RouteTable",
    "RouteTableConfig",
    "RouteTableRoute",
    "RouteTableTimeouts",
    "RouteTimeouts",
    "SearchService",
    "SearchServiceConfig",
    "SearchServiceIdentity",
    "SearchServiceQueryKeys",
    "SearchServiceTimeouts",
    "SecurityCenterAutoProvisioning",
    "SecurityCenterAutoProvisioningConfig",
    "SecurityCenterAutoProvisioningTimeouts",
    "SecurityCenterAutomation",
    "SecurityCenterAutomationAction",
    "SecurityCenterAutomationConfig",
    "SecurityCenterAutomationSource",
    "SecurityCenterAutomationSourceRuleSet",
    "SecurityCenterAutomationSourceRuleSetRule",
    "SecurityCenterAutomationTimeouts",
    "SecurityCenterContact",
    "SecurityCenterContactConfig",
    "SecurityCenterContactTimeouts",
    "SecurityCenterSetting",
    "SecurityCenterSettingConfig",
    "SecurityCenterSettingTimeouts",
    "SecurityCenterSubscriptionPricing",
    "SecurityCenterSubscriptionPricingConfig",
    "SecurityCenterSubscriptionPricingTimeouts",
    "SecurityCenterWorkspace",
    "SecurityCenterWorkspaceConfig",
    "SecurityCenterWorkspaceTimeouts",
    "SentinelAlertRuleMsSecurityIncident",
    "SentinelAlertRuleMsSecurityIncidentConfig",
    "SentinelAlertRuleMsSecurityIncidentTimeouts",
    "SentinelAlertRuleScheduled",
    "SentinelAlertRuleScheduledConfig",
    "SentinelAlertRuleScheduledTimeouts",
    "ServiceFabricCluster",
    "ServiceFabricClusterAzureActiveDirectory",
    "ServiceFabricClusterCertificate",
    "ServiceFabricClusterCertificateCommonNames",
    "ServiceFabricClusterCertificateCommonNamesCommonNames",
    "ServiceFabricClusterClientCertificateCommonName",
    "ServiceFabricClusterClientCertificateThumbprint",
    "ServiceFabricClusterConfig",
    "ServiceFabricClusterDiagnosticsConfig",
    "ServiceFabricClusterFabricSettings",
    "ServiceFabricClusterNodeType",
    "ServiceFabricClusterNodeTypeApplicationPorts",
    "ServiceFabricClusterNodeTypeEphemeralPorts",
    "ServiceFabricClusterReverseProxyCertificate",
    "ServiceFabricClusterTimeouts",
    "ServiceFabricMeshApplication",
    "ServiceFabricMeshApplicationConfig",
    "ServiceFabricMeshApplicationService",
    "ServiceFabricMeshApplicationServiceCodePackage",
    "ServiceFabricMeshApplicationServiceCodePackageResources",
    "ServiceFabricMeshApplicationServiceCodePackageResourcesLimits",
    "ServiceFabricMeshApplicationServiceCodePackageResourcesRequests",
    "ServiceFabricMeshApplicationTimeouts",
    "ServiceFabricMeshLocalNetwork",
    "ServiceFabricMeshLocalNetworkConfig",
    "ServiceFabricMeshLocalNetworkTimeouts",
    "ServiceFabricMeshSecret",
    "ServiceFabricMeshSecretConfig",
    "ServiceFabricMeshSecretTimeouts",
    "ServiceFabricMeshSecretValue",
    "ServiceFabricMeshSecretValueConfig",
    "ServiceFabricMeshSecretValueTimeouts",
    "ServicebusNamespace",
    "ServicebusNamespaceAuthorizationRule",
    "ServicebusNamespaceAuthorizationRuleConfig",
    "ServicebusNamespaceAuthorizationRuleTimeouts",
    "ServicebusNamespaceConfig",
    "ServicebusNamespaceNetworkRuleSet",
    "ServicebusNamespaceNetworkRuleSetConfig",
    "ServicebusNamespaceNetworkRuleSetNetworkRules",
    "ServicebusNamespaceNetworkRuleSetTimeouts",
    "ServicebusNamespaceTimeouts",
    "ServicebusQueue",
    "ServicebusQueueAuthorizationRule",
    "ServicebusQueueAuthorizationRuleConfig",
    "ServicebusQueueAuthorizationRuleTimeouts",
    "ServicebusQueueConfig",
    "ServicebusQueueTimeouts",
    "ServicebusSubscription",
    "ServicebusSubscriptionConfig",
    "ServicebusSubscriptionRule",
    "ServicebusSubscriptionRuleConfig",
    "ServicebusSubscriptionRuleCorrelationFilter",
    "ServicebusSubscriptionRuleTimeouts",
    "ServicebusSubscriptionTimeouts",
    "ServicebusTopic",
    "ServicebusTopicAuthorizationRule",
    "ServicebusTopicAuthorizationRuleConfig",
    "ServicebusTopicAuthorizationRuleTimeouts",
    "ServicebusTopicConfig",
    "ServicebusTopicTimeouts",
    "SharedImage",
    "SharedImageConfig",
    "SharedImageGallery",
    "SharedImageGalleryConfig",
    "SharedImageGalleryTimeouts",
    "SharedImageIdentifier",
    "SharedImagePurchasePlan",
    "SharedImageTimeouts",
    "SharedImageVersion",
    "SharedImageVersionConfig",
    "SharedImageVersionTargetRegion",
    "SharedImageVersionTimeouts",
    "SignalrService",
    "SignalrServiceConfig",
    "SignalrServiceCors",
    "SignalrServiceFeatures",
    "SignalrServiceSku",
    "SignalrServiceTimeouts",
    "SiteRecoveryFabric",
    "SiteRecoveryFabricConfig",
    "SiteRecoveryFabricTimeouts",
    "SiteRecoveryNetworkMapping",
    "SiteRecoveryNetworkMappingConfig",
    "SiteRecoveryNetworkMappingTimeouts",
    "SiteRecoveryProtectionContainer",
    "SiteRecoveryProtectionContainerConfig",
    "SiteRecoveryProtectionContainerMapping",
    "SiteRecoveryProtectionContainerMappingConfig",
    "SiteRecoveryProtectionContainerMappingTimeouts",
    "SiteRecoveryProtectionContainerTimeouts",
    "SiteRecoveryReplicatedVm",
    "SiteRecoveryReplicatedVmConfig",
    "SiteRecoveryReplicatedVmManagedDisk",
    "SiteRecoveryReplicatedVmNetworkInterface",
    "SiteRecoveryReplicatedVmTimeouts",
    "SiteRecoveryReplicationPolicy",
    "SiteRecoveryReplicationPolicyConfig",
    "SiteRecoveryReplicationPolicyTimeouts",
    "Snapshot",
    "SnapshotConfig",
    "SnapshotEncryptionSettings",
    "SnapshotEncryptionSettingsDiskEncryptionKey",
    "SnapshotEncryptionSettingsKeyEncryptionKey",
    "SnapshotTimeouts",
    "SpatialAnchorsAccount",
    "SpatialAnchorsAccountConfig",
    "SpatialAnchorsAccountTimeouts",
    "SpringCloudApp",
    "SpringCloudAppConfig",
    "SpringCloudAppIdentity",
    "SpringCloudAppTimeouts",
    "SpringCloudCertificate",
    "SpringCloudCertificateConfig",
    "SpringCloudCertificateTimeouts",
    "SpringCloudService",
    "SpringCloudServiceConfig",
    "SpringCloudServiceConfigServerGitSetting",
    "SpringCloudServiceConfigServerGitSettingHttpBasicAuth",
    "SpringCloudServiceConfigServerGitSettingRepository",
    "SpringCloudServiceConfigServerGitSettingRepositoryHttpBasicAuth",
    "SpringCloudServiceConfigServerGitSettingRepositorySshAuth",
    "SpringCloudServiceConfigServerGitSettingSshAuth",
    "SpringCloudServiceNetwork",
    "SpringCloudServiceTimeouts",
    "SpringCloudServiceTrace",
    "SqlActiveDirectoryAdministrator",
    "SqlActiveDirectoryAdministratorConfig",
    "SqlActiveDirectoryAdministratorTimeouts",
    "SqlDatabase",
    "SqlDatabaseConfig",
    "SqlDatabaseExtendedAuditingPolicy",
    "SqlDatabaseImport",
    "SqlDatabaseThreatDetectionPolicy",
    "SqlDatabaseTimeouts",
    "SqlElasticpool",
    "SqlElasticpoolConfig",
    "SqlElasticpoolTimeouts",
    "SqlFailoverGroup",
    "SqlFailoverGroupConfig",
    "SqlFailoverGroupPartnerServers",
    "SqlFailoverGroupReadWriteEndpointFailoverPolicy",
    "SqlFailoverGroupReadonlyEndpointFailoverPolicy",
    "SqlFailoverGroupTimeouts",
    "SqlFirewallRule",
    "SqlFirewallRuleConfig",
    "SqlFirewallRuleTimeouts",
    "SqlServer",
    "SqlServerConfig",
    "SqlServerExtendedAuditingPolicy",
    "SqlServerIdentity",
    "SqlServerTimeouts",
    "SqlVirtualNetworkRule",
    "SqlVirtualNetworkRuleConfig",
    "SqlVirtualNetworkRuleTimeouts",
    "StackHciCluster",
    "StackHciClusterConfig",
    "StackHciClusterTimeouts",
    "StorageAccount",
    "StorageAccountBlobProperties",
    "StorageAccountBlobPropertiesCorsRule",
    "StorageAccountBlobPropertiesDeleteRetentionPolicy",
    "StorageAccountConfig",
    "StorageAccountCustomDomain",
    "StorageAccountCustomerManagedKey",
    "StorageAccountCustomerManagedKeyConfig",
    "StorageAccountCustomerManagedKeyTimeouts",
    "StorageAccountIdentity",
    "StorageAccountNetworkRules",
    "StorageAccountNetworkRulesA",
    "StorageAccountNetworkRulesAConfig",
    "StorageAccountNetworkRulesTimeouts",
    "StorageAccountQueueProperties",
    "StorageAccountQueuePropertiesCorsRule",
    "StorageAccountQueuePropertiesHourMetrics",
    "StorageAccountQueuePropertiesLogging",
    "StorageAccountQueuePropertiesMinuteMetrics",
    "StorageAccountStaticWebsite",
    "StorageAccountTimeouts",
    "StorageBlob",
    "StorageBlobConfig",
    "StorageBlobTimeouts",
    "StorageContainer",
    "StorageContainerConfig",
    "StorageContainerTimeouts",
    "StorageDataLakeGen2Filesystem",
    "StorageDataLakeGen2FilesystemConfig",
    "StorageDataLakeGen2FilesystemTimeouts",
    "StorageDataLakeGen2Path",
    "StorageDataLakeGen2PathAce",
    "StorageDataLakeGen2PathConfig",
    "StorageDataLakeGen2PathTimeouts",
    "StorageEncryptionScope",
    "StorageEncryptionScopeConfig",
    "StorageEncryptionScopeTimeouts",
    "StorageManagementPolicy",
    "StorageManagementPolicyConfig",
    "StorageManagementPolicyRule",
    "StorageManagementPolicyRuleActions",
    "StorageManagementPolicyRuleActionsBaseBlob",
    "StorageManagementPolicyRuleActionsSnapshot",
    "StorageManagementPolicyRuleFilters",
    "StorageManagementPolicyTimeouts",
    "StorageQueue",
    "StorageQueueConfig",
    "StorageQueueTimeouts",
    "StorageShare",
    "StorageShareAcl",
    "StorageShareAclAccessPolicy",
    "StorageShareConfig",
    "StorageShareDirectory",
    "StorageShareDirectoryConfig",
    "StorageShareDirectoryTimeouts",
    "StorageShareFile",
    "StorageShareFileConfig",
    "StorageShareFileTimeouts",
    "StorageShareTimeouts",
    "StorageSync",
    "StorageSyncCloudEndpoint",
    "StorageSyncCloudEndpointConfig",
    "StorageSyncCloudEndpointTimeouts",
    "StorageSyncConfig",
    "StorageSyncGroup",
    "StorageSyncGroupConfig",
    "StorageSyncGroupTimeouts",
    "StorageSyncTimeouts",
    "StorageTable",
    "StorageTableAcl",
    "StorageTableAclAccessPolicy",
    "StorageTableConfig",
    "StorageTableEntity",
    "StorageTableEntityConfig",
    "StorageTableEntityTimeouts",
    "StorageTableTimeouts",
    "StreamAnalyticsFunctionJavascriptUdf",
    "StreamAnalyticsFunctionJavascriptUdfConfig",
    "StreamAnalyticsFunctionJavascriptUdfInput",
    "StreamAnalyticsFunctionJavascriptUdfOutput",
    "StreamAnalyticsFunctionJavascriptUdfTimeouts",
    "StreamAnalyticsJob",
    "StreamAnalyticsJobConfig",
    "StreamAnalyticsJobTimeouts",
    "StreamAnalyticsOutputBlob",
    "StreamAnalyticsOutputBlobConfig",
    "StreamAnalyticsOutputBlobSerialization",
    "StreamAnalyticsOutputBlobTimeouts",
    "StreamAnalyticsOutputEventhub",
    "StreamAnalyticsOutputEventhubConfig",
    "StreamAnalyticsOutputEventhubSerialization",
    "StreamAnalyticsOutputEventhubTimeouts",
    "StreamAnalyticsOutputMssql",
    "StreamAnalyticsOutputMssqlConfig",
    "StreamAnalyticsOutputMssqlTimeouts",
    "StreamAnalyticsOutputServicebusQueue",
    "StreamAnalyticsOutputServicebusQueueConfig",
    "StreamAnalyticsOutputServicebusQueueSerialization",
    "StreamAnalyticsOutputServicebusQueueTimeouts",
    "StreamAnalyticsOutputServicebusTopic",
    "StreamAnalyticsOutputServicebusTopicConfig",
    "StreamAnalyticsOutputServicebusTopicSerialization",
    "StreamAnalyticsOutputServicebusTopicTimeouts",
    "StreamAnalyticsReferenceInputBlob",
    "StreamAnalyticsReferenceInputBlobConfig",
    "StreamAnalyticsReferenceInputBlobSerialization",
    "StreamAnalyticsReferenceInputBlobTimeouts",
    "StreamAnalyticsStreamInputBlob",
    "StreamAnalyticsStreamInputBlobConfig",
    "StreamAnalyticsStreamInputBlobSerialization",
    "StreamAnalyticsStreamInputBlobTimeouts",
    "StreamAnalyticsStreamInputEventhub",
    "StreamAnalyticsStreamInputEventhubConfig",
    "StreamAnalyticsStreamInputEventhubSerialization",
    "StreamAnalyticsStreamInputEventhubTimeouts",
    "StreamAnalyticsStreamInputIothub",
    "StreamAnalyticsStreamInputIothubConfig",
    "StreamAnalyticsStreamInputIothubSerialization",
    "StreamAnalyticsStreamInputIothubTimeouts",
    "Subnet",
    "SubnetConfig",
    "SubnetDelegation",
    "SubnetDelegationServiceDelegation",
    "SubnetNatGatewayAssociation",
    "SubnetNatGatewayAssociationConfig",
    "SubnetNatGatewayAssociationTimeouts",
    "SubnetNetworkSecurityGroupAssociation",
    "SubnetNetworkSecurityGroupAssociationConfig",
    "SubnetNetworkSecurityGroupAssociationTimeouts",
    "SubnetRouteTableAssociation",
    "SubnetRouteTableAssociationConfig",
    "SubnetRouteTableAssociationTimeouts",
    "SubnetTimeouts",
    "SubscriptionTemplateDeployment",
    "SubscriptionTemplateDeploymentConfig",
    "SubscriptionTemplateDeploymentTimeouts",
    "SynapseFirewallRule",
    "SynapseFirewallRuleConfig",
    "SynapseFirewallRuleTimeouts",
    "SynapseRoleAssignment",
    "SynapseRoleAssignmentConfig",
    "SynapseRoleAssignmentTimeouts",
    "SynapseSparkPool",
    "SynapseSparkPoolAutoPause",
    "SynapseSparkPoolAutoScale",
    "SynapseSparkPoolConfig",
    "SynapseSparkPoolLibraryRequirement",
    "SynapseSparkPoolTimeouts",
    "SynapseSqlPool",
    "SynapseSqlPoolConfig",
    "SynapseSqlPoolRestore",
    "SynapseSqlPoolTimeouts",
    "SynapseWorkspace",
    "SynapseWorkspaceAadAdmin",
    "SynapseWorkspaceConfig",
    "SynapseWorkspaceIdentity",
    "SynapseWorkspaceTimeouts",
    "TemplateDeployment",
    "TemplateDeploymentConfig",
    "TemplateDeploymentTimeouts",
    "TrafficManagerEndpoint",
    "TrafficManagerEndpointConfig",
    "TrafficManagerEndpointCustomHeader",
    "TrafficManagerEndpointSubnet",
    "TrafficManagerEndpointTimeouts",
    "TrafficManagerProfile",
    "TrafficManagerProfileConfig",
    "TrafficManagerProfileDnsConfig",
    "TrafficManagerProfileMonitorConfig",
    "TrafficManagerProfileMonitorConfigCustomHeader",
    "TrafficManagerProfileTimeouts",
    "UserAssignedIdentity",
    "UserAssignedIdentityConfig",
    "UserAssignedIdentityTimeouts",
    "VirtualDesktopApplicationGroup",
    "VirtualDesktopApplicationGroupConfig",
    "VirtualDesktopApplicationGroupTimeouts",
    "VirtualDesktopHostPool",
    "VirtualDesktopHostPoolConfig",
    "VirtualDesktopHostPoolRegistrationInfo",
    "VirtualDesktopHostPoolTimeouts",
    "VirtualDesktopWorkspace",
    "VirtualDesktopWorkspaceApplicationGroupAssociation",
    "VirtualDesktopWorkspaceApplicationGroupAssociationConfig",
    "VirtualDesktopWorkspaceApplicationGroupAssociationTimeouts",
    "VirtualDesktopWorkspaceConfig",
    "VirtualDesktopWorkspaceTimeouts",
    "VirtualHub",
    "VirtualHubBgpConnection",
    "VirtualHubBgpConnectionConfig",
    "VirtualHubBgpConnectionTimeouts",
    "VirtualHubConfig",
    "VirtualHubConnection",
    "VirtualHubConnectionConfig",
    "VirtualHubConnectionRouting",
    "VirtualHubConnectionRoutingPropagatedRouteTable",
    "VirtualHubConnectionRoutingStaticVnetRoute",
    "VirtualHubConnectionTimeouts",
    "VirtualHubIp",
    "VirtualHubIpConfig",
    "VirtualHubIpTimeouts",
    "VirtualHubRoute",
    "VirtualHubRouteTable",
    "VirtualHubRouteTableConfig",
    "VirtualHubRouteTableRoute",
    "VirtualHubRouteTableTimeouts",
    "VirtualHubSecurityPartnerProvider",
    "VirtualHubSecurityPartnerProviderConfig",
    "VirtualHubSecurityPartnerProviderTimeouts",
    "VirtualHubTimeouts",
    "VirtualMachine",
    "VirtualMachineAdditionalCapabilities",
    "VirtualMachineBootDiagnostics",
    "VirtualMachineConfig",
    "VirtualMachineDataDiskAttachment",
    "VirtualMachineDataDiskAttachmentConfig",
    "VirtualMachineDataDiskAttachmentTimeouts",
    "VirtualMachineExtension",
    "VirtualMachineExtensionConfig",
    "VirtualMachineExtensionTimeouts",
    "VirtualMachineIdentity",
    "VirtualMachineOsProfile",
    "VirtualMachineOsProfileLinuxConfig",
    "VirtualMachineOsProfileLinuxConfigSshKeys",
    "VirtualMachineOsProfileSecrets",
    "VirtualMachineOsProfileSecretsVaultCertificates",
    "VirtualMachineOsProfileWindowsConfig",
    "VirtualMachineOsProfileWindowsConfigAdditionalUnattendConfig",
    "VirtualMachineOsProfileWindowsConfigWinrm",
    "VirtualMachinePlan",
    "VirtualMachineScaleSet",
    "VirtualMachineScaleSetBootDiagnostics",
    "VirtualMachineScaleSetConfig",
    "VirtualMachineScaleSetExtension",
    "VirtualMachineScaleSetExtensionA",
    "VirtualMachineScaleSetExtensionAConfig",
    "VirtualMachineScaleSetExtensionTimeouts",
    "VirtualMachineScaleSetIdentity",
    "VirtualMachineScaleSetNetworkProfile",
    "VirtualMachineScaleSetNetworkProfileDnsSettings",
    "VirtualMachineScaleSetNetworkProfileIpConfiguration",
    "VirtualMachineScaleSetNetworkProfileIpConfigurationPublicIpAddressConfiguration",
    "VirtualMachineScaleSetOsProfile",
    "VirtualMachineScaleSetOsProfileLinuxConfig",
    "VirtualMachineScaleSetOsProfileLinuxConfigSshKeys",
    "VirtualMachineScaleSetOsProfileSecrets",
    "VirtualMachineScaleSetOsProfileSecretsVaultCertificates",
    "VirtualMachineScaleSetOsProfileWindowsConfig",
    "VirtualMachineScaleSetOsProfileWindowsConfigAdditionalUnattendConfig",
    "VirtualMachineScaleSetOsProfileWindowsConfigWinrm",
    "VirtualMachineScaleSetPlan",
    "VirtualMachineScaleSetRollingUpgradePolicy",
    "VirtualMachineScaleSetSku",
    "VirtualMachineScaleSetStorageProfileDataDisk",
    "VirtualMachineScaleSetStorageProfileImageReference",
    "VirtualMachineScaleSetStorageProfileOsDisk",
    "VirtualMachineScaleSetTimeouts",
    "VirtualMachineStorageDataDisk",
    "VirtualMachineStorageImageReference",
    "VirtualMachineStorageOsDisk",
    "VirtualMachineTimeouts",
    "VirtualNetwork",
    "VirtualNetworkConfig",
    "VirtualNetworkDdosProtectionPlan",
    "VirtualNetworkGateway",
    "VirtualNetworkGatewayBgpSettings",
    "VirtualNetworkGatewayConfig",
    "VirtualNetworkGatewayConnection",
    "VirtualNetworkGatewayConnectionConfig",
    "VirtualNetworkGatewayConnectionIpsecPolicy",
    "VirtualNetworkGatewayConnectionTimeouts",
    "VirtualNetworkGatewayConnectionTrafficSelectorPolicy",
    "VirtualNetworkGatewayCustomRoute",
    "VirtualNetworkGatewayIpConfiguration",
    "VirtualNetworkGatewayTimeouts",
    "VirtualNetworkGatewayVpnClientConfiguration",
    "VirtualNetworkGatewayVpnClientConfigurationRevokedCertificate",
    "VirtualNetworkGatewayVpnClientConfigurationRootCertificate",
    "VirtualNetworkPeering",
    "VirtualNetworkPeeringConfig",
    "VirtualNetworkPeeringTimeouts",
    "VirtualNetworkSubnet",
    "VirtualNetworkTimeouts",
    "VirtualWan",
    "VirtualWanConfig",
    "VirtualWanTimeouts",
    "VpnGateway",
    "VpnGatewayBgpSettings",
    "VpnGatewayBgpSettingsInstance0BgpPeeringAddress",
    "VpnGatewayBgpSettingsInstance1BgpPeeringAddress",
    "VpnGatewayConfig",
    "VpnGatewayConnection",
    "VpnGatewayConnectionConfig",
    "VpnGatewayConnectionRouting",
    "VpnGatewayConnectionTimeouts",
    "VpnGatewayConnectionVpnLink",
    "VpnGatewayConnectionVpnLinkIpsecPolicy",
    "VpnGatewayTimeouts",
    "VpnServerConfiguration",
    "VpnServerConfigurationAzureActiveDirectoryAuthentication",
    "VpnServerConfigurationClientRevokedCertificate",
    "VpnServerConfigurationClientRootCertificate",
    "VpnServerConfigurationConfig",
    "VpnServerConfigurationIpsecPolicy",
    "VpnServerConfigurationRadius",
    "VpnServerConfigurationRadiusClientRootCertificate",
    "VpnServerConfigurationRadiusServer",
    "VpnServerConfigurationRadiusServerA",
    "VpnServerConfigurationRadiusServerClientRootCertificate",
    "VpnServerConfigurationRadiusServerRootCertificate",
    "VpnServerConfigurationRadiusServerServerRootCertificate",
    "VpnServerConfigurationTimeouts",
    "VpnSite",
    "VpnSiteConfig",
    "VpnSiteLink",
    "VpnSiteLinkBgp",
    "VpnSiteTimeouts",
    "WebApplicationFirewallPolicy",
    "WebApplicationFirewallPolicyConfig",
    "WebApplicationFirewallPolicyCustomRules",
    "WebApplicationFirewallPolicyCustomRulesMatchConditions",
    "WebApplicationFirewallPolicyCustomRulesMatchConditionsMatchVariables",
    "WebApplicationFirewallPolicyManagedRules",
    "WebApplicationFirewallPolicyManagedRulesExclusion",
    "WebApplicationFirewallPolicyManagedRulesManagedRuleSet",
    "WebApplicationFirewallPolicyManagedRulesManagedRuleSetRuleGroupOverride",
    "WebApplicationFirewallPolicyPolicySettings",
    "WebApplicationFirewallPolicyTimeouts",
    "WindowsVirtualMachine",
    "WindowsVirtualMachineAdditionalCapabilities",
    "WindowsVirtualMachineAdditionalUnattendContent",
    "WindowsVirtualMachineBootDiagnostics",
    "WindowsVirtualMachineConfig",
    "WindowsVirtualMachineIdentity",
    "WindowsVirtualMachineOsDisk",
    "WindowsVirtualMachineOsDiskDiffDiskSettings",
    "WindowsVirtualMachinePlan",
    "WindowsVirtualMachineScaleSet",
    "WindowsVirtualMachineScaleSetAdditionalCapabilities",
    "WindowsVirtualMachineScaleSetAdditionalUnattendContent",
    "WindowsVirtualMachineScaleSetAutomaticInstanceRepair",
    "WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy",
    "WindowsVirtualMachineScaleSetBootDiagnostics",
    "WindowsVirtualMachineScaleSetConfig",
    "WindowsVirtualMachineScaleSetDataDisk",
    "WindowsVirtualMachineScaleSetExtension",
    "WindowsVirtualMachineScaleSetIdentity",
    "WindowsVirtualMachineScaleSetNetworkInterface",
    "WindowsVirtualMachineScaleSetNetworkInterfaceIpConfiguration",
    "WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddress",
    "WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationPublicIpAddressIpTag",
    "WindowsVirtualMachineScaleSetOsDisk",
    "WindowsVirtualMachineScaleSetOsDiskDiffDiskSettings",
    "WindowsVirtualMachineScaleSetPlan",
    "WindowsVirtualMachineScaleSetRollingUpgradePolicy",
    "WindowsVirtualMachineScaleSetSecret",
    "WindowsVirtualMachineScaleSetSecretCertificate",
    "WindowsVirtualMachineScaleSetSourceImageReference",
    "WindowsVirtualMachineScaleSetTerminateNotification",
    "WindowsVirtualMachineScaleSetTimeouts",
    "WindowsVirtualMachineScaleSetWinrmListener",
    "WindowsVirtualMachineSecret",
    "WindowsVirtualMachineSecretCertificate",
    "WindowsVirtualMachineSourceImageReference",
    "WindowsVirtualMachineTimeouts",
    "WindowsVirtualMachineWinrmListener",
]

publication.publish()
